breezyslam建图2d-slam建图测试一
这篇文章是基于breezyslam 建图的后续,对breezyslam的建图进行测试,
使用树莓派3B+思兰激光雷达,
使用Python的所有库,所有库的安装和记录请查看这篇文章
教程四:树莓派搭建breezyslam环境的说明
http://blog.cvosrobot.com/?post=486
笔者编写了下面的脚本
#!/usr/bin/env python3
'''
rpslam_vos.py : BreezySLAM Python with SLAMTECH RP A1 Lidar
Copyright (C) 2018 Simon D. Levy
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/>.
'''
MAP_SIZE_PIXELS = 500
MAP_SIZE_METERS = 10
LIDAR_DEVICE = '/dev/rplidar'
# Ideally we could use all 250 or so samples that the RPLidar delivers in one
# scan, but on slower computers you'll get an empty map and unchanging position
# at that rate.
MIN_SAMPLES = 180
import sys
import os
import time
from breezyslam.algorithms import RMHC_SLAM
from breezyslam.sensors import RPLidarA1 as LaserModel
from rplidar import RPLidar as Lidar
from roboviz import MapVisualizer
from rplidar import RPLidarException
if __name__ == '__main__':
# Connect to Lidar unit until lidar is normal
berror = True
while berror == True:
lidar = Lidar(LIDAR_DEVICE)
try:
info = lidar.get_info()
berror = False
except RPLidarException as err:
print(err)
time.sleep(1)
berror = True
lidar.stop()
lidar.disconnect()
pass
# print lidar information
print(info)
#print lidar health status
health = lidar.get_health()
print("health status:")
print(health)
# Create an RMHC SLAM object with a laser model and optional robot model
slam = RMHC_SLAM(LaserModel(), MAP_SIZE_PIXELS, MAP_SIZE_METERS)
# Set up a SLAM display
viz = MapVisualizer(MAP_SIZE_PIXELS, MAP_SIZE_METERS, 'VosSLAM')
# Initialize an empty trajectory
trajectory = []
# Initialize empty map
mapbytes = bytearray(MAP_SIZE_PIXELS * MAP_SIZE_PIXELS)
# Create an iterator to collect scan data from the RPLidar
# iterator = lidar.iter_scans()
# We will use these to store previous scan in case current scan is inadequate
previous_distances = None
previous_angles = None
# First scan is crap, so ignore it
# next(iterator)
while True:
for i,scan in enumerate(lidar.iter_scans()):
print('%d: Got %d measurments' % (i, len(scan)))
if i > 0:
distances = [item[2] for item in scan]
angles = [item[1] for item in scan]
# Update SLAM with current Lidar scan and scan angles if adequate
slam.update(distances, scan_angles_degrees=angles)
# Get current robot position
x, y, theta = slam.getpos()
# Get current map bytes as grayscale
slam.getmap(mapbytes)
# Display map and robot pose, exiting gracefully if user closes it
if not viz.display(x/1000., y/1000., theta, mapbytes):
exit(0)
# Extract distances and angles from triples
# Shut down the lidar connection
lidar.stop()
lidar.disconnect()
python3 rpslam_vos.py
Incorrect descriptor starting bytes
{'model': 24, 'hardware': 0, 'firmware': (1, 18), 'serialnumber': '5CB4FBF2C8E49CCFC6E49FF1A266530D'}
health status:
('Good', 0)
0: Got 140 measurments
1: Got 210 measurments
2: Got 208 measurments
3: Got 207 measurments
4: Got 213 measurments
5: Got 212 measurments
6: Got 212 measurments
7: Got 213 measurments
8: Got 207 measurments
9: Got 214 measurments
10: Got 218 measurments
11: Got 214 measurments
12: Got 211 measurments
13: Got 209 measurments
14: Got 214 measurments
15: Got 215 measurments
16: Got 210 measurments
17: Got 211 measurments
18: Got 214 measurments
19: Got 214 measurments
20: Got 212 measurments
21: Got 214 measurments
22: Got 206 measurments
23: Got 215 measurments
24: Got 216 measurments
25: Got 211 measurments
26: Got 213 measurments
27: Got 209 measurments
28: Got 211 measurments
29: Got 208 measurments
30: Got 206 measurments
31: Got 215 measurments
32: Got 207 measurments
33: Got 205 measurments
34: Got 215 measurments
在测试过程发现,思兰的激光雷达供电不足导致读取数据失败。所以树莓派的供电一定要足。
下图是测试场景。
从图中可以看到基本是没有变化,可以看出 没怎么变化,所以怀疑还是得用到odom 或者预估odom的开关没打开。
待看下次测试。








最新评论
x_mm, y_mm, theta_degrees = slam.getpos()
# Add new position to trajectory
trajectory.append((x_mm, y_mm))