温故而知新:LeGO-LOAM的演进之路

作者 | yachen zhang  编辑 | 3D视觉之心

原文链接:https://zhuanlan.zhihu.com/p/115986186

点击下方卡片,关注“自动驾驶之心”公众号

戳我-> 领取自动驾驶近15个方向学习路线

>>点击进入→自动驾驶之心SLAM技术交流群

本文只做学术分享,如有侵权,联系删文

LeGO-LOAM是以LOAM为框架而衍生出来的新的框架。其与LOAM相比,更改了特征点的提取形式,添加了后端优化,因此,构建出来的地图就更加的完善。

本文将先针对LeGO-LOAM进行原理的深度解析,然后再对比LOAM和LeGO-LOAM的区别和联系。如果有同学对LOAM框架不是很熟悉的话,希望可以先阅读这篇文章:

yc zhang:LOAM-SLAM原理深度解析872 赞同 · 101 评论文章965984e3b44056a17ff089baa8430b84.png

论文:https://ieeexplore.ieee.org/abstract/document/8594299

代码:LeGO-LOAM-BOR 和LeGO-LOAM NOTED

文章较长,创作不易,希望大家可以点赞关注收藏支持一波哈~

1、论文概括

LeGO-LOAM是发表于IROS 2018的文章,全称为:LeGO-LOAM: Lightweight and Ground-Optimized Lidar Odometry and Mapping on Variable Terrain .

从文章名称,可以看出,LeGO-LOAM相对于LOAM的提升主要在于轻量级地面优化。接下来,我将从论文的整体框架入手,详解介绍LeGO-LOAM和LOAM的区别和联系。

162e4dd018e9a484830a497072e8624d.jpeg
LeGO-LOAM框架图

本文的核心在于四个部分:分割特征提取雷达里程计雷达建图

  • 分割模块通过对一帧的点云重投影到图像中,进行地面分割,非地面点被分割出来;

  • 特征提取模块基于分割后的点使用和LOAM一样的方法提取边缘点和平面点;

  • 雷达里程计模块基于提取的特征点构建 scan-to-scan 约束关系,使用两次LM优化,得到姿态变换矩阵;

  • 雷达建图模块将得到的特征点进一步处理,构建 scan-to-map 的约束关系,构建全局地图。

下面将针对这四个部分进行详细的阐述。

2、Segmentation

首先设定在  时刻获取的点云 。  是  时刻的点云  中的一个点。将该点云投影到一个距离图像中,其分辨率为 。

  • 1800 :由于VLP-16的水平方向的角度分辨率为 ,所以,投影图像的水平方向分辨率为  。

  • 16 :由于VLP-16的竖直方向是16根扫描线,所以,投影图像的竖直方向的分辨率就变成了 16 。

在将点云投影到图像上后,每个三维空间的点就变为二维空间的像素点了,我们获取点  对应的像素点到传感器的欧几里得距离  。

再进行分割之前,可以对距离图像进行列式评估。进行地面点的提取。

  • 由于距离的竖直方向为 16 ,这个也代表了原始三维空间中的竖直维度的特性。所以,通过判断其竖直维度的特性,可以很好的标记出地面点和非地面点。

  • 通过VLP-16的激光扫描束的范围为 ,地面点必然出现在  扫描线上。

在这一个过程中,被标记的地面点可以不用进行后续的分割。

然后,使用基于图像的分割方法将距离图像分割为很多个聚类。同一个聚类的点被标记上唯一的标识。

这一步,可以将一些微小物体点当作噪音点去除,减少相邻帧之间微小物体不重复出现的造成的干扰:

  • 随风飘动的树叶,草等,在实际的实验中会经常遇,可能会造成出现在前一帧而不出现在后一帧的情况。

  • 去除不能聚成类的点云,可以在保留当前帧特征信息的基础上,减少噪音点的干扰,提升特征提取精度。

为了提高处理效率,本文将低于30个数据点的类别都当作噪点处理,这样保存下来的就是一些相对来说比较静态的物体了(例如,树干,楼房等)。这样的话,整个距离图像就可以被分成若干个比较大的类别。加上前面设定的一个类别——地面点,这样就可以进行后续的处理了。

