"); //-->
1 前言
LOAM, 即Lidar Odometry and Mapping,是 Ji Zhang 博士于2014年提出的使用激光雷达完成定位与三维建图的算法。其算法流程如下:
LOAM算法中主要包含两个模块,一个是Lidar Odometry:基于输入点云提取出角点与平面点作为特征点进行关联匹配,计算出两次扫描之间的位姿变换,计算频率为10HZ;
为了减缓单帧点云位姿变换产生的累计误差,设计了Lidar Mapping 的部分。即将与前一帧配准后的点云与生成的地图进行二次配准,消除漂移。
由于作者编写的LOAM代码已经闭源,目前网上存在着一些代码的复现版本,本文对这些复现版本进行了汇总,并概括说明了各个版本代码的特点,供正在学习LOAM相关算法的同学进行参考。
2 基于LOAM框架的开源激光SLAM算法
(1) loam_velodyne
代码链接如下:
laboshinl/loam_velodyne: Laser Odometry and Mapping (Loam) is a realtime method for state estimation and mapping using a 3D lidar. (github.com):https://github.com/laboshinl/loam_velodyne
该代码程序为按照LOAM论文复现的原生代码,特点是 基于ROS框架,可直接适用于velodyne-16线激光雷达的建图。对于想学习ROS使用的同学,可以从中了解到如何利用ROS进行消息的接收与发布,如何通过ROS中的tf完成坐标系之间的转换。
算法中涉及到的数学公式如非线性优化,并未采用已有的开源库,而是手工一步步推导,需要一定数学基础理解代码。,但通过代码的学习可以加深对公式的理解。
对于上述代码,网上也存在含有中文注释的版本,代码链接如下:
cuitaixiang/LOAM_NOTED: loam code noted in Chinese(loam中文注解版) (github.com):https://github.com/cuitaixiang/LOAM_NOTED
(2) A-LOAM
代码链接如下:
HKUST-Aerial-Robotics/A-LOAM: Advanced implementation of LOAM (github.com):https://github.com/HKUST-Aerial-Robotics/A-LOAM
利用了Ceres库提供的非线性优化函数,完成了L-M算法中雅克比的推导,去除了IMU数据的引入。整体代码更加规范整洁,非常适合学习LOAM思想,也适合新手入门3D激光SLAM。
(3)oh_my_loam
代码链接如下:
feixyz10/oh_my_loam: ROS-free implementation of LOAM (github.com):https://github.com/feixyz10/oh_my_loam
脱离了ROS环境实现了LOAM,数据通过函数参数进行传入传出,整体代码设计十分整洁,适合想要搭建属于自己的激光SLAM程序的同学进行借鉴。
(4) loam_livox
代码链接如下:
hku-mars/loam_livox: A robust LiDAR Odometry and Mapping (LOAM) package for Livox-LiDAR (github.com):https://github.com/hku-mars/loam_livox
利用livox固态激光雷达,基于LOAM的思想,设计出的算法。因此同样地,基于livox数据进行了特征点提取,特征点的匹配和残差计算与LOAM一致。同时利用Ceres库优化了残差。
(5) LEGO-LOAM
代码链接如下:
irapkaist/SC-LeGO-LOAM: LiDAR SLAM: Scan Context + LeGO-LOAM (github.com):https://github.com/irapkaist/SC-LeGO-LOAM
在LOAM的基础上,做了很大的优化。其算法流程为:
整个算法分为五个模块。首先对单帧点云进行Segmentation:将其投影为一副1800*16的图像上,每一个收到的点代表一个像素。提取出地面点聚类,并将非地面点分组为多个聚类,每个聚类的点云具有一致的标签。
与LOAM近似的方式提取出角点和平面点。在Lidar Odometry的环节中,选取具有一致标签的点云进行匹配。例如平面点只考虑标记为地面点的点,边缘点只考虑其他标记大物体的点,以此提升匹配速度。采用两步L-M优化得到前后帧点云的位姿变换。通过配准平面点得到[tz, roll, pitch], 通过配准角点来估计[tx, ty, yaw]。在Lidar Mapping 环节,将特征点与周围点云图配准,同时增添了图优化和回环检测,进一步优化位姿变换,减少漂移。
相应的,网上也存在着其中文注释版本
wykxwyc/LeGO-LOAM_NOTED: LeGO-LOAM代码注释与学习 (github.com):https://github.com/wykxwyc/LeGO-LOAM_NOTED
(6) SC-LEGO-LOAM
代码链接如下:
irapkaist/SC-LeGO-LOAM: LiDAR SLAM: Scan Context + LeGO-LOAM (github.com):https://github.com/irapkaist/SC-LeGO-LOAM
SC-LEGO-LOAM 融合了ScanContext 与 LEGO-LOAM,其中ScanContext是一种点云数据的全局描述符,其提取方法如下:
由于回环检测(场景识别)= 场景描述 + 搜索, Scan context 的作用是作为描述符来描述点云数据,其搜索算法可以保证回环能够被快速检测出来。因此将ScanContext应用到LEGO-LOAM的回环检测部分,提高回环的速度和准确性。
3 一些学习建议
对于初学者而言,为了掌握LOAM的框架算法,可以在阅读论文了解原理后,优先对A-LOAM代码进行阅读和理解,快速掌握算法实现的流程。在熟悉LOAM算法框架后,工程实践中,LEGO-LOAM在自动驾驶领域的建图中应用较多,因此可以重点对LEGO-LOAM进行学习,并再此基础上提出自己的改进并进行实验。
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。