2D SLAM – 使用Gmapping雷达建图
地图是导航必要的节点,在ROS上面常见有四种二维SLAM建图方式,它们分别是gmapping、谷歌cartographer、hector、Karto,每种算法都有不同的优缺点,感兴趣可以看看这里的SLAM算法对比。
对于硬件要求我们使用灵遨科技灵风底盘,这款底盘电机采用光电编码器方案,为里程计提供精确的位置。
Gmapping算法优缺点
优点:是在构建小场景地图所需的计算量较小且精度较高,相比Cartographer在构建小场景地图时,Gmapping不需要太多的粒子并且没有回环检测因此计算量小于Cartographer而精度并没有差太多。并且CPU资源消耗比Cartographer小。
缺点:随着场景增大所需的粒子增加,因为每个粒子都携带一幅地图,因此在构建大地图时所需内存和计算量都会增加。因此不适合构建大场景地图。并且没有回环检测,因此在回环闭合时可能会造成地图错位,虽然增加粒子数目可以使地图闭合但是以增加计算量和内存为代价。
测试gmapping程序发现:采用同样的数据集,生成5cm的地图没压力,3cm地图就会扭曲;在生成5cm地图时,增加粒子数量,生成的地图非但没有变好,反而不能成图。
问题的关键在计算量,gmapping为单线程程序,多核cpu不起作用。计算量与地图分辨率、粒子数成正比,分辨率越大、粒子数越多,cpu占用率越高。cpu的高负荷导致一次数据处理的时间变长,从而导致部分数据得不到处理。cpu负荷越高,遗漏的数据越多,造成状态估计的不连续。这就是为什么随着粒子数的增加或地图分辨率的提高,会出现地图扭曲、未知区域变大、直接拼图失败等现象。
启动底盘通讯与雷达节点
在主控节点启动与底盘的通讯与雷达,同时程序会将IMU姿态与位置融合发布odom位置信息
roslaunch lingao_bringup robot.launch
等待IMU校准后出现First IMU message received
并且没有错误基本上就是启动成功
启动Gmapping建图
在主控节点启动雷达与Gmapping节点
roslaunch lingao_slam slam.launch
通过图片可看到下图无错误既是启动成功,有时候Rplidar因为电流问题会启动失败,需要重新执行命令。
启动本地可视化rviz
在本地PC主机启动rviz在窗口内可看到机器人tf位姿数据、激光节点、地图数据
roscd lingao_slam/rviz/
rviz -d slam.rviz
现在开始建图,使用航模手柄或者键盘控制小车走进行建图。
保存地图
保存地图使用以下命令(在主控节点输入),以下任选一个
- 快捷保存地图
roslaunch lingao_slam save_map.launch
默认地图名为map
- 快捷保存地图为其他名字
roslaunch lingao_slam save_map.launch map_name:=map2
保存名字为map2的地图
- 或者直接使用map_server服务保存在目录下:
roscd lingao_navigation/maps/
rosrun map_server map_saver -f map
-f map,参数map为地图名
保存地图后可看到map.pgm和map.yaml文件就是本次建的地图
结束建图在开启建图的终端下ctrl+c
取消即可