0. 简介

各位也知道,我们在之前的博客中,介绍了很多回环的方法,比如Scan Context,Lris, BoW3D等方法。之前作者也在《重定位解析与思考》一文中,给到了一些回环检测算法的介绍。最近林博新开源了一个回环检测算法《STD: A Stable Triangle Descriptor for 3D place recognition》。我们从小乌坞博主中的实验中发现,确实效果不错,同时相关的代码也已经在Github上开源了。

图1。(a)显示从查询点云中提取的稳定三角形描述符(STD)。(b)显示从历史点云中提取的STD。(c)显示了这两帧点云之间STD匹配的示例。正确匹配的STD描述符由白色框标示,并且通过STD提供的姿态进行点云配准。这两帧点云是由一个小视场角激光雷达(Livox Avia)在相反方向移动收集的,导致点云重叠度低且视角变化剧烈(请查看我们的YouTube附带视频: youtu.be/O-9iXn1ME3g)。

1. 主要贡献

本文开发了一种新的描述符:STD,它用三角形对场景中的任意三个关键点进行编码。与其他描述符中使用的多边形相比,三角形更稳定,因为三角形的形状是根据边长(或夹角)唯一定义的。与关键点周围的局部描述符相比,三角形的形状完全是旋转和平移不变的。为了提取三角形描述符的关键点,作者在平面上进行点云投影,并在边界上提取关键点,然后将关键点组成三角形。匹配是基于三角形的相似度进行的。

典型的STD位置识别案例如图所示,在同一位置成功识别了两个从相反视角采集的点云。具体而言如下:

  • 设计了一个三角形描述符,这是一个六维向量,由三个三角形边的长度和法向量之间的夹角组成。描述子保持旋转和平移完全不变,同时保持高度的可区分性。
  • 提出了一种基于关键帧的快速关键点提取方法。为了表示场景的结构信息,将点云投影在平面边界处,并提取其中的关键点,这些关键点与相邻关键点形成三角形描述符。
  • 在多种类型的场景(城市、室内和非结构化环境)和不同的激光雷达数据(传统旋转激光雷达和固态激光雷达)下评估算法。充分的实验结果验证了该方法的有效性。

2. 主要方法

在后面几节中,我们描述如何从点云中提取稳定三角形描述符。接下来,我们介绍如何构建描述符字典以及如何选择环路候选项。最后,我们提出了基于RANSAC的环路检测和几何验证,用于完整的环路检测流程。我们的方法的整体流程如图2所示。

图2. 我们算法的工作流程。我们的方法从关键帧中计算三角形描述符。然后使用哈希表作为描述符的数据库,以进行快速存储和匹配。具有前10个描述符匹配分数的帧将被选为候选项。一旦通过几何验证,环路候选项将被视为有效的环路。在触发环路时,还将获得环路帧和候选帧之间的相对变换。

3. 稳定三角形描述符

受[26]的启发,为了提高分割的稳定性,我们在关键帧上执行环路检测,这些关键帧具有从几个连续的扫描中积累的点,因此具有增加的点云密度,而不管具体的LiDAR扫描模式。具体而言,我们使用LiDAR里程计[28]将每个新进入的点云注册到当前关键帧中。当子帧数累积到一定数量时,将创建一个新的关键帧。给定点云的关键帧时,我们首先通过区域生长进行平面检测。具体而言,我们将整个点云分成给定大小的体素(例如1m)。每个体素包含一组点p_i(i = 1,…,N);然后我们计算点协方差矩阵Σ

λ_k为矩阵Σ的第k大特征值。平面判定原则为:

其中σ_1σ_2是预设的超参数。根据这个判定标准,我们可以检查体素中的点是否形成一个平面,如果是,则称该体素为平面体素。然后,我们从任何一个平面体素开始初始化一个平面,并通过搜索其相邻的体素来扩展平面。如果相邻的体素是相同的平面(具有相同的平面法线方向,距离低于阈值),则它们将被添加到正在生长的平面中。否则,如果相邻的体素不在同一个平面上,则将其添加到平面的边界体素列表中。上述生长过程重复,直到所有添加的相邻体素被扩展,或者到达边界体素(参见图4)。

图4. 平面扩展过程

对于边界体素,我们将其包含的点投影到相应的平面上(参见图5(a)和图5(b))。对于每个平面,我们创建一个图像,其中图像平面与平面重合,每个像素表示包含在平面的边界体素中的点的最大距离。然后,我们选择一个点,在其5 * 5邻域中具有最大像素值,作为关键点(参见图5(c))。每个提取的关键点对应于输入点云中的一个3D点,并且可以附加其从中提取的平面的法线。

