slam算法对照
通过麦克纳姆轮机器人小车构建地图对比Gmapping、Hector、Karto、Cartographer四种算法的优缺点
真实场景图如下图所示:
具体步骤为:
1、打开地图构建命令
roslaunch turn_on_wheeltec_robot mapping.launch
2、打开rviz
rviz
3、打开控制小车命令(手柄、键盘)
roslaunch wheeltec_robot_rc keyboard_teleop.launch
4、进行地图构建然后自定义保存
rosrun map_server map_saver -f 地图名
一、Gmapping算法
Gmapping算法框架是基于RBPF粒子滤波算法,先进行定位再进行建图,Gmapping在RBPF算法上做了两个主要的改进:改进提议分布和选择性重采样。
RBPF是用来解决SLAM问题,就是先进行定位再进行建图。RBPF的主要问题在于其复杂度高,因为需要较多的粒子来构建地图并频繁执行重采样。我们已知粒子数和计算量内存消耗息息相关,粒子数目较大会造成算法复杂度增高。因此减少粒子数是RBPF算法改进的方向之一;同时由于RBPF频繁执行重采样会造成粒子退化。因此减少重采样次数是RBPF算法的另一个改进方向。
RBPF是一种有效解决同时定位和建图的算法,它将定位和建图分离;并且每一个粒子都携带一幅地图(这也是粒子滤波不适合构建大地图的原因之一)。但PBPF也存在缺点:所用粒子数多和频繁执行重采样。粒子数多会造成计算量和内存消耗变大;频繁执行重采样会造成粒子退化。因此Gmapping在RBPF的基础上改进提议分布和选择性重采样,从而减少粒子个数和防止粒子退化。改进的提议分布不但考虑运动(里程计)信息还考虑最近的一次观测(激光)信息这样就可以使提议分布的更加精确从而更加接近目标分布。选择性重采样通过设定阈值,只有在粒子权重变化超过阈值时才执行重采样从而大大减少重采样的次数。
优点:
Gmapping可以实时构建室内地图,在构建小场景地图所需的计算量较小且精度较高。相比Hector SLAM对激光雷达频率要求低、鲁棒性高;而相比Cartographer在构建小场景地图时,Gmapping不需要太多的粒子并且没有回环检测因此计算量小于Cartographer而精度并没有差太多。Gmapping有效利用了车轮里程计信息,这也是Gmapping对激光雷达频率要求低的原因:里程计可以提供机器人的位姿先验。而Hector和Cartographer的设计初衷不是为了解决平面移动机器人定位和建图,Hector主要用于救灾等地面不平坦的情况,因此无法使用里程计。而Cartographer是用于手持激光雷达完成SLAM过程,也就没有里程计可以用。
缺点:
随着场景增大所需的粒子增加,因为每个粒子都携带一幅地图,因此在构建大地图时所需内存和计算量都会增加。因此不适合构建大场景地图。并且没有回环检测,因此在回环闭合时可能会造成地图错位,虽然增加粒子数目可以使地图闭合但是以增加计算量和内存为代价。所以不能像Cartographer那样构建大的地图。Gmapping和Cartographer一个是基于滤波框架SLAM另一个是基于优化框架的SLAM,两种算法都涉及到时间复杂度和空间复杂度的权衡。Gmapping牺牲空间复杂度保证时间复杂度,这就造成Gmapping不适合构建大场景地图。翻看Cartographer算法,优化相当于地图中只用一个粒子,因此存储空间比较Gmapping会小很多倍,但计算量大。优化图需要复杂的矩阵运算。
构建地图如下图所示
二、Hector算法
Hector算法框架是基于高斯牛顿
(Hector 在机器人快速转向时很容易发生错误匹配,建出的地图发生错位,原因主要是优化算法容易陷入局部最小值)
优点:不需要里程计,适应于空中或者路面不平坦的环境
缺点:旋转过快易发生漂移,无回环检测
构建地图如下图所示
三、Karto算法
Karto算法框架是基于图优化
优点:这是首个基于图优化的开源算法,利用高度优化和非迭代平方根法分解从而进行稀疏化解耦求解
缺点:无法实时构建子图,耗费时间
构建地图如下图所示
四、 Cartographer算法
Cartographer算法框架是基于图优化cartographer在不同环境下,调整参数和传感器配置,就能工作
大部分数据集,cartographer表现更优。ActiveSubmaps2D类中的submaps_列表实际最多只两个submap,一个认为是old_map,另一个认为是new_map,类似于滑窗操作。当new_map插入激光scan的个数达到阈值时,则会将old_map进行结束,并且不再增加新的scan。同时将old_map进行删除,将new_map作为oldmap,然后重新初始化一个新的submap作为newmap。其具体实现可看代码注解,较为简单。首先回环优化,我们需要检测到回环,再进行优化。如何检测回环呢,前文也提到过,如果当前的scan和所有已创建完成的submap中的某个laser scan的位姿在距离上足够近,那么通过某种 scan match策略就会找到该闭环。这里为了减少计算量,提高实时回环检测的效率,Cartographer应用了branch and bound(分支定界)优化方法进行优化搜索,如果得到一个足够好的匹配,到此处,回环检测部分已经结束了,已经检测到了回环得存在。接下来要根据当前scan的位姿和匹配到得最接近的submap中的某一个位姿来对所有的submap中的位姿进行优化,即使残差E最小。
优点:适应于低成本激光雷达,加速回环检测,实时性强
缺点:在几何对称环境中,易回环出错
构建地图如下图所示
部分参考于: https://visionary.blog.csdn.net/article/details/111143722?spm=1001.2014.3001.5506
Cartographer以激光雷达的扫描数据、里程计位姿、IMU测量数据、固定坐标系位姿作为输入的传感器数据。
其中,激光雷达的扫描数据是Cartographer的主要处理对象。整个定位建图过程就是根据扫描数据,来优化机器人的位姿估计和地图占用栅格概率。它通过两个体素滤波器输入到Local SLAM中完成局部地图的构建,生成一个个子图(Submaps)。
剩下的三个传感器数据主要是为了给寻优求解过程提供一个较好的初值,IMU数据是它们的主力。通过IMU跟踪器(IMU Tracker)和位姿推理器(PoseExtrapolator),为Local SLAM提供初始的位姿估计。它们的原始数据也会作用于Global SLAM中的稀疏位姿调节器(Sparse Pose Adjustment)。
里程计位姿一般是指根据移动机器人纶组上的编码器估计的机器人位姿,它是一种积分性质的位姿估计,如果机器人在运动过程中出现了打滑、碰撞等无法或者很难建模的情况时,会出现很大的误差,而且随着时间的流逝不断累积。IMU的测量数据主要是指加表和陀螺测量的线加速度和角速度。根据惯导的理论知识,我们知道IMU是可以比较准确的估计出机器人位姿的。但是同样会存在累积误差,系统长时间运行时如果不能及时修正就会爆炸。固定坐标系位姿(Fixed Frame Pose),应该是指类似GPS这样具有全局定位能力的传感器数据。这类传感器虽然能够提供全局的定位信息,但是精度和动态特性往往比较差。
Cartographer的主体则是由Local SLAM和Global SLAM两部分构成。一些资料和博客中称Local SLAM为前端,Global SLAM为后端。一般SLAM系统中的前端都只使用最近一段时间内的数据,对算力的需求较小,可以实时计算,但存在累积误差。而后端则主要是为了解决累积误差的问题而存在的,引入了闭环检测等机制,往往是对整个地图和历史轨迹的优化,数据量和计算量上都要大很多,但好在实时性上没有前端那么高的要求,可以在后台慢慢计算。但也不能慢的太过分,所以Cartogapher针对Global SLAM使用了分支定界的方式进行了优化一定程度上减少了算力的需求。
部分参考于: 无处不在的小土-Cartographer的总体框架与安装试用 (gaoyichao.com)