基于这一步的处理,一帧点云中的点可以被小区很多噪音点,结果如下所示:

1436ab551bff6c6af530140fa89df3c2.jpeg
点云聚类后的效果

从图中可以看到,大部分的散乱点都被干掉了,这样需要处理的数据就变得很干净了。

基于这一步之后,每个点可以得到以下三个信息:

  • 分割标签(地面点或分割点)

  • 在距离图像中的行和列的索引

  • 和传感器的距离值 

我们这些分割处理后剩余的点都传入到特征提取模块,进行后续的特征提取处理。

这一步的处理在代码中体现如下:

投影图像的处理为:

8d6fb6e752cf5ef5c87fcc51cca76e8e.png

点云投影到图像的函数

行,列和距离值的处理:

3885ab3d3dfd54e63032f0a70388618c.jpeg f05a0a0a2db0d666f5ddd99f3f02e7c7.png

聚类的处理如下:

130a7e678e457c727bea2a178d450c20.jpeg

通过对于竖直角度的计算和阈值的判定,来决定到底是属不属于地面点,这样就可以分离地面点和非地面点了。

对于分离的非地面点使用BFS进行聚类处理::

91ba77c4bb0e9782707d906d934cf33d.jpeg

设定判定条件,保留相应的聚类:

2ea00a0786cd90f4458d55db592a4752.jpeg

3、Feature Extraction

在获取了地面点和分割点后,需要进行后续的特征提取操作,这里的操作基本和LOAM的操作一致,如果有同学对LOAM的特征提取不太了解,建议先看完LOAM的解析:

yc zhang:LOAM-SLAM原理深度解析872 赞同 · 101 评论文章58eb165122c0f84e3e9ed517a64be0d9.png

在本文中,为了能够从所有方向( 360∘ )提取特征点,将距离图像水平均分为若干个子图像(sub-image)。对于每一个子图像,都进行下面的处理。

选取  时刻的点云  中的一个点  ,在点  同一竖直方向上,左右各找5个点,构建一个集合  。

算每个点的平滑度:

这样就可以算出每个点在集合  中的平滑度了。

对于算出来的平滑度排序,进行特征点的选取。

设定平滑度阈值 :

  •  : 边缘点

  •  :平面点

根据上面的评判标准,划分出了边缘点和平面点。

  • 从每一行中选取不属于地面点,且具有最大  值的  个边缘点,组成集合  .

  • 从每一行中选取最小  值的  个平面点,属于地面点或分割点都行,组成集合  .

这一步选取了大部分的数据点,为了方便计算,我们再进行一次筛选:

  • 从集合  中选取不属于地面点,且具有最大  值的 个边缘点,组成集合  .

  • 从集合  中选取属于地面点,且具有最小  值的  个平面点,组成集合  .

这一步操作后,就得到如下关系:

他们之间的关系如图所示:

eb0a5fbebf6061c66c3451da9c37787f.jpeg
左边为较少的特征点,右边为较多的特征点

在LeGO LOAM的代码中,将  的距离图像划分为了6个  的子图像。

在每个子图像内设定: 。

这样,就可以得到一帧点云中的四个特征点集合:  。

纵观整个过程,LeGO-LOAM的特征提取和LOAM的特征提取区别在于:

  • 使用的点云类型不同

  • 计算公式不同

  • 平面点和边缘点的选择标准不同

这里虽然特征点集合看上去比LOAM多,但是其实和LOAM的是一样的,不过LOAM在论文中没有点明的。

下面依次进行对比:

e6899231d2338ee2b142eccc1bce20b8.jpeg
LeGO-LOAM和LOAM在特征提取模块的对比

具体实现,平滑度计算:

3e0ebbf84194a2a0a79d9d22e35f2252.jpeg

其他的在代码逻辑上基本和LOAM一致,这里不再赘述。

4、Lidar Odometry

在前面特征提取部分,获取了四种点云类型:。设定当前时刻为  ,则上一时刻为  。

