当前位置: 首页 > news >正文

LiDAR SLAM 闭环——BoW3D论文详解

标题:BoW3D: Bag of Words for Real-Time Loop Closing in 3D LiDAR SLAM

作者:Yunge Cui,Xieyuanli Chen,Yinlong Zhang,Jiahua Dong,Qingxiao Wu,Feng Zhu

机构:中科院沈阳自动化研究所

来源:2022 RAL

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

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描述符的核心思想是使用邻域信息来表示当前关键点(在图2中,用黑色周围的关键点表示黑的关键点),其灵感来自2D图像特征SIFT [24]和ORB [25]。

        LinK 3D关键点提取提取的是edge点。LinK 3D是轻量级的,平均需要32 ms从64射线激光束收集的点云中提取特征,当在配备英特尔酷睿i7@2.2 GHz处理器的笔记本电脑上执行时。

        LinK 3D描述符由180维向量表示。描述符的每个维度对应于扇区区域。第一维度对应于最接近的关键点所在的扇区区域,而其他维度对应于以逆时针顺序排列的区域。

        我们将BoW 3D嵌入到循环关闭线程中,该线程关闭循环并获得全局一致的SLAM结果。。

图 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估计机器人的位姿。

        第三部分:使用所提出的BoW3D来检测环路闭合并校正环路姿势。如果检测到并优化了循环,则循环关闭将向映射算法给予反馈并更新局部映射,这为后续步骤提供了更准确的估计。

图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回环的贡献。

相关文章:

LiDAR SLAM 闭环——BoW3D论文详解

标题:BoW3D: Bag of Words for Real-Time Loop Closing in 3D LiDAR SLAM 作者:Yunge Cui,Xieyuanli Chen,Yinlong Zhang,Jiahua Dong,Qingxiao Wu,Feng Zhu 机构:中科院沈阳自动化研究所 来源:2022 RAL 现算法已经开源&#…...

Android NTP时间同步源码分析

Android NTP时间同步源码分析 Android系统设置自动时间后,如果连接了可用的网络。会同步网络时间。这个处理是 NetworkTimeUpdateService完成的。某些定制化的系统,需要禁止网络时间同步。比如仅仅使用GPS时间。基于Android9,分析一下 Andro…...

数据库之MySQL字符集与数据库操作

目录 字符集 CHRARCTER SET 与COLLATION的关联 CHRARCTER SET 定义 基础操作 查看当前MySQL Server支持的 CHARACTER SET 查看特定字符集信息(主要包含默认的COLLATION 与 MAXLEN) COLLATION 定义 COLLATION后缀 基础操作 查看MySQL Server支持的…...

搜索引擎概念解析

搜索引擎概念解析 什么是搜索引擎 MySQL搜索引擎举例 搜索引擎是一种用于在互联网上搜索并呈现相关信息的工具。它通过自动扫描和索引大量网页内容,并根据用户提供的关键词或查询条件,返回与之相关的网页链接和摘要。 当用户在搜索引擎中输入关键词或…...

网页链接投票链接步骤公众号投票链接制作制作投票

大家在选择投票小程序之前,可以先梳理一下自己的投票评选活动是哪种类型,目前有匿名投票、图文投票、视频投票、赛事征集投票等。 我们现在要以“笛乐悠扬”为主题进行一次投票活动,我们可以在在微信小程序搜索,“活动星”投票小程…...

【通信安全CACE-管理类基础级】第7章 安全运维

资源 中国通信企业协会网络安全人员能力认证考试知识点大纲 中国通信企业协会网络安全人员能力认证管理类基础级考试课件 中国通信企业协会网络安全人员能力认证考试管理类基础级复习资料 中国通信企业协会网络安全人员能力认证考试管理类基础级模拟题 系列文章 【通信安全CAC…...

随手笔记——将ROS图像话题转为OpenCV图像格式处理后再转为ROS图像话题发布(Python版)

随手笔记——将ROS图像话题转为OpenCV图像格式处理后再转为ROS图像话题发布(Python版) 说明关键函数代码 说明 将ROS图像话题转为OpenCV图像格式处理后再转为ROS图像话题发布,主要通过CvBridge的cv2_to_imgmsg和imgmsg_to_cv2函数&#xff0…...

