作者丨yc zhang
编辑丨3D视觉工坊
LOAM作为比较古老的激光匹配slam方法,一直以来都霸占着KITTI的前列,近些年来,依靠LOAM框架也产出了很多文章,理解了LOAM,就可以很好的理解LOAM系列的其他文章。
因此,我决定将重新整理一下LOAM的论文和代码,方便初入门的同学更好的理解LOAM算法。
论文:https://www.ri.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系统,一共分为四个部分:
再得到平滑度这一指标后,可以将特征点划分为两大类:平面点和边缘点。
平面点:在三维空间中处于平滑平面上的点,其和周围点的大小差距不大,曲率较低,平滑度较低。
边缘点:在三维空间中处于尖锐边缘上的点,其和周围点的大小差距较大,曲率较高,平滑度较高。
我们对集合内的点进行排序,找到最小的点c作为平面点,最大的点c作为边缘点。
这样就可以在一帧中得到有效的点数了。而在论文中是对整个扫描进行化段,分四段,每段各取两个边缘点和4个平面点。而在A-LOAM的代码中则是进行了一下的实现:
同时,对所取的点也有一定的限制:
该点的周围的点尽量不要被再被取到,这样可以使整体的特征点分布更加的平均
该点不能与雷达扫描束过于平行,这样也会出现问题
具体样例如下图所示:
因此,选点就有了三要素:
1、不能超过设定的size,每个集合平面点4个,边缘点2个;
2、已选取的点周围不能有点,使得点可以分布的更加均匀;
3、选取的平面点不能与激光扫描束平行。
以上的对应关系,同样再代码中有着体现。
判断该点是否是之前选取的点的周围的点以及不能超过size:
通过上面的循环,就实现了边缘点(Corner)和平面点(Planar)的获取了。这样就可以得到一帧数据对应的特征信息了。
提取后的数据如图所示:
雷达扫描束
三个点在两帧之间的直观展示
构建的几何约束关系
边缘点约束公式
雷达扫描束
四个点在两帧之间的直观展示
构建的几何约束关系
平面点约束公式
不断求解上面这个式子,直到收敛即可。
代码使用的是ceres solver来进行求解。
首先设定损失函数:
然后设定代价函数:
最后是求解:
然后对球出来的数据进行迭代更新:
mapping匹配示意图
这里设定:
Lidar Mapping算法更新流程
通过不断的处理,就可以得到对应的了。
对应的代码解析如下:
对cube里的数据进行处理:
接受Lidar Odometry的数据,并得到初始的姿态变换矩阵:
经过计算后,得到的新的姿态信息:
在这里,需要注意的是,我们最终传递的并不是q_wmap_odom和t_wmapodom。最终传递的是优化计算后得到的t_w_curr和q_w_curr:
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的区别与联系,大家可以根据自己的实际需求选择对应的算法来实现想要的功能。
一路看下来,想必也不容易,如果觉得本文对您有帮助的话,希望可以点赞收藏关注支持一下哈~
本文仅做学术分享,如有侵权,请联系删文。