文章目录
- Overview
- 雷达里程计
- IMU预积分
- GPS
- 回环
- 代码结构解析
今天讲一篇经典的LIO(LiDAR-Inertial Odometry)SLAM论文——LIO-SAM。
雷达+里程计由于其高鲁棒性、较低成本(二维雷达不贵、三维雷达价格也在降、IMU不太贵),可以说是工业机器人应用最广泛的SLAM解决方案了。对于三维LiDAR+IMU的结局方案,在github上的开源算法并不多,甚至可以说就LIO_SAM和FAST_LIO两种(及它们的前身和衍生物)。

如果尝试过运行这两个算法的人,一般都会觉得FAST_LIO是更好用的算法,FAST_LIO不需要标定,计算速度更快,定位精度更高、建图效果也更细腻(LIO-SAM真难用,对IMU标定要求极高,非常容易漂移)。但是为什么LIO_SAM的star更多呢?道理很简单,如果你只是想运行一个LIO算法,那FAST_LIO可能更好,但是如果你想改代码,那你一定更会绝对修改LIO_SAM更简单,具体为什么往后看。
Overview
系统框架如下所示,乍一看花里胡哨的,实际上是一个非常清楚的紧耦合LIO框架。
x
i
x_i
xi代表的被优化的位姿,每两个之间都有两个约束,一个绿色的雷达里程计约束、橙色的IMU约束。时不时会加入黄色的GPS和紫色的回环约束。然后使用iSAM一起优化。
雷达里程计
雷达里程计用的还是LOAM的方法,区别在于使用了关键帧和scan_to_map,没有使用每两个相邻帧进行匹配。
首先是关键帧,关键帧可以减少约束,增加效率。选择的方法很简单,只有当前位置和上一个节点位置变化范围超过阈值(雷达里程计提供),才保存为关键帧,加入新的优化节点。
然偶是匹配,使用滑动窗口保存一定数量的雷达帧,叠加起来过一个体素滤波降采样(非常常见的做法)。将目前的scan和submap进行匹配(LOAM),得到雷达里程计。
IMU预积分
紧耦合的核心,原理太难了我也不会,以后再说。但是核心思想就是,IMU频率是非常快的,两个scan之间都有很多数据,需要一个个积分过去算出来约束,但是在更新之后需要重新计算,使用预积分模型之后就不需要重新计算了(大概感觉就像差分数组,加速修改这种,我瞎说的)。
GPS
就是一个全局约束,当累计出来的协方差大于GPS本身协方差的时候,会加入一个GPS因子。
回环
LIO-SAM的回环很简单,找到之前最近的keyframe,利用那帧keyframe周围的scan组成submap,然后使用LOAM的方法进行匹配。
核心在于提供了一个回环的接口,不需要你自己改,从而衍生了很多版本的LIO-SAM。
代码结构解析
LIO-SAM只include了一个utility.h文件,里面定义了一些全局变量。剩下主要文件就4个,非常常见的结构。
imageProjection预处理点云,featureExtraction提取plane和edge特征,imuPreintergration向因子图里面添加IMU预积分因子,mapOptimization进行优化(把雷达里程计的计算和添加其他因子也放在了里面)。
总而言之,想要在LIO-SAM上进行修很简单,尤其是在加传感器的时候,在·mapOptimization里加一个新的sub,然后加入因子图中,就搞定了,堪称工业利器。