LeGO-LOAM算法详解
LeGO-LOAM算法详解
整体框架
LeGO-LOAM算法的总体框架如下图所示:
图中新增加了绿框中的Segmentation环节,同时对后续的特征提取、Odometry以及Mapping部分均有一定的修改,主要包括:
- 增加Segmentation操作,把点云投影为距离图像,分离出地面点与非地面点(分割点,segmented point)。
- 平滑度计算公式不同,原始LOAM中为使用点集中的坐标相减,而LeGO-LOAM中为使用点集中的欧式距离作差。
- 特征点选取中原始LOAM为按照平滑度的值及已有特征点数量分为平面点/边缘点两类,而LeGO -LOAM中不仅考虑到平滑度的值还同时考虑到点的类型为“地面点/分割点”,分别进行提取不同的特征点集。
- Lidar Odometry模块相邻帧之间特征点的对应关系也分别按照“地面点/分割点” 进行寻找,使得寻找匹配特征点的效率、精度更高。
- Lidar Mapping模块中LeGO-LOAM提供了基于传感器视野范围与基于图优化获取的两种获取特征对应点方法。此外,还加入了iSAM2进行后端优化(闭环检测)。
综上,LeGO-LOAM的总体思路与LOAM基本相同,1)把原始点云投影为距离图像,并在进行特征提取之前区分为“地面点/分割点”。2)对具有相同类别的特征点进行匹配。3)加入iSAM2进行闭环检测。这三点是其主要创新。
1 Segmentation模块
文章中采用Velodyne VLP-16激光雷达采集的数据进行实验,首先把原始点云重投影为一个距离图像,分辨率为1800*16(因为VLP-16水平分辨率为0.2°,360/0.2 = 1800,同时垂直方向上位16线数据)。重投影之后,三维点云变为二维图像,以像素点到传感器之间的距离作为像素值。
以VLP-16竖直维度的特性来进行标记地面点和非地面点,其在垂直方向的扫描范围为[-15°, 15°],认为地面点出现在[-15°, -1°]之间的扫描线上,而被标记的地面点可以不用进行后续的分割。
随后,将距离图像分割为很多个聚类,同一个聚类的点被标记上唯一的标识。点数较少的聚类(少于30点)被作为噪声去除,这一步可以减少室外环境噪音点的干扰,如随风飘动的树叶,地面上的杂草等不稳定的特征,这样的处理就可以保留原始的地面点和相对较大的静态物体(树干,楼房等)来进行后续的特征提取工作了。如下图中 (a)为原始点云,(b)为进行分割处理后的点云。
2 Feature Extraction模块
这一模块在计算平滑度时与经典的LOAM相似,考虑到特征点在各个方向分布均匀,把距离图像水平均分为若干个子图像(360°划分为六等分)。随后对t时刻点云PtP_tPt中的每一个点PiP_iPi左右各选取5个点组合成点集SSS,通过下式计算平滑度。
这里采用了距离图像中激光点到传感器之间的距离,与原始LOAM中直接使用两点坐标不同。
A\mathbb{A}A
随后,从子图像中的地面点中选取nFpn_{F_p}nFp个平面点FpF_pFp,从分割点中选取nFen_{F_e}nFe个边缘点FeF_eFe。
此外,从子图像中的地面点与分割点中选取nFpn_{\mathbb{F}_p}nFp个平面点Fp\mathbb{F}_pFp, 从子图像中的非地面点中选取nFen_{\mathbb{F}_e}nFe个边缘点Fe\mathbb{F}_eFe,即存在以下关系,FpF_pFp⊂ Fp\mathbb{F}_pFp以及FeF_eFe⊂ Fe\mathbb{F}_eFe。
如下图中所示,( c ) 中为有类别约束的平面点FpF_pFp及边缘点FeF_eFe,(d) 中为子图像中所有的平面点Fp\mathbb{F}_pFp与边缘点Fe\mathbb{F}_eFe。
3 LiDAR Odometry
特征提取时,我们得到了四种特征点集{FpF_pFp, FeF_eFe, Fp\mathbb{F}_pFp, Fe\mathbb{F}_eFe}。为了更好的寻找相邻两帧点云数据之间的对应特征点对,采用如下图所示的思路进行优化:
上图中的流程可以总结为:
- 对于平面点:在Fp(t−1)\mathbb{F}_p^{(t-1)}Fp(t−1)中具有分割点标签的点云中寻找FptF_p^tFpt的对应的关联点。
- 对于边缘点:在Fe(t−1)\mathbb{F}_e^{(t-1)}Fe(t−1)中具有分割点标签的点云中寻找FetF_e^tFet的对应的关联点。
这可以使缩小对应点的候选范围,同时提高匹配的精度和效率。有了对应的特征点对之后,需要对其进行优化求解六个姿态变换参数,LeGO-LOAM使用两步LM优化方法进行处理。
首先,采用平面点Fp(t−1)\mathbb{F}_p^{(t-1)}Fp(t−1)与FptF_p^tFpt对应的约束,优化计算得到了{tzt_ztz, trollt_{roll}troll, tpitcht_{pitch}tpitch}。随后,基于Fe(t−1)\mathbb{F}_e^{(t-1)}Fe(t−1)与FetF_e^tFet对应的约束,以及之前优化得到的{tzt_ztz, trollt_{roll}troll, tpitcht_{pitch}tpitch},进行优化得到{txt_xtx, tyt_yty, tyawt_{yaw}tyaw}。最终,两次优化结果融合,得到最终的变换参数{txt_xtx, tyt_yty,tzt_ztz, trollt_{roll}troll, tpitcht_{pitch}tpitch , tyawt_{yaw}tyaw}。
4 LiDAR Mapping
作者在这里介绍了两种方法:1)基于传感器视域。 2)基于图优化。分别来把上一步输出的点云与局部位姿变换到全局地图中。
其中,第一种方法将全局点云地图分割为很多cube,然后根据传感器的有效探测距离(VLP-16为100m)选取一定数量的cube,组合成前 t−1t-1t−1 时刻获取的点云地图Q(t−1)Q^{(t-1)}Q(t−1),然后对当前帧QtQ^tQt与其相交的部分进行匹配,与经典的LOAM算法基本相同。
第二种方法加入了位姿图和回环检测 (iSAM2),提高了建图效率与精度,但是目前还不太理解,这里就先不做详细的介绍了。
LeGO-LOAM算法详解相关推荐
- Loam算法详解(配合开源代码aloam)
参考论文:LOAM: Lidar Odometry and Mapping in Real-time 代码:A-LOAM Ubuntu 18.04 + ROS Melodic + eigen 3.3. ...
- Matlab人脸检测算法详解
这是一个Matlab人脸检测算法详解 前言 人脸检测结果 算法详解 源代码解析 所调用函数解析 bwlabel(BW,n) regionprops rectangle 总结 前言 目前主流的人脸检测与 ...
- 图论-最短路Dijkstra算法详解超详 有图解
整体来看dij就是从起点开始扩散致整个图的过程,为什么说他稳定呢,是因为他每次迭代,都能得到至少一个结点的最短路.(不像SPFA,玄学复杂度) 但是他的缺点就是不能处理带负权值的边,和代码量稍稍复杂. ...
- C++中的STL算法详解
1.STL算法详解 STL提供能在各种容器中通用的算法(大约有70种),如插入.删除.查找.排序等.算法就是函数模板,算法通过迭代器来操纵容器中的元素.许多算法操作的是容器上的一个区间(也可以是整个容 ...
- 粒子群(pso)算法详解matlab代码,粒子群(pso)算法详解matlab代码
粒子群(pso)算法详解matlab代码 (1)---- 一.粒子群算法的历史 粒子群算法源于复杂适应系统(Complex Adaptive System,CAS).CAS理论于1994年正式提出,C ...
- 基础排序算法详解与优化
文章图片存储在GitHub,网速不佳的朋友,请看<基础排序算法详解与优化> 或者 来我的技术小站 godbmw.com 1. 谈谈基础排序 常见的基础排序有选择排序.冒泡排序和插入排序.众 ...
- 目标检测 RCNN算法详解
原文:http://blog.csdn.net/shenxiaolu1984/article/details/51066975 [目标检测]RCNN算法详解 Girshick, Ross, et al ...
- Twitter-Snowflake,64位自增ID算法详解
Twitter-Snowflake,64位自增ID算法详解 from: http://www.lanindex.com/twitter-snowflake%EF%BC%8C64%E4%BD%8D%E8 ...
- 数据结构与算法详解目录
数据结构与算法详解是一本以实例和实践为主的图书,主要是经典的数据结构与常见算法案例,来自历年考研.软考等考题,有算法思路和完整的代码,最后提供了C语言调试技术的方法. 后续配套微课视频. 第0章 基 ...
最新文章
- 搭建java_搭建java开发环境
- 经典压缩软件7-Zip首次登陆Linux免费开源!
- static_cast, dynamic_cast, const_cast
- python快速排序算法_Python实现快速排序算法及去重的快速排序的简单示例
- android开发 RecyclerView 瀑布列表布局
- 插入排序:表折半插入
- endpointimpl怎么填参数_python爬虫19 | 爬虫遇到需要的登录的网站怎么办?用这3招轻松搞定!...
- 左程云算法Day6 图
- 显微镜下的大明——第三个故事
- 微信公众平台 微信网页授权
- 建Kangle+EasyPanel对接SWAP IDC虚拟主机自助开通完整教程
- SQL Server下载和安装步骤
- Java工程师 操作系统(四) 面试题(Day35)
- len(lst[0])
- idea使用docker-mave插件打包镜像并部署到harbor私服仓库
- 手机端上传照片实现 压缩、拖放、缩放、裁剪、合成拼图等功能
- AutoCAD Civil 3D-曲面-1、曲面创建
- 1.1 NBU基本概念
- 怎么将PPT里面的普通文字设置成艺术文字
- FAT32文件系统(一)
热门文章
- 浅谈QPS、TPS、并发用户数、吞吐量的关系
- Windows 命令行 (cmd) 切换盘符
- 03 【基础篇-系统管理】
- 新浪微博涨粉秘籍,真秘籍!!
- 论文阅读-TNNLS2021-Elastic Knowledge Distillation by Learning from Recollection
- Intel8086处理器使用NASM汇编语言实现操作系统10-硬盘读取(in/out)
- 小学生计算机使用计划书,【习惯养成计划表】_小学生好习惯养成计划一览表...
- Photoshop里面查看某个图层的尺寸
- ESP8266 Deep-Sleep 模式下的唤醒方式
- string类的常用函数(总结)