第二天:ALOAM前端讲解
目标:
- 熟悉 ALOAM基本原理与代码框架,快速熟悉代码
ALOAM效果
内容:
- LOAM论文论文精讲
- 整体代码框架介绍
- 前端特征提取,点到线、点到面ICP代码讲解
ALOAM精讲
一、ALOAM整体架构
LOAM主要包含两个模块,一个是Lidar Odometry,即使用激光雷达做里程计计算两次扫描之间的位姿变换;另一个是Lidar Mapping,利用多次扫描的结果构建局部地图,通过scan2map优化帧间位姿轨迹。由于Mapping部分计算量较大,所以其计算频率较低。
二、特征提取
Lidar Odometry是通过Lidar的两次扫描匹配,计算两帧Lidar的位姿变换,用作前端里程计Odometry。既然是计算两次扫描的匹配,自然而然想到了经典的ICP算法。然而ALOAM并没有采用全部的激光点进行匹配,而是筛选出了两类特征点,分别是角点和平面点。
定义特征点:考虑单根线上当前点与其相邻点的关系。
怎么对边缘点和平面点进行分类呢?设 S 是第 k 帧点云数据中点 i 对应 X(k,i) 附近的一个连线点集合。定义一个 “距离值” C 来评估局部面的平滑度,用于边缘特征点和平面特征点和普通点的分类:
曲率点 i i i 周围连续几个点集合 S S S 用于求曲率。 S S S 中的点一半在 i i i 的一侧从而避免雷达顺时针和逆时针的影响。
c c c 只是作者定义的一个标准,反应平面的光滑度,也没有说是曲率。
计算当前点 i 与相邻点 j 的距离差的和,然后求平方,最后归一化。
c = 1 ∣ S ∣ ⋅ ∥ X ( k , i ) L ∥ ∑ j ∈ S , j ≠ i ∥ X ( k , i ) L − X ( k , j ) L ∥ (1) c = \frac{1}{|S| \cdot \left \| X_{(k,i)}^L \right \|} \sum_{j \in S, j \neq i} \left \| X_{(k,i)}^L - X_{(k,j)}^L \right \| \quad \text{(1)} c=∣S∣⋅
X(k,i)L
1j∈S,j=i∑
X(k,i)L−X(k,j)L
(1)
解读:
这个公式用于计算点 i i i 的曲率 c c c,曲率反映了点 i i i 附近局部区域的曲面变化情况。公式中的各个符号和运算意义如下:
- c c c:表示点 i i i 的曲率。
- ∣ S ∣ |S| ∣S∣:集合 S S S 中点的数量,集合 S S S 包含点 i i i 附近的所有点。
- X ( k , i ) L X_{(k,i)}^L X(k,i)L:点 i i i 在第 k k k 帧中的激光雷达坐标系下的坐标。
- ∥ X ( k , i ) L ∥ \left \| X_{(k,i)}^L \right \| X(k,i)L :点 i i i 的坐标的模,表示点 i i i 到激光雷达的距离。
- ∑ j ∈ S , j ≠ i \sum_{j \in S, j \neq i} ∑j∈S,j=i:对集合 S S S 中除点 i i i 以外的所有点 j j j 进行求和。
- ∥ X ( k , i ) L − X ( k , j ) L ∥ \left \| X_{(k,i)}^L - X_{(k,j)}^L \right \|