参考网址:

(112条消息) SLAM基本流程和算法框架_lzj50002801的博客-CSDN博客_slam基本框架

流程图

20200906153505547.png

1
2
3
4
5
6
7
8
9
传感器信息读取:在视觉 SLAM 中主要为相机图像信息的读取和预处理。如果在机器人中,还可能有码盘、惯性传感器等信息的读取和同步。

视觉里程计 (Visual Odometry, VO):视觉里程计任务是估算相邻图像间相机的运动,以及局部地图的样子。VO 又称为前端(Front End)。

后端优化(Optimization):后端接受不同时刻视觉里程计测量的相机位姿,以及回环检测的信息,对它们进行优化,得到全局一致的轨迹和地图。由于接在 VO 之后,又称为后端(Back End)。

回环检测(Loop Closing):回环检测判断机器人是否曾经到达过先前的位置。如果检测到回环,它会把信息提供给后端进行处理。

建图(Mapping):它根据估计的轨迹,建立与任务要求对应的地图。

在图中很清晰的表现出了slam流程:

根据传感器信息获得初步的前端里程计,这时候同时进行回环检测,然后将两个数据都传给后端进行后端的非线性优化,最后通过非线性优化得到的坐标数据,进行最终建图.

传感器

  • odom:一般用于辅助前端定位作用
  • imu:由于其角度相较于odom更准,所以也会将其放做里程计角度数值,当然也会有用于ekf做传感器融合
  • scan:激光数据包括:ranges, intensities,数据

前端里程计

滤波大法

主要是ekf与pf两种,具体可参考:

gmapping,amcl,refletor_ekf_slam

非线性优化

  • icp
  • scan_to_map
  • scan_to_submap: Scan To SubMap方法只将当前帧激光雷达数据与历史前几帧数据进行匹配

回环检测

  • 通过特征点进行匹配(原特征,叫角特征,线特征)
  • 通过icp进行的暴力匹配
  • scan_context

后端优化(图优化)

图优化的目的是从整体上对所有已估计到的并且在回环上的位姿进行优化,减小误差。普遍有两种:

  • 图优化的思路是将位姿作为图(Graph)的顶点(Vertex),位姿间的坐标变换关系作为边(Edge), 顶点为优化变量,边为优化约束,构建出一个位姿图(Pose Graph)。
  • 将雷达观测点也作为图的顶点,观测点与机器人的位姿之间的关系也作为边构建出一个图,这种情况下称之为Bundle Adjustment(BA)问题

具体非线性优化可以参考g2o与之前的手撸高斯牛顿,以此得到较为不错的估计坐标

建图

这方面,其实可以参考的有很多,比如hector的建图,以及深蓝学院的建图都比较简单容易移植.

全局定位

  • 最常用且传统的方式是amcl,采用贝叶斯滤波的方式实现,包括比较固定的里程计模型,还有就是根据不同传感器写的不同观测模型,对于2d激光slam来讲,scan是最常见的观测方式,当然再此基础上结合gps结合反光板,结合多激光头进行多传感器融合也同样常见,原理类似
  • scan_to_map是比较常用的纯定位方式,缺点是由于重定位比较麻烦,一般对于车体初始位姿要求比较高
  • 采用carto的scan_to_submap,首先在各个子图中搜索,然后再查找,不过同样的面临着一开始需要很长时间进行搜索定位的过程,所以一般做法依旧是选择较好的初始位姿.
  • 基于特征匹配进行的全局定位,如scan_context或者是角特征,线特征,原特征等
  • 最粗暴的方法,使用icp进行暴力穷举,我相信那一定是很让人难忘的方式