使用关键帧中提取的关键点,我们构建一个k-D树,并为每个点搜索20个近邻点以形成三角形描述符。具有相同边长的冗余描述符将被消除。每个三角形描述符包含三个顶点p_1p_2p_3,具有投影法线向量n_1n_2n_3。此外,三角形的顶点按照边长规则按升序排列(参见图3)。我们总结一个三角形描述符的内容如下:

  • p_1、p_2、p_3:三个顶点,

  • n_1、n_2、n_3:三个投影法线向量,

  • l_{12}、l_{23}、l_{13}:三个边,l_{12}≤l_{23}≤l_{13}

  • q:三角形的重心,

  • k:对应于描述符的帧号。

    除了描述符,我们还将保存从该关键帧提取的所有n个平面Π = (π_1,π_2,…,π_n),用于以下的几何验证步骤。

图5. (a) 边界体素中的点以黄色着色。(b) 将这些点投影到相邻的平面上(蓝色点)。(c)平面图像,其中每个像素表示边界体素中的点到平面的最大距离(以厘米为单位)。如果一个点在其5 * 5邻域中具有最大像素值,它将被视为关键点(红色点)。

4. 搜索环候选项 (比较重要的知识)

由于一个关键帧中可以提取出数百个描述子,为了快速查询和匹配描述子,我们使用哈希表来存储所有描述子。我们在描述子中使用具有旋转和平移不变性的六个属性来计算哈希键,这些属性是边长l_{12}、l_{23}、l_{13}以及法向量投影向量n_1·n_2,n_2·n_3,n_1·n_3的点积。具有所有六个类似属性的描述子将具有相同的哈希键,因此存储在同一个容器中。对于一个查询关键帧,我们提取其所有描述子,如3节所述。对于每个描述子∆_i,我们计算其哈希键,将其定位到哈希表中相应的容器,并为在此容器中具有描述子的关键帧投票一次。当查询关键帧中的所有描述子∆_i都被处理时,匹配过程结束。获得前10个票数的关键帧将被选为具有匹配描述子的候选项,并保存供环检测步骤使用。

备注1:由于边界点被投影到从3D点云中提取出的平面上,而不是像[16]中那样从范围图像中提取,因此提取出的关键点对视角变化具有不变性。此外,六个描述子属性对任何刚性变换也具有不变性。因此,整个方法具有旋转和平移不变性。

备注2:由于三角形边长的排序和三角形的稳定性,当且仅当它们的有序边长相等时,两个三角形才被保证相同,而无需枚举边的对应关系。

5. 回环检测

当给定一个回环候选关键帧时,我们进行几何验证以消除由于不正确的描述符匹配对而导致的误检。由于三角形的形状在确定了边长后是唯一确定的,因此一旦∆_a∆_b匹配,它们的顶点(p_{a_1},p_{a_2},p_{a_3})和(p_{b_1},p_{b_2},p_{b_3})自然匹配。然后,通过这个点对应,我们可以通过奇异值分解(SVD)轻松计算这两个关键帧之间的相对变换T =(R,t)

为了增加鲁棒性,我们使用RANSAC[29]来寻找最大化正确匹配描述符数量的变换。基于这个变换,我们计算当前帧和候选帧之间的平面重叠区域,用于几何验证。假设一个中心点g和一个法向量u表示一个体素中的平面π。将当前帧的平面组表示为^BΠ=[(^Bg_1, ^Bu_1), …, (^Bg_n, ^Bu_n)],候选帧的平面组表示为^C Π=[(^C g_1, ^C u_1), …, (^C g_m, ^C u_m)],刚体变换表示为^C_BT=(^C_BR, ^C_Bt)∈SE(3)),其中n是当前帧中平面的数量,m是候选帧中平面的数量。我们使用来自^C Π的中心点(^C g_1, ^C g_2, …, ^C g_m)构建一个k-D树(k=3)。然后对于每个平面中心点^Bg_i (i=1,2,…,n)∈^BΠ,我们首先通过变换^C_BT^Bg_i转换,然后在k-D树中搜索最近的点^C g_j,并通过法向量的差异和点到平面的距离来判断这两个平面是否重合。

其中σ_nσ_d是预设的超参数,用于确定平面是否重叠。如果一对平面满足方程(4)中的法向量和点到距离约束条件,则这对平面是重合的。在检查当前帧的所有平面后,我们计算平面重合的百分比(N_c):

其中,N_{coincide}是重合平面的数量,N_{sum}是当前帧所有平面的数量。如果当前帧和候选帧的N_c超过某个阈值σ_{pc},我们最终将其视为有效的闭环检测。值得注意的是,基于平面的几何验证比基于ICP的方法更高效,因为平面的数量要比点云的数量少得多。此外,我们可以进一步优化方程(4)中的法向量差异和点到平面距离,以获得更准确的闭环修正变换,这可以使用Ceres-Solver[30]轻松实现。我们将这个优化过程定义为STD-ICP,STD-ICP的性能将在实验中得到验证。

6. 参考链接

https://blog.csdn.net/qq_41898018/article/details/129559920

https://mp.weixin.qq.com/s/qj-D2548sz4dCr6MQ3v9mQ