LeGO-LOAM学习

前言

在学习了LOAM之后,了解到LeGO-LOAM(面向复杂情况的轻量级优化地面的雷达里程计),进行了一个学习整理。

Github:https://github.com/RobustFieldAutonomyLab/LeGO-LOAM
论文:https://github.com/RobustFieldAutonomyLab/LeGO-LOAM/blob/master/Shan_Englot_IROS_2018_Preprint.pdf

系统概述

LeGO-LOAM学习_第1张图片

系统接收来自3D激光雷达的输入并输出6个DOF姿势估计。 整个系统分为五个模块。 首先是segmentation,使用单次扫描的点云,并将其投影到范围图像上进行分段(线)。 然后将分段的点云发送到feature extraction模块。 然后,激光雷达测距仪使用从前一模块中提取的特征来找到与连续扫描相关的变换。 这些特征在lidar mapping中进一步处理,将它们注册到全局点云图。 最后,transform integration模块融合了激光雷达测距和激光雷达测绘的姿态估计结果,并输出最终的姿态估计。 

接下来,我们看具体每一个模块完成的工作

一、Segmentation

首先将收到的一帧点云投影到一副1800*16的图像上(水平精度0.2°,16线lidar),每一个收到的点代表图像的一个像素,像素的值r_{i}表示相应的点p_{i}到sensor的欧式距离

完成图像化之后得到一个矩阵,对矩阵的每一列进行估计(即完成对地面的估计),在分割之前进行地面点的提取。可能代表地面的点被标记为地面点而不用于分割。

然后,将基于图像的分割方法应用于距离图像以将点分组为多个聚类。同一类的点具有相同的一个标签(地面是较为特殊的一类);同时,为了快速可靠地完成特征提取,忽略少于30个点的类。

LeGO-LOAM学习_第2张图片

完成这一步之后,图像里只保留了可能代表大物体的点,然后记录下点的三个值:(1)类的标签;(2)点在矩阵中的坐标(x,y);(3)点的值即r_{i} 在接下来的模块里使用。

二、Lidar Odometry

首先是特征点的提取,方法与LOAM中的相似,只是进行特征提取的点云是Segmentation处理之后得到的点云。

为了从所有方向均匀地提取特征,作者将图像水平划分为几个相等的子图像。 然后我们基于它们的平滑度c对子图像的每一行中的点进行排序。然后通过设定的阈值c_{th}来判定平面点或者角点。效果如下图:

LeGO-LOAM学习_第3张图片

接下来进行了LOAM中没有的操作,即作者认为子图像中的每一行具有最大c值的edge特征点,其不属于地面; 类似地,子图像中的每一行具有最小c值的平面特征点一定是地面点。处理之后效果如下:

LeGO-LOAM学习_第4张图片

三、Lidar Odometry

Lidar Odometry模块估计两次连续扫描之间的传感器运动。 通过执行point-edge和point-plane扫描匹配找到两次扫描之间的转换。具体方法采用的与LOAM中一致。但在后续步骤中,作者做了一些改进。

1)Label matching

这个时候就用到了在Segmentation中记录下的类的标签(label)。然后在配准过程中,对任意一点的配准只在标签相同的点里进行匹配。例如,平面点只考虑标记为地面点的点,边缘点只考虑其他标记为大物体的点。

作者以这种方式查找对应关系有助于提高匹配准确性。 换句话说,更可能在两次扫描之间找到相同对象的匹配对应关系。 这个过程也缩小了对应点的潜在对应点。

2)Two-step LM Optimization

LeGO-LOAM学习_第5张图片

本文采用两步得到最佳变换:(1)通过配准平面点来得到[t_{z},\theta _{roll},\theta_{pitch}](2)然后在以[t_{z},\theta _{roll},\theta_{pitch}]为约束的情况下,通过配准边缘点来来估计[t_{x},t_{y},\theta_{yaw}]。虽然在第一步中也能估计[t_{x},t_{y},\theta_{yaw}],但它们不够准确而且不用在第二步。

通过使用两步优化方法,可以实现类似的精度,同时计算时间减少约35%。

四、Lidar Mapping

Lidar Mapping模块中,将特征点与周围点云图进行配准,以进一步优化姿势变换,但以较低频率运行。具体细节与LOAM相似。

LeGO-LOAM的主要不同之处在于如何存储最终点云图。LeGO-LOAM选择存储每一个特征点集,而不是单一的点云图。

M^{t-1}是保存所有先前特征点集的集合。在进行扫描时,M^{t-1}中的每个特征集也与传感器的位姿相关联。这样,我们可以根据M^{t-1}来得到周围点云图(surrounding point cloud map)\bar{Q}^{t-1}:第一种方法,通过选择通过选择传感器视场中的特征点集来获得\bar{Q}^{t-1};为了简单起见,选择(特征点集关联的)传感器位姿在传感器当前位置100米范围内的特征点集。然后将所选择的特征点集转换并融合到单个周围的地图中,从而得到\bar{Q}^{t-1}

作者还将位姿图SLAM集成到LeGO-LOAM中。 每个特征点集的传感器位姿可以被建模为位姿图中的节点。特征点集可以视为此节点的传感器测量值。由于Lidar Mapping模块的姿态估计漂移非常低,假设在短时间内没有漂移。通过这种方式,可以通过选择最近的一组特征点集来形成\bar{Q}^{t-1}。然后,可以使用在L-M优化之后获得的变换来添加新节点与\bar{Q}^{t-1}中的所选节点之间的空间约束。可以通过执行闭环检测来进一步消除该模块的漂移。在这种情况下,如果在当前特征点集与使用ICP的先前特征点集之间找到匹配,则会添加新约束。然后通过将位姿图发送到优化系统来更新传感器的估计位姿。

 

运行结果如下

在这里插入图片描述

具体安装测试移步LeGO-LOAM初探:原理,安装和测试

五、闲谈

对论文的学习到此告一段落,大概了解了论文作者的思路以及该算法在LOAM基础上的修改。。。。。。

由于最近比较忙,没有时间详细阅读代码以配合理解论文,后续再补上。。。。。。

 

顺带自捞一下关于LOAM学习的Blog:

LOAM_velodyne学习(一)

LOAM_velodyne学习(二)

LOAM_velodyne学习(三)

LOAM_velodyne学习(四)

你可能感兴趣的:(LOAM,LeGO-LOAM)