0. 简介
与传统的回环检测方法相比,SC它给激光回环带来了更多的可能性,我们将在这里SC顺便说一分析,顺便为前两篇文章填坑。LEGO-LOAM改进思路和代码, SC-LEGO-LOAM 扩展和深入分析。Scan Context 它包括空间描述子的定义方法和相应的匹配算法。并提供高效 bin 编码函数,对点云密度和方向的变化不敏感。另外SC与其他空间描述子相比,它还保存了点云的内部结构,并采用了有效的两阶段匹配算法。
1. Scan Context 论文相关
基于 Scan Context 位置识别方案的总体流程如下图所示: 流程如下:
- 一帧点云先 SC(Scan Context)的计算
- 从这个帧点云 SC 中提取一个 N 在 KD 在树上搜索类似的关键帧
- 搜索获得的参考帧 SC 与待匹配的当前帧进行比较。如果比较得分高于一定阈值,则认为找到回环
1.1 Scan Context 计算
计算 SC 主要过程如下:
- 点云划分 将一帧 3D 点云根据传感器坐标系中的方位角和半径均匀划分 bin,如上图所示,从方位角看点云云 N s N_s Ns 个扇面(Sector),点云从半径反向分为 N r N_r Nr个环(Rings),每个扇面和环相交的部分是一个 bin。从点云的最大检测距离和扇面/环的数量可以计算出每个扇面和环的宽度(分辨率)。 从这种划分方式不难发现,距离很远 Bin 与距离较近的相比 Bin 它会稍微宽一点。这种划分的优点是可以动态调整不同距离的点云密度。对于更近的地方,点云密度通常更高,所以我们 Bin 相反,对于较远的地方,点云会比较稀疏。 Bin 取宽一点可以容纳更多点。 每开每一个环可以得到一个 N r × N s N_r\times N_s Nr×Ns/span> 的二维图像,每个像素点 P i j P_{ij} Pij 是第 i i i 个环第 j j j 个扇面对应的 Bin,如上图 b 中所示。这就是 SC 的表现形式,因此下一步要做的就是每个 Bin 分配一个值 ϕ ( P i j ) \phi(P_{ij}) ϕ(Pij)。
- 给每个 Bin 分配一个数作为标识,SC 中用每个 Bin 的点中最大的高度作为该 Bin 的标识,对于没有任何点的 Bin 则用 0 作为标识。即: ϕ ( P i j ) = max p ∈ P i j z ( p ) \phi(P_{ij}) = \max_{\boldsymbol{p}\in P_{ij}}z(\boldsymbol{p}) ϕ(Pij)=maxp∈Pijz(p) 从上图中不难看到,虽然 SC 在空间上来看是一个圆,应该有旋转不变性。但我们按照 0 − 2 π 0 - 2\pi 0−2π 展开成 2D 图像后,SC 对 Lidar 的朝向就变得敏感了。朝向稍微偏几度可能整体图像就有比较大的平移从而不相似了,为了解决这个问题,作者对图像进行 N t r a n s = 8 N_{trans} = 8 Ntrans=8 次平移,通过这种方法来包含 Lidar 在不同朝向下的 SC。
1.2 N r N_r Nr(Rings)的快速搜索算法
目前主流方法中,在搜索相似帧中主要有三个主要流程:计算相似性、最近邻搜索、稀疏性优化。SC 方案中将计算相似得分和最近邻搜索结合成一步,有效降低了搜索时间。 由于,SC 中的距离计算相较于其他全局描述子较重,因此作者通过引入 Ring Key 提供了一个两阶段的层次搜索算法。Ring Key 是从 SC 中提取出来的一个旋转不变性的描述子。对 SC 中的每一行 r r r 使用一个环编码函数 (Ring encoding function) ψ \psi ψ 来分配一个值作为标识。然后每个环的值组合成一个 N r N_r Nr维的向量作为 Ring Key。 ψ \psi ψ 为:
ψ ( r i ) = ∣ ∣ r i ∣ ∣ 0 N s \psi(r_i) = \frac{||r_i||_0}{N_s} ψ(ri)=Ns∣∣ri∣∣0
简单来说,Ring Key 的计算方式,计算每个环(行)的密度(有值的像素除以总像素数),然后把不同环的密度组合在一起。显然这种方式提供了旋转不变性。因为无论 Lidar 怎么转只会造成图像平移,对每一行的密度不会有影响。
1.3 Scan Context 的相似性比较
给定两个 SC,需要有一个方式来判断这两个地方的相似性。设 I q , I c I^q, I^c Iq,Ic为待比较的两帧点云的 SC。论文中用的方法主要是按列进行比较,对两个 SC 中的每一对对应的列向量(Column Vector)计算出一个距离,对一个列的距离方式维计算两个列向量之间的 cos 距离,整个 SC 的距离用各列的距离之和来表示。具体计算如下所示: d ( I q , I c ) = 1 N s ∑ j = 1 N s ( 1 − c j q c j c ∣ ∣ c j q ∣ ∣ ∣ ∣ c j c ∣ ∣ ) d(I^q, I^c) = \frac{1}{N_s}\sum_{j = 1}^{N_s}\left(1 - \frac{c^q_jc^c_j}{||c^q_j||||c^c_j||}\right) d(Iq,Ic)=Ns1j=1∑Ns(1−∣∣cjq∣∣∣∣cjc∣∣cjqcjc) 这种距离计算方式对动态物体比较有效,因为考虑整个 Sector,而不是集中在单个 Bin 的影响。但同样的,这种距离方式对雷达的视角一致要求很高,哪怕在同一个位置雷达视角有一点点不同,可能计算出来的距离都会差别很大。为了解决这个问题,论文中使用的方式进行暴力匹配各个列组合的可能性(对其中一帧进行 2 π N s \frac{2\pi}{N_s} Ns2π 次小旋转进行匹配),找出距离最小的组合。
2. 基于SC的回环检测
回环检测的大致流程是对每一个关键帧,在检测器中加入所需的信息,然后进行一次检测,获得当前关键帧对应的历史关键帧索引。对于激光建图来说,所需的信息无外乎是当前帧的点云以及对应的位姿估计。
…详情请参照古月居
} ``
3 参考链接
https://zhuanlan.zhihu.com/p/393353116
https://blog.csdn.net/wyang9x/article/details/117446642
https://www.cnblogs.com/chenlinchong/p/13154874.html
https://xiaotaoguo.com/p/lidar_loop_closure/
SC-LeGO-LOAM
SC-LIO-SAM
FAST_LIO_SLAM