Win11系统如何安装Oracle数据库(超级详细)

前言:在我们安装Oracle之前我们得理解Oracle数据库的优点是什么: Oracle是一个功能强大、可扩展和全面的数据库平台,具有广泛的功能和企业级能力,适用于处理复杂的企业级应用和大型数据集。 目录 一.下载Oracle数据库软件&…...

【代理服务器】Squid 反向代理与Nginx缓存代理

目录 一、Squid 反向代理1.1工作机制1.2反向代理实验1.3清空iptables规则,关闭防火墙1.4验证 二、使用Nginx做反向代理缓存服务器三CDN简介3.1什么是CDN3.1CDN工作原理 一、Squid 反向代理 如果 Squid 反向代理服务器中缓存了该请求的资源,则将该请求的…...

目标检测之遮挡物体检测

一、遮挡的类别 类内遮挡,目标被同一类别的目标遮挡类间遮挡,目标被其它类别的目标遮挡 二、解决方法 数据标注 精调遮挡目标的GT边界框 数据增强 cutout:在训练时,随机mask目标,提升模型对遮挡的应对能力mosaic…...

Vim 命令大全

文章目录 Vim 命令大全移动光标编辑文本查找和替换保存和退出打开多个文件:在文件之间切换:打开新窗口切换窗口其他常用命令 Vim 命令大全 移动光标 h: 左移光标j: 下移光标k: 上移光标l: 右移光标0: 移动光标到行首$: 移动光标到行末G: 移动光标到文件…...

【Visual Studio】printf() 函数无输出显示问题。使用 C++ 语言,配合 Qt 开发串口通信界面

使用 C 语言,配合 Qt 开发串口通信界面时,遇到 printf() 函数无输出显示。 在工程属性的对应位置添加 editbin /SUBSYSTEM:CONSOLE $(OUTDIR)\$(ProjectName).exe 即可,如下图所示。 成功运行的截图如下: Ref. Visual Studio 20…...

Linux安装配置Oracle+plsql安装配置(详细)

如果觉得本文不够详细,没有效果图,可移步详细版: Linux安装配置Oracleplsql安装配置(超详细)_超爱慢的博客-CSDN博客 目录 1.安装虚拟机系统 1.安装虚拟机 2.配置虚拟机 1.设置机器名 2.修改域名映射 3.固定IP…...

软件UI工程师的职责模板

软件UI工程师的职责模板1 职责: 1.负责产品的UI视觉设计(手机软件界面 网站界面 图标设计产品广告及 企业文化的创意设计等); 2.负责公司各种客户端软件客户端的UI界面及相关图标制作; 3.设定产品界面的整体视觉风格; 4.为开发工程师创建详细的界面说明文档&…...

【Python】Selenium操作cookie实现免登录

文章目录 一、查看浏览器cookie二、获取cookie基本操作三、获取cookie并实现免登录四、封装成函数 一、查看浏览器cookie cookie、session、token的区别: cookie存储在浏览器本地客户端,发送的请求携带cookie时可以实现登录操作。session存放在服务器。…...

【数据结构与算法篇】之时间复杂度与空间复杂度