为了更好的获取  时刻和  时刻的姿态变换关系,我们选取  时刻的特征点  和  ,以及  时刻的  和  。

由于  ,所以,肯定可以从  和 中找到  和  的关联点。

剩下的步骤就和LOAM里面构建约束关系的方式相同了。

  • 构建 的点到线的对应关系

  • 构建 的点到面的对应关系

但是,LeGO-LOAM还做了些许的改进来提高匹配的准确性和效率,主要在以下两个方面:

  • 标签匹配

  • 两步LM优化

4.1 标签匹配

在第二部分分割模块,我们将点云划分为地面点和分割点,使用这些标签来进行对应关联点的搜寻。

  • 对于边缘点:在 中具有分割点标签的点云中寻找  的对应关联点

  • 对于平面点:在  中具有地面点标签的点云中寻找  的对应关联点

这一步的操作其实非常巧妙,有以下两个优点:

  • 在相邻帧中地面信息基本保持不变

  • 聚类后点云被分为若干块,缩小了对应点的候选范围

不过,这一步的处理也不是没有问题的,在实际的实验中,如果地面不是特别的平坦,也就是说相邻帧间的地面有了一定的变动,这个时候,LeGO-LOAM就不能很好的运行。

再获取了点到线和点到面的对应关系后,需要使用列文伯格-马夸特法(LM)优化方法来进行优化求解。

如果对这一块不是很熟悉的话,可以阅读这篇文章:

yc zhang:最小二乘问题的四种解法——牛顿法,梯度下降法,高斯牛顿法和列文伯格-马夸特法的区别和联系690 赞同 · 44 评论文章c6cb3d5d1c8ce1bfed83106c5e122bc7.png

4.2 两步LM优化

在这一步,和LOAM相比,将针对6-DOF(  )的一次LM优化,更改为了两次LM优化方法:

  • 优化计算 的对应点约束,得到

  • 优化计算  的对应点约束,基于第一步得到的 ,得到 

两步计算有着一定的合理性:

  • 由于地面在相邻帧间基本保持不变,所以,使用点到面的约束关系,可以计算出竖直维度的变动 。

  • 当算出竖直维度的变动时,可以以此为初值输入到第二步的优化中,减少迭代次数,算出水平维度的变动 ,提升计算效率。

最终,基于两步LM优化,得到6-DOF的姿态变换矩阵 。

具体的实现如下所示:

两次优化:

3b57a02bd3c1b0e6836b6c29374ef4d2.jpeg

LM优化:

879e776c2e2c747607236bcd368c9347.png

这里需要注意的是LeGO-LOAM沿袭了LOAM_Velodyne的opencv的写法,并没有使用ceres solver库求解。

实际是求解高斯牛顿法:

4cda6936a0ea03f41fdc385ddb8a9b93.png

关于高斯牛顿法和LM法的区别和联系,我之前的文章有详细描述过,有兴趣的同学可以去看一下。

5、Lidar Mapping

前面雷达里程计模块获取了 scan-to-scan 的对应关系后,下面要考虑的问题是,如何将  时刻的  匹配到中  。其中是对应的全局地图特征点云。

我们设定  时刻的全局地图为:  。

 就是从  中找到的和  相关联的点云。

为了获取这个对应的全局地图特征点云 ,有两种方法:

  • 基于传感器视域

  • 基于图优化

下面将详细介绍这两种方法:

5.1 基于传感器视域

根据传感器的有效探测距离,选取一个cube,将里面的点云作为对应的全局地图特征点云。

VLP-16的有效探测距离是100m,所以,本文就选用100m,来获取  。

此方法和LOAM的方法基本一致。

5.2 基于图优化

  1. 首先获取每个节点的观测数据: 。

  2. 由于Lidar Mapping的位置估计误差较低,所以,可以假设在一个较短的周期内,几乎没有误差。因此,可以选择一组相近的特征集合来构建对应的全局地图特征点云  。其中,  表示的是  的大小。

  3. 通过LM优化方法,构建 和  之间的姿态约束

  4. 使用回环检测的方法,利用gtsam优化得到最终的全局地图。

