ROS技术空间

ROS SLAM 4 | SLAM – 使用谷歌Cartographer 建图

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地图。

  1. 方法一 – 使用map_server保存地图
roslaunch lingao_slam save_map.launch 

或者直接使用map_server服务保存在目录下:

roscd lingao_navigation/maps/
rosrun map_server map_saver -f map


  1. 方法二 – 序列化保存当前状态(地图保存为.pbstream形式):
    必须要绝对路径
    rosservice call /write_state "{filename: '<绝对路径存放地图信息>/<地图保存的名字>.pbstream'}"
    ,例如:
rosservice call /write_state "{filename: '${HOME}/lingao_ws/src/lingaoRobot/lingao_navigation/maps/cartographer_map.pbstream'}"

例如:

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