总述
本文旨在梳理目前较为前沿的SLAM技术,包括激光和视觉,主要从精度和实时性两个方面对算法进系评价。
对于激光SLAM了解不深,后期需要补充相关算法的核心思想与算法框架。有问题请大佬们随时留言,我再改正。
0.1 视觉SLAM算法
从算法的定位精度上来看,ORB-SLAM3 > DM-VIO > VINS系列
从算法的实时性方面来看,跟踪一帧数据的时间(指输入一帧数据得到该帧的位姿),ORB-SLAM3和VINS的时间均在40ms–50ms左右,DM-VIO对于普通帧的跟踪在10ms左右,对于关键帧的跟踪在53ms左右略大于ORBSLAM3
综合定位精度和实时性,ORB-SLAM3的性能相对更加出色,而且多地图和重定位模式使得系统更加鲁棒。
0.2 激光SLAM算法
3D激光SLAM应用环境主要针对室外的大场景(2km以上),目前纯激光SLAM算法中lego-loam较为出色,但在实时性和精度上比最新的一些LIO算法较差一些。
在LIO算法中较为出色的有早期的LIO-SAM算法(lego-loam的改进版本),fast系列的fast-lio2和faster-lio,LIO系统的精度和用于评测的数据集相关,每个算法在不同的数据集上均有不同的表现,但综合来看对于2km以上的大场景算法的定位误差可以控制在1.5m左右,不同数据集下的表现大不相同,定位精度高的可以达到0.2-0.3m,差得可以达到10m,针对不同场景下的泛化性相对差一些。
对于ORB-SLAM在KITTI数据集的表现,双目模式下的ORBSLAM表现相对稳定,定位误差在基本在1米以内,对于比较极端的场景kitti08和kitti09在3m-4m之间
1.视觉SLAM
1.1 ORBSLAM3
1.1.1 算法框架
Tracking、LocalMpping、LoopClosing三大核心线程。
- Tracking: 负责主要的跟踪,输入一帧数据(图像+IMU)输入该帧数据对应的位姿,同时创建关键帧
- LocalMpping: 维护当前位姿附近的局部地图,为跟踪提供先验
- LoopClosing: 基于词袋向量做回环检测,以之前的位姿为基准矫正当前帧位姿的漂移
- Atlas地图: 二进制文件,本质上是文本的输入输出,将SLAM代码的每个类进行序列化然后保存成二进制文件,加载地图时再对地图文件反序列化
1.1.2算法精度
定位误差控制在10cm以内,大部分数据集控制在5cm以内
精度比较:ORB3双目/双目+IMU > ORB3单目+IMU > VINS-MONO
ORB3的VIO是基于紧耦合的因子图优化,IMU的精度在一些数据集(EuRoC->V系列)损失了一部分精度,但是提高了系统的稳定性(跟踪失败减少)
1.1.3算法实时性
单目模式下跟踪一帧数据30ms以内,双目模式下40ms以内(图像分辨率752x480,实际跟踪时间和分辨率大小相关)
1.2 VINS系列
包括VINS-MONO和VINS-FUSION两个系列,VINS-FUSION在MONO的基础上添加了双目模式,以及与GPS融合。
1.2.1 算法框架
简单的可以划分为数据预处理,基于滑窗的VIO,回环检测三个部分,普通跟踪过程的优化在VIO中实现
数据预处理: 对图像部分进行KLT光流跟踪获得关键点和速度信息,对IMU数据进行预积分处理
VIO跟踪: 类似于ORB3的Tracking+LocalMapping,维护一个小的局部的滑窗,实时对滑窗内所有的关键帧进行优化
回环检测: 和ORBSLAM类似,对关键帧图像额外提取500角点,通过计算词袋向量的几何相似性判断回环
VINS-FUSION:
VINS-FUSION在MONO的基础上添加了双目模式,以及与GPS融合,双目的初始化取代了单目SFM的三角话直接得到深度信息,在初始化时将首帧的位姿和GPS坐标进行对应获得绝对位姿
1.2.1 算法精度
在EuRoC数据集下,VINS的单目+IMU和双目+IMU模式,定位误差在7-15cm左右,且普遍高于10cm,相比与ORBSLAM3略有逊色。
1.2.2 算法实时性
因为前端采用光流跟踪,vins-mono在EuRoC数据集上的平均跟踪时间是10ms(VINS的跟踪只是光流跟踪得到匹配点和速度),但位姿优化时间是36ms,跟踪一帧数据耗时40ms+。
1.3 直接法DM-VIO
1.3.1 算法框架
DM-VIO是一个单目VIO框架,DSO系列的极大成算法,基于直接法和IMU结合的思想,算法没有明确的前端和后端,因为是直接在像素层面上通过最小化光度误差进行位置估计,在计算位姿的同时进行了优化。
1.3.2 算法精度
在EuRoC数据集上,定位误差基本控制在10cm以内,只比ORBSLAM3略差一些,但精度要高于VINS系列
1.3.3 算法实时性
在实时性上,DM-VIO跟踪一普通帧仅需要10ms左右,对于关键帧跟踪涉及BA,边缘化等操作跟踪一帧需要53ms,对于普通帧的跟踪实时性要远大于ORBSLAM3
2.激光SLAM
2.1 Lego-LOAM 和 LIO-SAM
Lego-Loam 算法是在LOAM算法基础上的拓展,LIO-SAM又在Lego-Loam算法框架基础上融合了IMU。
2.1.1 Lego-LOAM算法
整个SLAM系统主要包括点云分割、激光里程计、激光地图构建和位姿估计4个模块。
- 点云分割:
- 将每一帧点云重投影到图像中(图像大小由雷达水平方向分辨率和垂直方向的扫描线决定,坐标就是角度和扫描线对应的值,每个坐标的信息使用距离信息表示,参考深度图像)
- 在低于水平角度0的扫描线上的点被认为是地面点,进行标记
- 对点云进行聚类,低于30的类被认为是噪点或树叶等动态点
-
基于平滑度计算,对点云信息进行特征提取平面点和边缘点
-
特征匹配估计位姿
- 特征匹配:基于标签信息(地面点、非地面点)进行scan-to-scan的点到线以及点到面的匹配
- 位姿估计:两步LM,首先根据地面在相邻帧基本保持不变的原理,根据地面点中点到面的匹配算出竖直维度的运动,即[t_z,t_roll,t_pitch],作为初始位姿,使用非平面点中点到线的匹配估计水平方向上的运动[t_x,t_y,t_row]
-
激光点云地图构建:本质上是将单帧点云和全局地图中的点云集合进行匹配
- 首先基于激光传感器的测据范围在全局地图中初步选择和当前帧点云存在潜在关系的点云集合
- 另外选取当前帧临近时刻的点云集合构建一个图优化,得到当前帧和地图之间的约束关系,即位姿
2.1.2 Lego-Loam算法精度
在室外大型场景下(2km)的均方根误差波动较大,最小0.36m,最大10m以上
2.1.2 LIO-SAM算法
酷睿i7平台,帧间跟踪(scan-to-scan)在30ms以内,地图匹配耗时较长普遍在100ms以上
2.2 lego-loam的vio版本LIO-SAM
相比lego-loam的改进点,加入了在激光里程计因子和回环因子的基础上,加入了IMU和GPS因子,同时将scan-to-全局地图匹配改为和局部地图匹配,提高匹配效率
2.2.1 算法框架
激光里程计部分: 维护一个由n个关键帧组成的滑窗,滑窗中所有关键帧的线特征和平面特征组成局部地图,只进行关键帧和局部地图之间的匹配
GPS因子: 对GPS(一般是10hz)位姿根据时间戳进行线性插值,但只在位姿估计协方差矩阵变化较大时加入GPS因子进行融合
2.2.2 LIO-SAM算法精度
在室外公园场景(3km)下,定位精度控制在1m内
2.2.3 LIO-SAM实时性
相比于Lego-Loam,scan-to-map耗时提升不是特别大,基于无人车采集的公园数据集上,单帧匹配时间在100ms左右
2.2.3 LIO-SAM与Lego-loam的对比
对于scan-to-scan的单帧匹配,LIO-SAM时间上速度略有提升,精度上使用的数据集不一致无法进行有效评估。
2.4 Fast-LIO与Faster-LIO
Faster-LIO是基于Fast-LIO的改进版本,在牺牲一点精度的情况下,极大提高了算法跟踪的整个流程。
2.4.1 fast系列和LIO-SAM的时间与精度对比
从精度上说,针对不同的数据集,fast-lio2比faster-lio精度略高一些,大部分数据集精度差在0.2m以内; faster系列和lio-sam系列在不同的数据集上各有输赢,整体上误差之间的差距在0.5m以内
从时间上说,faster-lio实时性最好,和fast-lio相比,单帧跟踪时间由30ms左右降到10ms,lio-sam一般在40ms+