实现cartographer建图与导航[1](2021.01.25)
为了能和读者进一步讨论问题,建立了一个微信群,方便给大家解答问题,也可以一起讨论问题。
加群链接
注意:
- 再学习本系列教程时,应该已经安装过ROS了并且需要有一些ROS的基本知识
webots版本:2020b rev1
ros版本:melodic
1.前言
花了将近3-4天时间完成了Cartographer在ROS1和Webots之间的移植。baidu+google了很多资料,发现各大仿真软件中都有前人移植过的例子,但是在ROS1和Webots之间没有先例,所以只能笔者自己移植。
在这几天也花了点时间看了2016年谷歌发表的Cartographer论文《Real-Time Loop Closure in 2D LIDAR SLAM》,下面简单介绍一下这个算法。
2.cartographer 算法
2016年谷歌推出了Cartographer。当时,谷歌制作了一个背包,将传感器安装在背包上,使用Cartographer算法由实验人员在室内行走,便可以同时绘测室内的二维地图或三维地图。一开始并不是在ROS系统中使用,经过开发者移植后创建了一个名为cartographer_ros 可在 ROS 系统中使用的功能包。cartographer 包是该理论的底层使用,负责通过整合多种传感器的数据来搭建地图,cartographer_ros是上层应用,负责获取符合ROS通信机制的传感器数据转换成底层使用的格式来处理。
有关Cartographer算法的一些细节还是去看谷歌发表的论文比较好,也有大佬翻译好的:Google Cartographer 《Real-Time Loop Closure in 2D LIDAR SLAM》翻译 (中英对照)
2.1 Cartographer 算法原理
该算法可以通过激光测距仪等传感器测量的数据生成分辨率为5cm的实时栅格地图。Cartographer采用基于图优化方法的SLAM理论框架,分为前端和后端两部分:前端主要负责Scan-to-Submap和回环检测,将处理后的激光雷达数据与子图进行匹配,同时当生成一个子图且没有新的数据帧插入的时候会进行局部回环检测。子图创建完成后,如果找到了与当前估计位姿最佳的匹配结果,则将其添加到回环约束中。后端主要负责对位姿估计进行优化,采用分支定界和预先计算的网格来实现全局闭环检测。
2.2 什么是图优化SLAM算法
基于图优化SLAM算法与基于滤波方法的思路完全不同,它不再只修正机器人当前时刻的位姿,使当前时刻的位姿尽可能的准确,还通过回环检测等来优化之前时刻的机器人位姿。图优化SLAM算法的基本思路是利用保存的所有传感器测量信息以及它们之间的空间约束关系,通过各个位姿间的约束关系来对移动机器人的运动轨迹及地图进行估计。这种方法用节点来代表移动机器人的位姿,而图中节点之间的边代表位姿间的空间约束关系,所得到的图被称为位姿图。在完成位姿图的构造后,通过对位姿序列进行调整,使其能够最优地满足边所表示的约束关系,优化后的结果即为机器人的运动轨迹及地图。
2.安装Cartographer
好了,理论的东西不讲太多,直接开始安装。
在之前我就写过一篇有关安装Cartographer,并且成功测试过的博客,主要安装测试过程都在这篇博客上面:Ubuntu 18.04 安装cartographer
3.在自己的机器人上使用Cartographer
我想大家在第二节已经能够成功安装cartographer包了,仿真数据跑成功后,就要用自己的机器人跑算法了。一般来说,跑仿真数据或者跑demo很容易,只要照着教程一步一步来,基本都能成功建图,但是跑自己的机器人就会因为各种问题导致崩溃啦~~~不过大家不用怕,跟着笔者一定能在webots下跑通Cartographer。
3.1 修改launch文件
因为我们的机器人是两轮差动式的,所以看了一下只有cartographer_ros/launch/demo_revo_lds.launch这个启动文件符合。
官方的demo_revo_lds.launch文件如下:
<launch>
<param name="/use_sim_time" value="true" />
<!-- 因为cartographer使用的是lua作为配置文件,而且我们是以双轮差速型小车作为基础的,所以使用revo_lds.lua -->
<node name="cartographer_node" pkg="cartographer_ros"
type="cartographer_node" args="
-configuration_directory $(find cartographer_ros)/configuration_files
-configuration_basename revo_lds.lua"
output="screen">
<!-- 将from=“scan” to后面的内容换成自己激光雷达发布的激光topic -->
<remap from="scan" to="/volcano/Sick_LMS_291/laser_scan/layer0" />
</node>
<!-- 这个包是用来建图的 -->
<node name="cartographer_occupancy_grid_node" pkg="cartographer_ros"
type="cartographer_occupancy_grid_node" args="-resolution 0.05" />
<node name="rviz" pkg="rviz" type="rviz" required="true"

本文介绍了如何在ROS Melodic和Webots环境下实现Cartographer的安装、配置与应用,包括修改launch文件、lua配置文件以适配不同传感器数据,以及通过激光雷达和里程计数据进行实时建图和导航。通过实操解决建图过程中出现的问题,如位姿不稳定,探讨了如何通过调整机器人布局和控制方式减少累计误差。
最低0.47元/天 解锁文章
3505

被折叠的 条评论
为什么被折叠?