【数据结构与算法篇】之时间复杂度与空间复杂度 一、时间复杂度1.1时间复杂度的定义1.2 常见的时间复杂度的计算1.2.1 常数时间复杂度( O ( 1 ) ) O(1)) O(1))1.2.2 线性时间复杂度( O ( N ) O(N) O(N))1.2.3 对数时间复杂度( O (…...

硬件性能 - 网络瓶颈分析

简介 本文章主要通过Linux命令查看网络信息、判断是否出现网络瓶颈等简单分析方法。其他硬件性能分析如下: 1. 硬件性能 - CPU瓶颈分析 2. 硬件性能 - 掌握内存知识 3. 硬件性能 - 磁盘瓶颈分析 目录 1. 监控命令 sar 2. 带宽利用率 3. 网络延迟 4. 网络连接数 …...

stm32驱动MCP2515芯片,项目已通过测试

最近公司做一个项目,需要3路can通道,但是stm32看了很久,最多也就只有2个can,所以找到了一款MCP2515芯片,可以用spi驱动can。 已经实现了can的发送和接收,接收采用的是外部中断接收的方式。和单片机本身带的…...

Nginx部署前后端分离项目

dev.env.js解释 //此文件时开发环境配置文件 use strice//使用严格模式 const merge require(webpacl-merge)//合并对象 const prodEnv require(./prod.env)//导出 module.exports merge(prodEnv,{//合并两个配置文件对象并生成一个新的配置文件,如果合并的过程…...

pytorch多分类问题 CrossEntropyLoss()函数的输入size/shape不一致问题

在使用pytorch实现一个多分类任务的时候,许多多分类任务在训练过程中都会有如下的代码: criterion nn.CrossEntropyLoss() loss criterion(output, target) # output.size : [batch_size, class_num] # target.size : [batch_size]许多的初学者会卡在…...

硬盘或者U盘提示需要格式化的解决办法

插入硬盘之后提示: 使用驱动器 G:中的光盘之前需要将其格式化 是否要将其格式化? 如下图所示 顿时慌了啊,里面还有比较重要的东西呢,这一下子完蛋? 遇事找某宝,上面估计有这种技术服务。果然有这一类的技术服务&…...

Clip-Path

前言 借助clip-path,我们可以实现一些复杂的animation动画效果,我们先来简单概述一下它的特性,如MDN所描述的。 The clip-path CSS property creates a clipping region that sets what part of an element should be shown. Parts that are inside the region are shown, whi…...

Matlab绘图系列教程-Matlab 34 种绘图函数示例(下)

Matlab绘图系列教程:揭秘高质量科学图表的绘制与优化 文章目录 Matlab绘图系列教程:揭秘高质量科学图表的绘制与优化第一部分:入门指南1.1 简介关于本教程的目的与范围Matlab绘图在科学研究中的重要性 1.2 准备工作安装Matlab及其工具箱 1.3 …...

【Vue+Django】Training Management Platform Axios并发请求 - 20230703

需求陈述 由于API是特定单位/特定类别/特定教学方式的数据,故汇总数据需要循环请求不同单位/不同类别/不同教学方式。 技术要点 1.axios并发请求 2.JS for循环 3.Vue数组中出现 ob :Observer无法取值问题的解决方法 4.将数据转化为数组 5.一次请求所有数据后&…...

smart Spring:自定义注解、拦截器的使用(更新中...)

文章目录 〇、使用自定义注解的好处和工作原理一、如何使用自定义注解1.自定义一个注解2.在类、属性、方法上进行使用3.元注解 二、使用拦截器的好处和工作原理三、如何使用拦截器参考 本博客源码: 〇、使用自定义注解的好处和工作原理 自定义注解是Java语言提供的…...

php导出pdf

插件官网:TCPDF 博主用的是tp6框架 、tcpdf插件 composer require tecnickcom/tcpdf --ignore-platform-reqs 后面是忽略平台要求的参数 ---------------中文乱码start------------------ 关于中文乱码问题: 网上说的下载字体放入fonts 利用tools…...

【ECMAScript6_2】字符串

1、字符的Unicode表示法 ES6 加强了对 Unicode 的支持,允许采用\uxxxx形式表示一个字符,其中xxxx表示字符的 Unicode 码点。(\u0000-\uFFFF) 码点超过取值范围之后不能正确解读,但是只要给码点加上{}就可以正确解读。 …...

37.RocketMQ之Broker消息存储源码分析

highlight: arduino-light 消息存储文件 rocketMQ的消息持久化在我们在搭建集群时都特意指定的文件存储路径,进入指定的store目录下就可以看到。 下面介绍各文件含义 CommitLog 存储消息的元数据。produce发出的所有消息都会顺序存入到CommitLog文件当中。 CommitLog由多个文件…...

RabbitMq应用延时消息

一.建立绑定关系 package com.lx.mq.bind;import com.lx.constant.MonitorEventConst; import lombok.extern.slf4j.Slf4j; import org.springframework.amqp.core.*; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annota…...

【WEB自动化测试】- 浏览器操作方法

一、常用方法 1. maximize_window() 最大化窗口 (重点) 说明:如果能够在打开页面时,全屏显示页面,就能尽最大可能加载更多的页面,提高可定位性 2. set_window_size(width, height) 设置浏览器窗口的大小 (了解) 场景&#xff1…...