这一部分和LOAM的最大区别在于加入了位姿图和回环检测,解决了LOAM没有后端优化的弊端,提升了建图的效率。

这里主要说明下回环检测的使用情况:

设定回环检测线程:

c462aeac9bf0177a9bb1780ccafa385e.jpeg

进行回环检测操作:

38334f1b1236265e3d8380bb53c6b334.jpeg

检测回环:

35da7aae872c0a014a3dee7177398597.jpeg

回环检测中匹配用的是icp:

271a7d4e75923a1411ef8715d1e70124.jpeg

使用gtsam优化位姿关系:

276a9353b9ab7ef02e86be8c39b2dfdd.png

6、总结

我们已经知道了LeGO-LOAM的算法流程,这里将总结一下LOAM和LeGO-LOAM的区别和联系:

d0dec0a645351c95c0ed9cca8936c2d0.jpeg
LeGO-LOAM系统框架
06aad7c3692b643f25fbdc56f5069a89.jpeg
LOAM系统框架

通过框架图的对比,可以看到,LeGO-LOAM多了分割模块,其他几个模块基本一致,就是频率发生了变化。

各模块的对比如下:

9f920fe1158c769d317d18b36435ab7b.jpeg
LeGO-LOAM和LOAM对比图

上面的图详细的整理了LeGO-LOAM和LOAM的区别与联系,再实际的使用中,大家可以根据具体情况,来选择到底使用哪个算法。

关于LOAM和LeGO-LOAM算法的对比已经整理完毕了,虽然LOAM系还有一个loam_livox算法,不过由于我不咋玩dji的雷达,所以,这一个就随缘更新吧。

后续,我将整理HDL算法框架,整理不易,希望路过的同学们可以点赞支持一下哈~

投稿作者为『自动驾驶之心知识星球』特邀嘉宾,欢迎加入交流!

① 全网独家视频课程

BEV感知、毫米波雷达视觉融合多传感器标定多传感器融合多模态3D目标检测车道线检测轨迹预测在线高精地图世界模型点云3D目标检测目标跟踪Occupancy、cuda与TensorRT模型部署大模型与自动驾驶Nerf语义分割自动驾驶仿真、传感器部署、决策规划、轨迹预测等多个方向学习视频(扫码即可学习

d277b89949bebadafc73f2bbfda727c3.png

网页端官网:www.zdjszx.com

② 国内首个自动驾驶学习社区

国内最大最专业,近2700人的交流社区,已得到大多数自动驾驶公司的认可!涉及30+自动驾驶技术栈学习路线,从0到一带你入门自动驾驶感知2D/3D检测、语义分割、车道线、BEV感知、Occupancy、多传感器融合、多传感器标定、目标跟踪)、自动驾驶定位建图SLAM、高精地图、局部在线地图)、自动驾驶规划控制/轨迹预测等领域技术方案大模型、端到端等,更有行业动态和岗位发布!欢迎扫描下方二维码,加入自动驾驶之心知识星球,这是一个真正有干货的地方,与领域大佬交流入门、学习、工作、跳槽上的各类难题,日常分享论文+代码+视频

c76ff12b4dea15298667f9687f126f6f.png

③【自动驾驶之心】技术交流群

自动驾驶之心是首个自动驾驶开发者社区,聚焦2D/3D目标检测、语义分割、车道线检测、目标跟踪、BEV感知、多模态感知、Occupancy、多传感器融合、transformer、大模型、在线地图、点云处理、端到端自动驾驶、SLAM与高精地图、深度估计、轨迹预测、NeRF、Gaussian Splatting、规划控制、模型部署落地、cuda加速、自动驾驶仿真测试、产品经理、硬件配置、AI求职交流等方向。扫码添加汽车人助理微信邀请入群,备注:学校/公司+方向+昵称(快速入群方式)

373ed89ff9f9dd3a66ed5435bf4bd694.jpeg

④【自动驾驶之心】平台矩阵,欢迎联系我们!

1f7439635c4c2177aafc8d431c32325e.jpeg

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值