SLAM四种算法建图对比

SLAM四种算法建图对比+Gmapping实操

SLAM——同步定位与建图(Simultaneous Localization and Mapping,SLAM)是在上世纪80年代被提出的,起初发展的算法皆采用激光雷达作为定位与建图的工具,随着稀疏性问题的解决,相机也被引入SLAM领域,如今SLAM技术在向多传感器融合的方向发展,激光雷达、深度相机、IMU惯导等正成为SLAM技术的常见解决方案。

1.Gmapping

一种用于建立二维地图的概率算法,它基于激光雷达数据和机器人的运动信息,通过蒙特卡洛方法进行粒子滤波定位和地图构建。

这个部分写得详细一点,因为我们比赛建图使用的就是Gmapping算法,从理论到实际

(后面三种实际操作暂无,为了统一,参考构建地图都来自一篇文章)

1.1概述

其算法框架是基于RBPF粒子滤波算法,先进行定位再进行建图

RBPF:http://t.csdnimg.cn/h4PfS,对于建图而言,简单来说就是通过算法迭代,在粒子群中选出最优粒子,使用激光雷达数据和所关联的历史轨迹来绘制地图。其定位和建图是分离的,每个粒子都携带它们自身的地图(不适合大场地建图,但是我们比赛场地面积用Gmapping建图问题不大)。

RBPF问题Gmapping改进
粒子多——计算量大、内存消耗大改进提议分布(考虑里程计、观测信息)
频繁执行——粒子退化选择性重采样(设定阈值)

1.2优缺点

  • 优点

    Gmapping可以实时构建室内地图,在构建小场景地图所需的计算量较小且精度较高。相比Hector SLAM对激光雷达频率要求低、鲁棒性高.

    而相比Cartographer在构建小场景地图时,Gmapping不需要太多的粒子并且没有回环检测因此计算量小于Cartographer而精度并没有差太多。Gmapping有效利用了车轮里程计信息,这也是Gmapping对激光雷达频率要求低的原因:里程计可以提供机器人的位姿先验。而Hector和Cartographer的设计初衷不是为了解决平面移动机器人定位和建图,Hector主要用于救灾等地面不平坦的情况,因此无法使用里程计。而Cartographer是用于手持激光雷达完成SLAM过程,也就没有里程计可以用。

    • 缺点

      随着场景增大所需的粒子增加,因为每个粒子都携带一幅地图,因此在构建大地图时所需内存和计算量都会增加。因此不适合构建大场景地图。

      没有回环检测(http://t.csdnimg.cn/8Vh3X),因此在回环闭合时可能会造成地图错位,虽然增加粒子数目可以使地图闭合但是以增加计算量和内存为代价。所以不能像Cartographer那样构建大的地图。

      Gmapping和Cartographer一个是基于滤波框架SLAM另一个是基于优化框架的SLAM,两种算法都涉及到时间复杂度和空间复杂度的权衡。Gmapping牺牲空间复杂度保证时间复杂度,这就造成mapping不适合构建大场景地图。翻看Cartographer算法,优化相当于地图中只用一个粒子,因此存储空间比较Gmapping会小很多倍,但计算量大;优化图需要复杂的矩阵运算。

      1.3建图实操

      1)软硬件准备:

      rplidar及其驱动;navigation和gmapping等package;tf变换关系

      很多开源的相关功能包,这是SLAM导航核心技术的内容,随便查

      编译功能包,使系统识别ROS工作空间

      下载gmapping·是为了能够在自己的小车运行,因此必须按照小车的实际情gmapping算法中的参数进行配置

      touch gmapping_robot.launch
      

      2)笔记本和主控板连接

      这个步骤看情况,直接接显示屏或者看小屏也可以

      可以ssh远程操控,使用Nomachine等工具

      3)操作指令

      roslaunch turn_on_什么机器人 mapping.launch  //建图命令
      rviz     //可视化
      roslaunch  机器人 keyboard_teleop.launch   //控制命令
      roslaunch turn_on_什么机器人 map_saver.launch   //保存地图
      

      注意:在单独启动rviz时,需要先启动master节点:roscore,然后另启一终端运行:rosrun rviz rviz。但是对.launch文件,运行之后,若master节点没有启动会自动去启动它,因此在第二步运行rviz时,master节点已经被启动了,无需再次运行roscore。 每次打开rviz都要重新配置很麻烦,可以使用ctrl+s命令保存当前配置,保存到路径opt/ros/melodic/share/rviz/default.rviz,若提示无法写入该文件,则是当前文件权限为“only read”,启动一个终端,输入并运行命令sudo chmod 777 /opt/ros/melodic/share/rviz/default.rviz,然后再此尝试ctrl+s保存即可成功

      4)灰度地图和代价地图

      建图得到灰度地图,其数值范围为[-1,100],其中“-1”代表未知区域,基本是rviz的背景色,“0“代表自由区域,为白色,”100“代表完全占用,为黑色,实际上在建图时只有”-1“、”0“、”100“三种情况,因为建图过程中雷达探测到了障碍物一般就是确定的,不会取0-100之间的数值。

      到了执行导航功能时,系统的地图又有所不同,此时使用的并不完全是使用建图的地图,而是使用代价地图。代价地图的取值范围是[0,254],数值越大,表示占用程度越高,导航时小车越要远离。

      代价地图的生成过程可以参考此文章:https://blog.csdn.net/qq_35635374/article/details/120874817(到了导航部分再细说),总而言之就是对之前建好的静态层地图和雷达运行探测到的障碍层地图按照膨胀规则进行膨胀和合并,生成数值在[0,254]之间的代价地图,导航时按照地图方格中的数值进行路径规划

      2.Hector

      Hector算法框架是基于高斯牛顿

      (Hector 在机器人快速转向时很容易发生错误匹配,建出的地图发生错位,原因主要是优化算法容易陷入局部最小值)

      优点:不需要里程计,适应于空中或者路面不平坦的环境

      缺点:旋转过快易发生漂移,无回环检测

      3.Karto

      Karto算法框架是基于图优化

      优点:这是首个基于图优化的开源算法,利用高度优化和非迭代平方根法分解从而进行稀疏化解耦求解

      缺点:无法实时构建子图,耗费时间

      4.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最小。

      优点:适应于低成本激光雷达,加速回环检测,实时性强

      缺点:在几何对称环境中,易回环出错

      参考文献和图片参考:

      E最小。

      优点:适应于低成本激光雷达,加速回环检测,实时性强

      缺点:在几何对称环境中,易回环出错

      [外链图片转存中…(img-T5qLKaoG-1710078632478)]

      参考文献和图片参考:

      http://t.csdnimg.cn/wrcMm