LiDAR SLAM 闭环——BoW3D: Bag of Words for Real-time Loop Closing in 3D LiDAR SLAM

先说总结

现算法已经开源,代码链接:

GitHub - YungeCui/BoW3D: [RA-L] BoW3D: Bag of Words for Real-Time Loop Closing in 3D LiDAR SLAM.

背景 

        SLAM(同时定位与地图构建)是一种让机器人在构建环境地图的同时,定位自己位置的算法。然而,因为传感器误差的存在,机器人的移动和旋转估计会有误差,会引发所谓的漂移问题,导致地图失真。这就需要引入回环检测,即判断机器人是否返回到了之前探索过的地方,这样可以纠正因误差累积引起的地图和位置偏差,增加地图精度和鲁棒性,对于SLAM的全局一致性至关重要。

原文链接:

[2208.07473] BoW3D: Bag of Words for Real-Time Loop Closing in 3D LiDAR SLAM (arxiv.org)

1. 摘要

      回环是用于自主移动的系统的同时定位和映射(SLAM)的基本部分。在视觉SLAM领域,词袋(Bag of Words,BoW)在闭环方面取得了巨大的成功。用于环路搜索的BoW特征也可以用于随后的6-DoF环路校正。然而,对于3D LiDAR SLAM,现有技术的方法可能无法真实的有效地识别环,并且通常不能校正完整的6-DoF环姿态。为了解决这个限制,我们提出了一种新的词袋实时循环关闭3D激光雷达SLAM,称为BoW 3D。我们的方法不仅有效地认识到重访的循环的地方,但也纠正了完整的6自由度循环的姿态实时。BoW 3D基于3D LiDAR特征LinK 3D构建词袋,该特征高效、姿态不变,可用于精确的点对点匹配。此外,我们将我们提出的方法嵌入到三维激光雷达里程计系统,以评估闭环性能。我们在公共数据集上测试了我们的方法,并将其与其他最先进的算法进行了比较。BoW 3D在大多数场景下在F1 max和扩展精度得分方面表现出更好的性能。值得注意的是,BoW 3D在配备英特尔酷睿i7@2.2 GHz处理器的笔记本电脑上执行时,平均需要48 ms来识别和纠正KITTI 00上的环路(包括4K+ 64射线LiDAR扫描)。我们在这里发布方法的实现:https://github.com/YungeCui/BoW3D。

2. 主要内容

2.1 LinK3D特征

        在这项工作中,提出的BoW 3D基于LinK 3D [10]功能。LinK 3D由三个部分组成:关键点提取、描述符生成和特征匹配。如图2所示,LinK 3D描述符的核心思想是使用邻域信息来表示当前关键点,其灵感来自2D图像特征SIFT [24]和ORB [25]。LinK 3D描述符由180维向量表示。描述符的每个维度对应于扇区区域。第一维度对应于最接近的关键点所在的扇区区域,而其他维度对应于以逆时针顺序排列的区域。LinK 3D是轻量级的,平均需要32 ms从64射线激光束收集的点云中提取特征,当在配备英特尔酷睿i7@2.2 GHz处理器的笔记本电脑上执行时。我们将BoW 3D嵌入到循环关闭线程中,该线程关闭循环并获得全局一致的SLAM结果。应用于快速3D配准。有关LinK 3D的更多详细信息,请参阅其原始论文[10]。

图 2. 我们的 LinK3D 核心理念以及基于我们的 LinK3D 对两次激光雷达扫描的匹配结果。绿色线条表示有效的匹配。当前关键点的描述符是由其邻近关键点表示的。描述符的每个维度对应一个扇区区域。第一维对应当前关键点最近的关键点所在的扇区区域,其他的则按逆时针顺序对应到各区域。如果一个扇区区域内有关键点,就搜索该扇区区域内最近的关键点,并用它来表示描述符的对应维度。

2.2 词袋模型

        在2D图像领域,单词袋(BoW)[4]用于通过检索2D特征(如SIFT [24],ORB [25]等)来识别重访地点。特别是,二进制ORB特征的BoW数据库已成功地应用于实时位置识别任务。BoW在从训练图像数据集提取的一组描述符上的离线步骤中创建了一个树结构的视觉词汇表。当处理新图像时,词汇表将图像的提取特征转换为低维向量,包含术语频率和逆文档频率(tf-idf)[9]分数。tf-idf分数通过以下公式计算:

tf\text{-i}df=\frac{n_{wi}}{n_{i}}log\frac{N}{n_{w}}

        其中nwi表示图像Ii中单词w的数量,ni表示Ii中单词的总数,N是迄今为止看到的图像的总数,并且nw表示包含单词w的图像的数量。idf的思想是,一个词在所有图像中出现的次数越少,最终得分就越高,这表明这个词有更高的辨别力。tf-idf得分越高,图像中单词的频率越高。如果单词的得分足够高,则计算该单词与数据库中的单词之间的相似度。如果在数据库中存在相似的词,则使用倒排索引来搜索对应的图像。

词频TF定义
一个特征在一幅图里面的数量较多,那么这个特征对于这个图像来说就有较高的权重。

\mathrm{TF}=\frac{numberofwordwinimageI}{numberofallwordsinimageI}

逆向文本频率定义(IDF)

\mathrm{IDF}=\log\frac{numberofallimages}{numberofimagescontainingwordw}

如果一个特征在很多图像中出现,那么这个特征的区分度就比较低;相反,如果一个特征在较少的图像中出现,则有较大的区分度

\mathrm{TF-IDF=TF*IDF}

逆向索引主要记录某个单词在哪些图像中出现,以及这些单词的权重。

3. 方法

        在本节中,我们将介绍基于BoW 3D的闭环系统。为了在实践中验证BoW 3D的性能,将闭环系统嵌入到最先进的A-LOAM 6 [14]中。如图所示1。提出的系统主要由三部分组成。它首先提取原始点云中的LinK 3D特征。然后,它使用A-LOAM估计机器人的位姿。第三部分使用所提出的BoW 3D来检测环路闭合并校正环路姿势。如果检测到并优化了循环,则循环关闭将向映射算法给予反馈并更新局部映射,这为后续步骤提供了更准确的估计。

图1.我们系统的工作流程主要由三个模块组成:(i)特征提取; (ii) A-LOAM测程和绘图;(iii)闭环。我们将BoW 3D嵌入到循环关闭线程中,该线程关闭循环并获得全局一致的SLAM结果。

3.1 BoW3D Algorithm

        在本节中,我们介绍所提出的BoW 3D算法。如第III-A节中所介绍的,LinK 3D描述符的每个维度表示对应区域中的特定关键点,这使得LinK 3D描述符具有很强的区分性。内存中数据库的结构如图所示3中,哈希表用于在单词单词出现的位置之间建立一对一的映射。哈希表的计算成本理论上为O(1),这使得它适合于高效的检索。如图所示3、BoW 3D词汇表中的单词由两部分构成:一是LinK 3D的非零维数;另一个是词所在的对应维度。地点(点云框架)也由两部分组成:一个是帧Id;另一个是帧中的描述符ID。

图3. BoW3D的数据结构(本身就是个哈希表啊)哈希表用于检索。BoW3D的单词由描述符中的非零值(Dim-value)和相应的维度(Dim-ID)组成。每个单词对应一个地点集,在其中出现了该单词。地点也由两部分组成,一部分是帧ID,另一部分是帧中的描述符ID。

1)检索算法:对于LinK3D描述符的单词,我们检索单词并计数每个位置(点云帧)出现的频率。如果最高的一个大于频率阈值Thf,则该地点被认为是候选地点。此外,为了快速检索,使用逆文档频率(idf)来避免检索出现在多个地方的单词。更具体地说,由于这些词出现的频率明显高于其他词,因此它们的区分度较低,降低了检索效率。因此,我们定义了一个类似于idf的比率因子来衡量当前集合中的位置数与所有集合中的平均值之间的差异。我们用它来确定在计算位置数时是否应该保留当前单词的位置集。该比率定义如下:

