SLAM – 使用谷歌Cartographer 建图
cartographer是Google的实时室内建图项目,只要满足性能要求可建设地图比gmapping大,可单独使用雷达建图而不依赖里程计,因此比较依赖雷达,雷达扫描频率大于20HZ效果更好。
Cartographer算法优缺点
cartographer通过一定雷达数量的laser scan构建子地图submap,通过拼接地图从而实现回环检测,在生成一个submap后,会进行一次局部的回环(loop close),利用分支定位和预先计算的网格,所有submap完成后,会进行全局的回环。
缺点:CPU性能要求比gmapping高,特别是大范围时候。对雷达扫描频率越高越好,最好是20HZ+。
图:cartographer建图
启动底盘通讯与雷达
在主控节点启动与底盘余雷达的通讯,同时程序会将IMU姿态与位置融合发布odom位置信息
roslaunch lingao_bringup robot.launch
等待IMU校准后出现First IMU message received
并且没有错误基本上就是启动成功
启动cartographer建图
启动cartographer节点,加入里程计和IMU。
roslaunch lingao_slam cartographer_slam.launch
通过图片可看到下图无错误,出现odom received既是启动成功
启动本地可视化rviz
在本地PC主机启动rviz在窗口内可看到机器人tf位姿数据、激光节点、地图数据
roscd lingao_slam/rviz/
rviz -d cartographer_2d.rviz
现在开始建图,使用航模手柄或者键盘控制小车走进行建图。
保存地图
首先完成轨迹, 不接受进一步的数据。(主控节点输入)
rosservice call /finish_trajectory 0
现在有两种保存地图方法
* 第一种 直接转换生成为map_server可加载的pgm地图,后期不能转回.pbstream文件格式.
* 第二种 保存为cartographer序列化的.pbstream文件格式,其中包含cartographer内部使用的数据结构的快照。后面可转换为map_server可加载的pgm地图。
- 方法一 – 使用map_server保存地图
roslaunch lingao_slam save_map.launch
或者直接使用map_server服务保存在目录下:
roscd lingao_navigation/maps/
rosrun map_server map_saver -f map
- 方法二 – 序列化保存当前状态(地图保存为.pbstream形式):
必须要绝对路径
rosservice call /write_state "{filename: '<绝对路径存放地图信息>/<地图保存的名字>.pbstream'}"
,例如:
rosservice call /write_state "{filename: '${HOME}/lingao_ws/src/lingaoRobot/lingao_navigation/maps/cartographer_map.pbstream'}"
- 转换成map_server可加载的pgm地图方法:
rosrun cartographer_ros cartographer_pbstream_to_ros_map
-map_filestem=<保存地图的绝对路径>/<地图命名>
-pbstream_filename=<存放pbstream地图快照信息的绝对地址>/.pbstream
-resolution=0.05
例如:
rosrun cartographer_ros cartographer_pbstream_to_ros_map -map_filestem={HOME}/lingao_ws/src/lingaoRobot/lingao_navigation/maps/map -pbstream_filename={HOME}/lingao_ws/src/lingaoRobot/lingao_navigation/maps/cartographer_map.pbstream -resolution=0.05