论文标题:LeGO-LOAM:Lightweight and Ground-Optimized Lidar Odometry and Mapping on Variable Terrain
应用在可变地形场景的轻量级的、并利用地面优化的LOAM
ABSTRACT
- 轻量级的、基于地面优化的LOAM实时进行六自由度位姿估计,应用在地面的车辆上。
- 强调应用在地面车辆上是因为在这里面要求雷达必须水平安装,而像LOAM和LIO-SAM的话对于安装点是没有要求的,并且运行中角度也可以改变。
- LeGO-LOAM是轻量级的,在嵌入式设备上也可以;并且LeGO-LOAM基于对面优化,在分割和优化的过程中利用地面的存在。
- 首先进行点云分类,并利用分类去除了一部分噪声点,通过特征获得面点和角点(这部分和LOAM一致)。
- 通过两步的LM优化,利用角点和面点进行相邻帧的位姿计算,LeGO-LOAM在更低计算量的情况下达到了想死或更好的精度。
- LeGO-LOAM中用关键帧的概念对后端进行一个管理,用回环检测的方法来消除累积误差(LOAM中无回环检测)。
INTRODUCTION
传统求解相邻两帧位姿的方法是通过迭代最近邻点的方式(ICP),当场景非常大时,会包含很多店,那么ICP会非常耗时。于是有几种变种,例如PL-ICP等。
本论文工作场景:在地面的小车上装一个3D的激光雷达,来获得实时可靠的6自由度位姿估计,并且将算法部署到小规模的嵌入式系统中。
loam在此工作场景中的问题
- 计算量问题:许多无人驾驶车辆上无法安装强大的计算单元
- 运动激烈时候的问题:
当小车在多种场景下跑的时候,由于颠簸,运动并不是十分平滑,导致数据有运动畸变。(LOAM中是通过匀速模型去除运动畸变,这里不再适用),由于运动强烈也会导致联系两帧的特征点匹配也会出现异常。
另外,大量的激光点云对于低功耗的嵌入式平台很难达到实时性。 - 噪点的问题:
UGV的运行环境会有很多的噪点。比如雷达与地面接近,那地面上的噪声也会影响LOAM,例如在草地上跑,可能会把草提取成角点,但草不可靠,很难再找到匹配点或者错误。除此之外,树叶也不是好的特征点。
LeGO-LOAM中对上述问题的解决
- 解决噪点问题:点云的分类先通过地面分割后,去除不可靠的特征点。
- 解决计算量(轻量化)问题:由于是基于地面的优化,LeGO-LOAM通过两步的优化来进行位姿的估计。
第一步:通过地面点中提取面点,然后进行 [ t z , θ r o l l , θ p i t c h ] [t_z, θ_{roll}, θ_{pitch}] [tz,θroll,θpitch] 的估计
第二步:通过角点来进行 [ t x , t y , θ y a w ] [t_x, t_y, θ_{yaw}] [tx,ty,θyaw]的估计 - 修正位姿漂移:集成回环优化
LeGO-LOAM系统框架
整个系统分为五个模块:
- 分割:获取单次扫描的点云,并将其投影到距离图像上进行分割
- 特征提取:分割的点云被发送到特征提取模块
- 激光雷达里程计:使用从先前模块中提取的特征来寻找与连续扫描相关的变换。
- 激光建图部分:这些特征在激光建图部分被转换到全局点云地图中进一步处理。
- 变换集成模块:融合来自激光雷达里程计和激光雷达建图的姿态估计结果,并输出最终的姿态估计
LeGO-LOAM系统
A.点云分割
- P t P_t Pt是t时刻的一帧点云数据( P t = { p 1 , p 2 , … , p n } P_{t}=\left\{p_{1}, p_{2}, \ldots,p_{n}\right\} Pt={p1,p2,…,pn}),首先把 P t P_t Pt映射到深度图像上去。
- 进行地面点分类:因为UGV可能会在斜坡上运动,所以没有假设地面点是一个水平面,具体操作是:通过深度图像的每一列进行地面点的提取,然后作点云分类,在后面的点云分类中,地面点将不再参与,因为已经分了。
- 其他点分类及过滤:后续的点云基于图像的分割方法,将点云分成很多簇,同一簇的点云配上唯一的标签(地面点是一种特殊类型的簇,对点云进行聚类分割可以提高处理效率和特征点提取精度),为了实现快速和可靠的特征提取,把小于30个点的聚类进行过滤,即不会在这些点中进行特征提取
做完聚类之后,去除聚类小于30的点后保留的点,其中红色点是地面点;其余代表比较大的目标,比如建筑物,树干等
- 同时也会把这些点存储到深度图像中去,过滤的点则会被深度图像删除
- 保留的点会存储三种属性:是否是地面点的标签、在深度图像的行嘞索引、距离(点到雷达中心的距离)
补充–深度图像
图像分辨率如图,为1800x16,1800是一帧激光雷达点云里面每一个scan上有1800个点,16就是有16个scan,每个点对应在自己的位置,其像素值就是该点到雷达中心的距离,即
pix
=
x
2
+
y
2
+
z
2
\operatorname{pix}=\sqrt{\mathrm{x}^{2}+\mathrm{y}^{2}+\mathrm{z}^{2}}
pix=x2+y2+z2
B.特征提取
这部分和LOAM差不多,区别在于LeGO-LOAM不是从原始点云中提取特征,而是从地面点和分割点中提取特征。
具体过程:
- 先算一个曲率 c = 1 ∣ S ∣ ⋅ ∥ r i ∥ ∥ ∑ j ∈ S , j ≠ i ( r j − r i ) ∥ c=\frac{1}{|S| \cdot\left\|r_{i}\right\|}\left\|\sum_{j \in S, j \neq i}\left(r_{j}-r_{i}\right)\right\| c=∣S∣⋅∥ri∥1∥ ∥∑j∈S,j=i(rj−ri)∥ ∥
- 这个曲率会和一个阈值进行比较,大于阈值就是角点,小于阈值就是面点。
- 把每个scan分成6段子图,则每个子图就是300*16,在每个子图中分别选取角点2个、面点4个、弱角点40个和弱面点80个。
C.前端里程计
任务还是估计相邻帧之间的位姿估计,估计的方法是在相邻帧之间做点到线的约束和点到面的约束,与LOAM一致。
在LOAM上的改进:
- 基于标签的匹配:在特征提取部分提取的特征点都会有个标签(分割的时候分配的),
因此在找对应点时,标签必须一致;
对于面点,仅在上一帧中找地面点与之匹配;
对于角点在上一帧对应的标签中找对应角点;这样会提高精度。 - 两步LM优化:首先做地面点优化,再做角点优化
第一步:通过当前帧地面点和上一帧匹配的地面点估计出 [ t z , θ r o l l , θ p i t c h ] [t_z, θ_{roll}, θ_{pitch}] [tz,θroll,θpitch];
第二步:通过当前帧角点和上一帧匹配的角点估计出 [ t x , t y , θ y a w ] [t_x, t_y, θ_{yaw}] [tx,ty,θyaw],并利用第一步得到 [ t z , θ r o l l , θ p i t c h ] [t_z, θ_{roll}, θ_{pitch}] [tz,θroll,θpitch];
虽然第一步中就可以估计出 [ t x , t y , θ y a w ] [t_x, t_y, θ_{yaw}] [tx,ty,θyaw],但是精度不高,不能用于第二步的估计,最后两步估计的结果加起来及时6自由度结果 - 通过这种方式的优化,计算时间比原始LOAM减少35%
D.激光雷达建图
与LOAM的区别:
- 存储地图
- loam是通过栅格地图进行局部地图管理,LeGO-LOAM是通过关键帧概念进行局部地图管理,保存了激光雷达一些帧,和该帧的位姿。
- 局部地图建立是通过根据当前帧的位置,提取与当前帧位置小于100m的关键帧拼接在一起作为局部地图。
E.回环检测~回环优化
回环检测方法:就是通过检测历史帧的位姿和当前帧的位姿比价接近,则认为形成一个回环。(因为激光雷达里程计在短时间内漂移比较小)
优化方法:就是通过ICP计算历史帧和当前帧的位姿变换,然后通过LM优化方法(GT-SAM)
对应的代码逻辑梳理会在后续博客笔记中呈现