ratio=N_{set}/(\frac{N}{n_{w}})

        其中Nset是当前集合中的位置的数量。N/nw表示一个位置集合的数量平均值,nw是词汇表中的单词数量,N是到目前为止看到的位置的总数。如果位置集合的比率大于阈值Thr,则该位置集合将不被用于计数。检索算法如算法1所示。

 2) 回环校正:回环校正用于为后端的姿态图优化提供约束。首先基于LinK3D的匹配结果计算循环的观测约束,然后使用RANSAC [12]来去除mismatches。我们遵循[13Least-squares fitting of
two 3-d point sets]中的方法来计算循环姿态Tlc,其是loop frame回环帧 l 与当前帧 c 之间的估计。

        给定当前帧的点集{S }c和循环帧的匹配点集{S }l,我们通过最小化以下成本函数来计算循环:

r_{l,c}(\boldsymbol{R}_{l,c},\boldsymbol{t}_{l,c})=\frac{1}{2}\sum_{i=1}^{n}\|s_{l}^{i}-\left(\boldsymbol{R}_{l,c}s_{c}^{i}+\boldsymbol{t}_{l,c}\right)\|^{2}

        其中$s_l^i \in\{S\}_l$$\boldsymbol{s}_c^i \in\{S\}_c$是对应的匹配点。\boldsymbol{R}_{l,c}t_{l,c}分别T_{l,c}是变换的旋转和平移。T_{l,c}定义如下:

T_{l,c}=\begin{bmatrix}R_{l,c}&t_{l,c}\\\\\mathbf{0}^T&1\end{bmatrix}

        我们首先根据\{S\}_{l}\{S\}_{c}计算质心s_{\boldsymbol{l}}s_{\boldsymbol{c}}。设\hat{s}_l^i\hat{s}_{c}^{i}是对应点s_{l}^{i}s_{c}^{i}的坐标,其分别去除了中心点s_{\boldsymbol{l}}s_{c}。然后我们计算矩阵:

\boldsymbol{W}=\sum_{i=1}^n\boldsymbol{\hat{s}}_l^i\boldsymbol{\hat{s}}_c^{iT}

求W的SVD分解

W=U\boldsymbol{\Sigma}\boldsymbol{V}^T

如果W是满秩的,则我们将通过下式得到Rl,c和tl,c的解:

\begin{aligned}R_{l,c}&=\boldsymbol{VU}^T,\\t_{l,c}&=s_l-R_{l,c}s_{c}.\end{aligned}

        这使我们能够校正回路姿势。此外,循环姿态还用于候选循环帧的几何验证,并且我们设置距离阈值Thdis来验证候选循环是否有效。

3)更新算法:我们提出了一个更新算法来添加新的单词和地方的数据库。为了提高更新和检索的效率,我们只向数据库中添加一定数量的特征。描述符基于其对应关键点与LiDAR中心之间的距离来选择。具体地,Specifically, only a certain number of closer  features are added to the database。类似地,当检索环时,使用一定数量的更接近的特征来检索。更新算法在算法2中示出。

 3.2 回环优化

        在校正循环姿态之后,构建循环帧的姿态图以用于后续循环优化。姿态图的顶点是要优化的全局姿态。位姿图的边(顶点之间的连接)是观察约束,其由连续帧之间的相对位姿和校正的环位姿组成。我们将帧i和j之间的残差定义为:

r_{i,j}(T_{w,i},T_{w,i})=\ln(T_{i,j}^{-1}T_{w,i}^{-1}T_{w,j})^\vee

        通过最小化以下成本函数来优化姿态图:

\min_T\left\{\sum_{(i,j)\in S}\|r_{i,j}\|^2+\sum_{(i,j)\in L}\|r_{i,j}\|^2\right\},

        其中S是所有顺序边的集合,L是所有环闭合边的集合。我们使用在图优化器g2 o [38]中实现的Levenberg-Marquadt方法来解决优化问题。在姿态优化之后,我们更新映射线程的局部地图。具体地,基于优化的全局姿态更新局部地图中的点,其更准确。这可以确保后续估计的全局一致性。

特别致谢

        中科院沈自所的崔芸阁博士,感谢您为激光SLAM回环的贡献。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/8082.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring整合Junit单元测试

