11

基于LOAM框架的激光SLAM开源程序汇总

 2 years ago
source link: https://mp.weixin.qq.com/s/VU29XXLjWCv4qS0tpaO7Sw
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

基于LOAM框架的激光SLAM开源程序汇总

Original 飞仔 计算机视觉工坊 1 week ago

点击上方“计算机视觉工坊”,选择“星标”

干货第一时间送达

640?wx_fmt=jpeg

1 前言

LOAM, 即Lidar Odometry and Mapping,是 Ji Zhang 博士于2014年提出的使用激光雷达完成定位与三维建图的算法。其算法流程如下:

640?wx_fmt=png

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的基础上,做了很大的优化。其算法流程为:

640?wx_fmt=png

整个算法分为五个模块。首先对单帧点云进行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是一种点云数据的全局描述符,其提取方法如下:

640?wx_fmt=jpeg

由于回环检测(场景识别)= 场景描述 + 搜索, Scan context 的作用是作为描述符来描述点云数据,其搜索算法可以保证回环能够被快速检测出来。因此将ScanContext应用到LEGO-LOAM的回环检测部分,提高回环的速度和准确性。

3 一些学习建议

对于初学者而言,为了掌握LOAM的框架算法,可以在阅读论文了解原理后,优先对A-LOAM代码进行阅读和理解,快速掌握算法实现的流程。在熟悉LOAM算法框架后,工程实践中,LEGO-LOAM在自动驾驶领域的建图中应用较多,因此可以重点对LEGO-LOAM进行学习,并再此基础上提出自己的改进并进行实验。

编者注:

这里也推荐下本文作者精心筹备的彻底搞懂基于LOAM框架的3D激光SLAM: 源码剖析到算法优化视频课程

640?wx_fmt=png

▲微信扫码可查看、购买、学习课程

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK