3D激光SLAM:LeGO-LOAM论文解读---完整篇

简介: ![在这里插入图片描述](https://img-blog.csdnimg.cn/348d0b4467a24296a22413207566c67e.png)论文的标题是:**LeGO-LOAM: Lightweight and Ground-Optimized Lidar Odometry and Mapping on Variable Terrain**- 标题给出的应用场景是 **可变地形**- 重点是 **轻量级** 并 利用 **地面优化** - 本质依然是一个 **激光雷达里程计和建图**

在这里插入图片描述

论文的标题是:LeGO-LOAM: Lightweight and Ground-Optimized Lidar Odometry and Mapping on Variable Terrain

  • 标题给出的应用场景是 可变地形
  • 重点是 轻量级 并 利用 地面优化
  • 本质依然是一个 激光雷达里程计和建图

摘要部分

文章提出了一种轻量级、基于地面优化的激光里程计和建图算法LeGo-Loam,能够实时的进行六自由度位姿估计,应用在地面的车辆上面。

强调应用在车辆上面就是因为在应用该算法的时候,雷达必须水平安装(主要设计地面优化部分),像LOAM和LIO-SAM的话对于安装角点是没有要求的,并且在运行过程中角度也可以改变。

LeGo-Loam是一套轻量级的算法,可以在低功耗嵌入式系统中进行实时的位姿估计。LOAM的实时性是要求在x86性能比较好的平台的上进行,LeGo-Loam在算力下降的平台上依然可以实时进行

该算法基于地面优化,在分割和优化的过程中利用地面的存在

首先进行点云分类,并利用分类去除了一部分噪声点,通过特征提取获得面点和角点(这部分和LOAM一样
通过两步的LM优化方法,利用角点和面点,进行相邻帧的位姿计算。---前端部分

用地面小车在可变地形上采集的数据,和LOAM进行比较,LeGO-LOAM在降低计算量的同时达到了相似或更好的精度。

把LeGO-LOAM集成到一个SLAM的框架里面去,用关键帧的概念对后端进行一个管理,来消除累计误差,用回环检测的方法(LOAM没有的部分)---后端部分。

简介部分

技术背景:

地图构建和状态估计是智能机器人中很重要的一个功能

有很多人对此付出了很多努力,通过两种方法:

  • 基于视觉
  • 基于激光雷达

视觉SLAM的优势可以很好的进行回环检测,但是对光照和视角的变换很敏感

激光SLAM的优势是可以在晚上依然可用,并且可以得到高精度的测量

因此论文用3d激光雷达进行实时的SLAM

传统的求解相邻两帧位姿的方式就是通过迭代最近邻点的方式(ICP),当场景非常大时,包含很多的点,那么ICP方法会非常耗时。针对ICP有几种升级的方法,将点与局部平面进行匹配,面到地图的匹配,并利用并行计算,使效率得到提升。

后面继续介绍了些点云配准的算法

LOAM的优势

LOAM是一种低漂移并且实时的激光雷达里程计和建图的方法

LOAM是通过提取角点和面点建立约束,来求取帧间的位姿变换。特征点是通过计算点的曲率进行判断的

LOAM的实时性是通过将估计问题分成了两个独立的算法进行,一种算法以高频运行,低精度估计传感器运动。另一种算法运行频率较低,但返回高精确运动估计。

在KITTI数据集上,仅通过激光雷达的估计,LOAM的精度是最好的。

LOAM的问题

指出LOAM在该工作场景中的问题

工作场景描述:
该工作场景是在地面的小车上装一个3D的激光雷达,来获得实时可靠的6自由度位姿估计。并且将算法部署到小规模的嵌入式系统中。

问题:

  • 1 计算量的问题

许多无人机驾驶的车辆上无法安装强大的计算单元

  • 2 运动激烈时候的问题

当小车在多种场景下跑的时候,由于颠簸,运动并不是十分平滑,导致数据有运动畸变。(LOAM是通过匀速模型进行的畸变去除,此时不再适用)由于运动强烈也会导致联系两帧的特征点匹配出现异常。
另外,大量的激光点云对于低功耗的嵌入式平台很难达到实时性

当把LOAM直接用到上面的场景上,当UGV运动比较平稳,并且特征稳定,计算资源足够的时候,可以实现低漂移的运动估计

但是资源受到限制,LOAM的表现就会退化。在场景点云比较多的时候,要计算每个点的曲率是比较耗时的,低算力的平台上计算就跟不上了

  • 3 噪点的问题

UGV 的运行环境有很多的噪点。如果雷达和地面比较近,那么地面上的噪声也会影响LOAM的表现
比如在草地上跑,可能会把草提取成角点,这样很难再找到匹配对。树叶是不是稳定的特征点

提出LeGO-LOAM的解决办法

因此提出了一种轻量的,通过地面优化的的LOAM(LeGO-LOAM)

点云的分类是通过先地面分割后,之后去除不可靠的特征点(解决噪点问题

由于是基于地面的优化,LeGO-LOAM通过两步的优化来进行位姿的估计。(解决轻量化问题
第一步,通过从地面点中提取面点,然后进行z roll pitch 的估计(不估计 x y yaw)
第二步,通过角点来进行 x y yaw的估计

并且集成了回环优化来修正位姿漂移。

硬件系统

论文的框架由两种激光雷达的数据进行的测

激光雷达

  • 1 VLP-16:

测量范围最远100米,精度为±3厘米
30°(+-15°)的垂直视场(FOV)和360°的水平FOV
16通道传感器提供2°的垂直角分辨率
水平角分辨根据旋转速率不同,从0.1°到0.4°变化
10Hz的扫描速率,水平角分辨率为0.2°

  • 2 HDL-64E

60°的水平FOV
48个通道
垂直FOV为26.9°

移动车辆

使用的UGV是Clearpath Jackal
锂电池供电
最大速度为2.0米/秒,最大有效载荷为20千克
集成低成本惯性测量单元(IMU),型号为CH Robotics UM6
如下图所示
在这里插入图片描述

计算单元

计算单元进行验证的有两个

  • 1 嵌入式计算设备 Nvidia Jetson TX2

Jetson TX2是一款嵌入式计算设备,配备ARM Cortex-A57 CPU。

在这里插入图片描述

  • 2 台式计算机 2.5GHz i7-4710MQ

电脑CPU以与LOAM中使用的计算硬件相同

轻量级激光雷达里程计和建图方法

系统框架

整体框架如下:
在这里插入图片描述

  • 输入:三维激光点云
  • 输出:六自由度位姿估计

整个系统可以分为五个模块:

  • 分割:指获取单次扫描的点云,并将其投影到距离图像上进行分割。161800个点用cvmat来对点进行初步管理*
  • 特征提取:分割的点云被发送到特征提取模块。
  • 激光雷达里程计:使用从先前模块中提取的特征点进行帧间位姿估计
  • 激光建图部分:这些特征在激光建图部分被转换到全局点云地图中进一步处理。
  • 变换集成模块:融合来自激光雷达里程计和激光雷达建图的姿态估计结果,并输出最终的姿态估计。以里程计高频率输出精确位姿

相对于LOAM中的原始通用框架,该系统旨在提高地面车辆的效率和精度。

点云分割

分割方法
Pt是t时刻的一帧点云数据
在这里插入图片描述
pi是Pt中的一个点

首先需要把Pt映射到深度图像上去

映射的深度图像的分辨率是 1800*16 .1800就是一帧激光雷达点云里面的每一个scan上有1800个点,16就是有16个scan
VLP的水平分辨率为0.2° 垂直分辨率为2°
在这里插入图片描述
每个有效的点为深度图像的一个像素,像素的值就是该点到雷达中心的距离
在这里插入图片描述
就相当于:
在这里插入图片描述
在这里插入图片描述

地面点分类

由于在场景中可能是在斜坡上面进行运动,所以没有假设地面点是一个水平面

通过深度图像的每一列进行地面点的提取,然后再做点云的分类。

在后面的点云分类中,地面点就不参与了,因为它已经分完了

其它点分类及过滤

之后基于图像的分割方法,将点云分成很多簇

同一簇的点分配上唯一的标签

地面点是一种特殊类型的簇

对点云进行聚类分割可以提高处理效率和特征提取精度

假设机器人在一个噪声很大的环境下,有些物体的尺寸很小比如树叶,或者其它不可靠的特征点。相邻帧几乎不可能看到同一个树叶
所以做好先去掉这些点

为了实现快速和可靠的特征提取,把小于30个点的聚类进行过滤,即不会在这些点中进行特征提取

测试

其可视化的效果 如下
在这里插入图片描述
a图是原始的点云可视化效果

在这里插入图片描述
做完聚类之后,去除聚类小于30的点后保留的点,红色的点是地面点

在聚类之后剩下的点,代表比较大的目标,比如建筑物、树干、地面点,可以用这些点做里程计的位姿估计
同时这些点会被存储到深度图像中去,过滤的点则会被深度图像删去。

保留的点会存储三种属性

  • 是否是地面点的标签
  • 在深度图像的行列索引
  • 距离,点到雷达中心的距离

然后利用这些信息再做特征提取

特征提取

这一部分和LOAM差不多

区别是 LeGO-LOAM 不是从原始点云中提取特征,而是从地面点和分割点中提取特征。

先算一个曲率
在这里插入图片描述
这个曲率和一个阈值比较

大于阈值就是角点,小于阈值就是面点

和LOAM一样,也把每个scan分成6段子图
那每个子图就是
300*16的点
在每个子图中选取

  • 角点 2 个
  • 面点4个
  • 弱角点 40个
  • 弱面点 80个

在这里插入图片描述

激光雷达里程计

激光雷达里程计模块的功能就是:估计相邻帧之间的位姿变换。

估计的方式:在相邻帧之间做点到线的约束和点到面的约束
具体的方式和LOAM一样

针对LOAM的改进

  • 1 基于标签的匹配

在特征提取部分提取的特征点都会有个标签(在点云分割时分配的)
因此在找对应点时,标签必须一致
对于面点仅在上一帧中找地面点与之匹配
对于角点在上一帧对于的标签中找对应得角点
这种特征点匹配得方式会提高匹配精度

  • 2 两步LM优化

首先做地面点得优化,再做角点得优化。该方法实现了相邻帧间得位姿估计
具体两步LM优化方法如下
(1)第一步通过当前帧地面点和上一帧匹配得地面点估计出 z roll pitch
(2)第二步通过当前帧角点和上一帧匹配得角点估计出 x y yaw,并利用第一步估计得 z roll pitch
虽然在第一步就可以估计出x y yaw,但是其精度步高,不能用于第二步得估计
最后把两步估计得结果加起来,就是6自由度得位姿变换结果
优化方法意义:通过这种方式得优化,计算时间相比于原始LOAM可以减少35%。

激光雷达建图

原理和LOAM一样:当前帧和地图进行低频率得配准,得到最优得当前帧位姿变换

和原始LOAM不一样地方: 地图得存储。
LOAM是通过一个栅格地图进行局部地图得管理。
LeGO-LOAM是通过关键帧得概念进行局部地图管理,保存了激光雷达一些帧,和该帧的位姿。
局部地图建立就是通过根据当前帧的位置,提取与当前帧位置小于100m的关键帧拼接(根据每帧的位姿拼接)在一起作为局部地图

进行回环检测集成位姿图优化
最后将SLAM里面的位姿图优化集成到了LeGO-LOAM中

  • 回环检测的方法:就是通过检测历史帧的位姿和当前帧的位姿比较接近,则认为形成一个回环。(因为激光雷达里程计在短时间内的漂移比较小)
  • 优化的方法就是通过ICP计算历史帧和当前帧的位姿变换,然后通过LM的优化方法就行 GT-SAM的位姿图优化。

实验对比

户外小场景下

在这里插入图片描述
户外的小场景,其中
i是一个树
ii 石头墙
iii UGV
在这里插入图片描述
LOAM把一些树叶提取成了面点,这种面点很不稳定
在这里插入图片描述
LeGO-LOAM通过距离滤波的方式把树叶去除了
在这里插入图片描述
LOAM把草地上的草提取成了角点,这种角点也不稳定

LeGO-LOAM不提取地面上的角点

所以LeGO-LOAM提取的特征点相比于LOAM更加稳定

在这里插入图片描述
最后形成的地图LOAM中杂点多,且一个树形成了3个数,
LeGO-LOAM效果更好些

户外大场景

在这里插入图片描述
在大范围场景下,LOAM的杂点要多些

相关文章
|
6月前
|
算法 计算机视觉
OpenCV(四十一):图像分割-分水岭法
OpenCV(四十一):图像分割-分水岭法
101 0
|
传感器 机器学习/深度学习 自动驾驶
自动驾驶:BEV开山之作LSS(lift,splat,shoot)原理代码串讲
自动驾驶:BEV开山之作LSS(lift,splat,shoot)原理代码串讲
3913 0
自动驾驶:BEV开山之作LSS(lift,splat,shoot)原理代码串讲
|
存储 前端开发 数据可视化
3D激光SLAM:LeGO-LOAM---两步优化的帧间里程计及代码分析
**LeGO-LOAM**的全称是 Lightweight and Ground-Optimized Lidar Odometry and Mapping on Variable Terrain 其中LeGO就是轻量级和利用地面优化,轻量级的实现就是通过两步的优化方式,利用地面优化的部分也在两步优化的第一步中。 和原始LOAM一样,通过前后两帧点云来估计两帧之间的运动,从而累加得到前端里程计的输出,和上述方法使用线面约束同时优化六自由度帧间位姿不同,LeGO-LOAM的前端分成两个步骤,每个步骤估计三自由度的变量。 通过这种方式进行帧间里程计的运算,可以提供运算效率,使得可以在嵌入式平台
3D激光SLAM:LeGO-LOAM---两步优化的帧间里程计及代码分析
|
6月前
|
vr&ar 图形学 网络架构
看透物体的3D表示和生成模型:NUS团队提出X-Ray
【5月更文挑战第13天】NUS团队提出了X-Ray,一种新型3D表示方法,通过模拟X射线扫描细致捕捉物体内外特征,解决了现有方法对内部结构和纹理细节处理的局限。利用射线追踪技术,X-Ray将物体浓缩为多帧格式,提高表示效率和准确性。在3D物体合成任务中,X-Ray显示了优于传统方法的优势,尤其适用于高保真3D模型需求的领域,如虚拟现实和游戏。其效率提升也使实时3D生成更具潜力,但面对复杂场景和优化问题仍有挑战。[论文链接](https://arxiv.org/abs/2404.14329)
62 4
|
6月前
|
传感器 定位技术
Ardupilot — EKF3使用光流室内定位代码梳理
Ardupilot — EKF3使用光流室内定位代码梳理
161 0
|
6月前
|
机器学习/深度学习 Shell 计算机视觉
【论文精读】CVPR2021 - ReDet:一种用于航空目标检测的旋转等变检测器
【论文精读】CVPR2021 - ReDet:一种用于航空目标检测的旋转等变检测器
|
人工智能 编解码 算法
使用LabVIEW AI视觉工具包快速实现霍夫圆和霍夫直线检测(含源码)
使用LabVIEW AI视觉工具包快速实现霍夫圆和霍夫直线检测(含源码)
234 0
|
机器学习/深度学习 人工智能 算法
ICLR 2022 Spotlight|让AI学会捏橡皮泥飞机
ICLR 2022 Spotlight|让AI学会捏橡皮泥飞机
|
传感器 编解码 算法
LeGO-LOAM算法详解
LeGO-LOAM算法详解
472 0
LeGO-LOAM算法详解
|
前端开发 定位技术 C++
3D激光SLAM:A-LOAM :前端lidar点预处理部分代码解读
A-LOAM的cpp有四个,其中 kittiHelper.cpp 的作用是将kitti数据集转为rosbag 剩下的三个是作为 slam 的 部分,分别是: - laserMappin.cpp ++++ 当前帧到地图的优化 - laserOdometry.cpp ++++ 帧间里程计 - scanRegistration.cpp ++++ 前端lidar点预处理及特征提取 本片主要解读 前端lidar点预处理部分的代码
3D激光SLAM:A-LOAM :前端lidar点预处理部分代码解读