1.Spring整合Junit单元测试 1.1 原始Junit测试Spring的问题 在测试类中,每个测试方法都有以下两行代码: ApplicationContext ac new ClassPathXmlApplicationContext("application.xml");BookDao bookDao (BookDao)ac.getBean("bookDa…

Angular 调试 —— 一个真实的多重循环导致的Bug

导致性能问题的原因可能很复杂&#xff0c;也可能很简单&#xff0c;今天让我们来看一个现实的例子。一个多重循环导致列表卡死。 startDemo() {this.processing true// 创建复杂数据结构const data [];for (let i 0; i < 5000; i) {const innerArray [];for (let j …

(小程序)uniapp调接口完整流程

(小程序)uniapp调接口完整流程 代码&#xff1a; <script lang"ts" setup>import { ref } from "vue"; const form ref({searchVal: "", });//搜索const searchClick () > {console.log(form.value.searchVal)let data {text: form…

git merge 和git rebase的区别

文章目录 1. 概念2. git merge2.1. 示例 3. git rebase3.1. 示例 4. 总结 1. 概念 在Git版本控制系统中&#xff0c;有两种方式可以将一个分支的更改合并到另一个分支&#xff1a;git merge 和 git rebase。虽然它们都可以完成相同的任务&#xff0c;但它们的实现方式有所不同…

软考:中级软件设计师:计算机存储结构,cache,局部性原理,RAM和ROM,磁盘结构和计算

软考&#xff1a;中级软件设计师:计算机存储结构 提示&#xff1a;系列被面试官问的问题&#xff0c;我自己当时不会&#xff0c;所以下来自己复盘一下&#xff0c;认真学习和总结&#xff0c;以应对未来更多的可能性 关于互联网大厂的笔试面试&#xff0c;都是需要细心准备的…

用git下载gitee上的项目资源

目录 用git下载gitee上的项目资源 用git 的clone 命令 然后到gitee上复制相关的下载地址&#xff1a; 粘贴到clone后面即可&#xff08;注意地址与clone之间有空格&#xff01;&#xff01;&#xff01;&#xff09; 运行结果&#xff1a; 用git下载gitee上的项目资源 用git…

软件设计模式与体系结构-设计模式-行为型软件设计模式-迭代器模式

行为型软件设计模式 概述 行为型设计模式是软件设计模式中的一类&#xff0c;用于处理对象之间的交互和通信。这些模式关注的是对象之间的行为和职责分配。以下是几种常见的行为型设计模式&#xff1a; 观察者模式&#xff08;Observer Pattern&#xff09;&#xff1a;定义了…

【CEEMDAN-VMD-GRU】完备集合经验模态分解-变分模态分解-门控循环单元预测研究(Python代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

【随手记】使用Flask做代理为虚拟机提供pip源

最近在重做虚拟机环境&#xff0c;虚拟机不可连外网&#xff0c;最初python包都是通过离线whl进行安装。但是离线文件已经找不到了&#xff0c;不想重新去一个个下载&#xff0c;而且本地环境跟虚拟机环境也不一致&#xff0c;pip download可能会遇到版本问题&#xff0c;遂考虑…

【对象存储】那些事

最近在某个项目中使用了对象存储。以前看过一个新闻&#xff1a;某公司的对象存储被盗刷&#xff0c;一夜之间账户欠费几十万&#xff01;我们这点小买卖可经不起这么折腾&#xff01;所以下功夫研究了下&#xff0c;防患于未然。 说到防盗刷&#xff0c;我们还得了解对象存储是…

前端实战——尚品汇(网页开发)

/* 基础设置 */ .container {width: 1190px;margin: 0 auto; } /* #region顶部导航条start */ .topbar {height: 30px;background-color: #ececec; } .welcome {height: 30px;line-height: 30px;font-size: 0;color: #666; } .welcome span,.welcome a {font-size: 12px; } .we…

(五)python实战——使用sqlalchemy完成Sqlite3数据库表的增、删、查、改操作案例

前言 本节内容我们使用sqlalchemy框架完成Sqlite3数据库表的增删查改等常规操作&#xff0c;相较于原生Sqlite的数据库操作&#xff0c;sqlalchemy通过ORM映射完成实体对象的映射&#xff0c;通过映射关系完成对象和数据的转换&#xff0c;完成数据的操作。 正文 ①在项目中…