作者丨yc zhang

编辑丨3D视觉工坊

LOAM作为比较古老的激光匹配slam方法,一直以来都霸占着KITTI的前列,近些年来,依靠LOAM框架也产出了很多文章,理解了LOAM,就可以很好的理解LOAM系列的其他文章。
因此,我决定将重新整理一下LOAM的论文和代码,方便初入门的同学更好的理解LOAM算法。

论文:​https://www.r​i.cmu.edu/pub_files/2014/7/Ji_LidarMapping_RSS2014_v8.pdf

代码:

​https://github.com/HKUST-Aerial-Robotics/A-LOAM​
文章较长,书写不易,如果觉得对您有帮助的话,希望可以点赞收藏支持一下哈~1、论文概览

LOAM这篇论文是发表于2014年RSS的文章,全称为:LOAM: Lidar Odometry and Mapping in Real-time . LOAM是基于激光雷达而搭建的在ROS平台下的SLAM系统,一共分为四个部分:

一文详解LOAM-SLAM原理深度解析_特征点

一文详解LOAM-SLAM原理深度解析_点云_02

一文详解LOAM-SLAM原理深度解析_3D_03

一文详解LOAM-SLAM原理深度解析_点云_04

再得到平滑度这一指标后,可以将特征点划分为两大类:平面点和边缘点。

平面点:在三维空间中处于平滑平面上的点,其和周围点的大小差距不大,曲率较低,平滑度较低。

边缘点:在三维空间中处于尖锐边缘上的点,其和周围点的大小差距较大,曲率较高,平滑度较高。

我们对集合内的点进行排序,找到最小的点c作为平面点,最大的点c作为边缘点。
这样就可以在一帧中得到有效的点数了。而在论文中是对整个扫描进行化段,分四段,每段各取两个边缘点和4个平面点。而在A-LOAM的代码中则是进行了一下的实现:

一文详解LOAM-SLAM原理深度解析_特征点_05

同时,对所取的点也有一定的限制:

该点的周围的点尽量不要被再被取到,这样可以使整体的特征点分布更加的平均

该点不能与雷达扫描束过于平行,这样也会出现问题

具体样例如下图所示:

一文详解LOAM-SLAM原理深度解析_特征点_06

因此,选点就有了三要素:

1、不能超过设定的size,每个集合平面点4个,边缘点2个;

2、已选取的点周围不能有点,使得点可以分布的更加均匀;

3、选取的平面点不能与激光扫描束平行。

以上的对应关系,同样再代码中有着体现。
判断该点是否是之前选取的点的周围的点以及不能超过size:

一文详解LOAM-SLAM原理深度解析_3D_07一文详解LOAM-SLAM原理深度解析_特征点_08

通过上面的循环,就实现了边缘点(Corner)和平面点(Planar)的获取了。这样就可以得到一帧数据对应的特征信息了。
提取后的数据如图所示:

一文详解LOAM-SLAM原理深度解析_点云_09

一文详解LOAM-SLAM原理深度解析_点云_10

一文详解LOAM-SLAM原理深度解析_3D_11

雷达扫描束

一文详解LOAM-SLAM原理深度解析_点云_12

三个点在两帧之间的直观展示

一文详解LOAM-SLAM原理深度解析_3D_13

构建的几何约束关系

一文详解LOAM-SLAM原理深度解析_特征点_14

一文详解LOAM-SLAM原理深度解析_3D_15

边缘点约束公式

一文详解LOAM-SLAM原理深度解析_3D_16

一文详解LOAM-SLAM原理深度解析_特征点_17

雷达扫描束

一文详解LOAM-SLAM原理深度解析_3D_18

四个点在两帧之间的直观展示

一文详解LOAM-SLAM原理深度解析_点云_19

构建的几何约束关系

一文详解LOAM-SLAM原理深度解析_3D_20

一文详解LOAM-SLAM原理深度解析_特征点_21

平面点约束公式

一文详解LOAM-SLAM原理深度解析_3D_22


一文详解LOAM-SLAM原理深度解析_3D_23

一文详解LOAM-SLAM原理深度解析_特征点_24

不断求解上面这个式子,直到收敛即可。
代码使用的是ceres solver来进行求解。
首先设定损失函数:

一文详解LOAM-SLAM原理深度解析_特征点_25

然后设定代价函数:

一文详解LOAM-SLAM原理深度解析_特征点_26一文详解LOAM-SLAM原理深度解析_点云_27

最后是求解:

一文详解LOAM-SLAM原理深度解析_3D_28

然后对球出来的数据进行迭代更新:

一文详解LOAM-SLAM原理深度解析_点云_29

一文详解LOAM-SLAM原理深度解析_点云_30

一文详解LOAM-SLAM原理深度解析_3D_31

mapping匹配示意图

这里设定:

一文详解LOAM-SLAM原理深度解析_特征点_32

一文详解LOAM-SLAM原理深度解析_特征点_33

一文详解LOAM-SLAM原理深度解析_点云_34

一文详解LOAM-SLAM原理深度解析_特征点_35

一文详解LOAM-SLAM原理深度解析_特征点_36

Lidar Mapping算法更新流程

通过不断的处理,就可以得到对应的了。
对应的代码解析如下:
对cube里的数据进行处理:

一文详解LOAM-SLAM原理深度解析_特征点_37

接受Lidar Odometry的数据,并得到初始的姿态变换矩阵:

一文详解LOAM-SLAM原理深度解析_3D_38

经过计算后,得到的新的姿态信息:

一文详解LOAM-SLAM原理深度解析_特征点_39

在这里,需要注意的是,我们最终传递的并不是q_wmap_odom和t_wmapodom。最终传递的是优化计算后得到的t_w_curr和q_w_curr:

一文详解LOAM-SLAM原理深度解析_点云_40

Lidar Mapping节点publish的message

6、Transform Integration这一部主要是将Lidar Odometry中得到的姿态信息和Lidar Mapping中得到的信息全部都放入到rviz中,方便观看和处理。如果是为了使用LOAM作为前端的话,到Lidar Mapping就完全够用了。7、总结:LOAM作为常见霸占KITTI榜的激光SLAM算法,是有着自己的独特优势的。其优缺点如下:
优点:

新颖的特征提取方式(边缘点和平面点)

运动补偿(时间戳)

融合了scan-to-scan(odometry)和map-to-map(mapping)的思想

缺点:

没有后端优化(年代)

不能处理大规模的旋转变换(旋转向量的求解)

LOAM的整理到这里就结束了。LOAM由于发表时间较早,并没有进行后端优化。不过,他的后继者:LeGO-LOAM就很好的解决了这个问题。

​https://zhuanlan.zhihu.com/p/115986186​

在LeGO-LOAM这篇文章中,我详细的阐述了LOAM和LeGO-LOAM的区别与联系,大家可以根据自己的实际需求选择对应的算法来实现想要的功能。

一路看下来,想必也不容易,如果觉得本文对您有帮助的话,希望可以点赞收藏关注支持一下哈~

本文仅做学术分享,如有侵权,请联系删文。