Create mines.py
This commit is contained in:
122
examples/mines.py
Normal file
122
examples/mines.py
Normal file
@@ -0,0 +1,122 @@
|
|||||||
|
'''
|
||||||
|
mines.py - classes for the SLAM apparatus used at Paris Mines Tech
|
||||||
|
|
||||||
|
For details see
|
||||||
|
|
||||||
|
@inproceedings{coreslam-2010,
|
||||||
|
author = {Bruno Steux and Oussama El Hamzaoui},
|
||||||
|
title = {CoreSLAM: a SLAM Algorithm in less than 200 lines of C code},
|
||||||
|
booktitle = {11th International Conference on Control, Automation,
|
||||||
|
Robotics and Vision, ICARCV 2010, Singapore, 7-10
|
||||||
|
December 2010, Proceedings},
|
||||||
|
pages = {1975-1979},
|
||||||
|
publisher = {IEEE},
|
||||||
|
year = {2010}
|
||||||
|
}
|
||||||
|
|
||||||
|
Copyright (C) 2014 Simon D. Levy
|
||||||
|
|
||||||
|
This code is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU Lesser General Public License as
|
||||||
|
published by the Free Software Foundation, either version 3 of the
|
||||||
|
License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This code is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public License
|
||||||
|
along with this code. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
'''
|
||||||
|
|
||||||
|
from breezyslam.robots import WheeledRobot
|
||||||
|
from breezyslam.components import URG04LX
|
||||||
|
|
||||||
|
import math
|
||||||
|
|
||||||
|
|
||||||
|
# Method to load all from file ------------------------------------------------
|
||||||
|
# Each line in the file has the format:
|
||||||
|
#
|
||||||
|
# TIMESTAMP ... Q1 Q1 ... Distances
|
||||||
|
# (usec) (mm)
|
||||||
|
# 0 ... 2 3 ... 24 ...
|
||||||
|
#
|
||||||
|
#where Q1, Q2 are odometry values
|
||||||
|
|
||||||
|
def load_data(datadir, dataset):
|
||||||
|
|
||||||
|
filename = '%s/%s.dat' % (datadir, dataset)
|
||||||
|
print('Loading data from %s...' % filename)
|
||||||
|
|
||||||
|
fd = open(filename, 'rt')
|
||||||
|
|
||||||
|
timestamps = []
|
||||||
|
scans = []
|
||||||
|
odometries = []
|
||||||
|
|
||||||
|
while True:
|
||||||
|
|
||||||
|
s = fd.readline()
|
||||||
|
|
||||||
|
if len(s) == 0:
|
||||||
|
break
|
||||||
|
|
||||||
|
toks = s.split()[0:-1] # ignore ''
|
||||||
|
|
||||||
|
odometry = (int(toks[0]), int(toks[2]), int(toks[3]))
|
||||||
|
|
||||||
|
lidar = [int(tok) for tok in toks[24:]]
|
||||||
|
|
||||||
|
scans.append(lidar)
|
||||||
|
odometries.append(odometry)
|
||||||
|
|
||||||
|
fd.close()
|
||||||
|
|
||||||
|
return scans, odometries
|
||||||
|
|
||||||
|
class MinesLaser(URG04LX):
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
|
||||||
|
URG04LX.__init__(self, 70, 145)
|
||||||
|
|
||||||
|
# Class for MinesRover custom robot ------------------------------------------
|
||||||
|
|
||||||
|
class Rover(WheeledRobot):
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
|
||||||
|
WheeledRobot.__init__(self, 77, 165)
|
||||||
|
|
||||||
|
self.ticks_per_cycle = 2000
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
|
||||||
|
return '<%s ticks_per_cycle=%d>' % (WheeledRobot.__str__(self), self.ticks_per_cycle)
|
||||||
|
|
||||||
|
def computeVelocities(self, odometry):
|
||||||
|
|
||||||
|
return WheeledRobot.computeVelocities(self, odometry[0], odometry[1], odometry[2])
|
||||||
|
|
||||||
|
def extractOdometry(self, timestamp, leftWheel, rightWheel):
|
||||||
|
|
||||||
|
# Convert microseconds to seconds, ticks to angles
|
||||||
|
return timestamp / 1e6, \
|
||||||
|
self._ticks_to_degrees(leftWheel), \
|
||||||
|
self._ticks_to_degrees(rightWheel)
|
||||||
|
|
||||||
|
def odometryStr(self, odometry):
|
||||||
|
|
||||||
|
return '<timestamp=%d usec leftWheelTicks=%d rightWheelTicks=%d>' % \
|
||||||
|
(odometry[0], odometry[1], odometry[2])
|
||||||
|
|
||||||
|
def _ticks_to_degrees(self, ticks):
|
||||||
|
|
||||||
|
return ticks * (180. / self.ticks_per_cycle)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Reference in New Issue
Block a user