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分数通过以下公式计算:
其中nwi表示图像Ii中单词w的数量,ni表示Ii中单词的总数,N是迄今为止看到的图像的总数,并且nw表示包含单词w的图像的数量。idf的思想是,一个词在所有图像中出现的次数越少,最终得分就越高,这表明这个词有更高的辨别力。总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的比率因子来衡量当前集合中的位置数与所有集合中的平均值之间的差异。我们用它来确定在计算位置数时是否应该保留当前单词的位置集。该比率定义如下:
其中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,我们通过最小化以下成本函数来计算循环:
其中和
是对应的匹配点。
和
分别
是变换的旋转和平移。
定义如下:
我们首先根据和
计算质心
和
。设
和
是对应点
和
的坐标,其分别去除了中心点
和
。然后我们计算矩阵:
求W的SVD分解
如果W是满秩的,则我们将通过下式得到Rl,c和tl,c的解:
这使我们能够校正回路姿势。此外,循环姿态还用于候选循环帧的几何验证,并且我们设置距离阈值Thdis来验证候选循环是否有效。
3)更新算法:我们提出了一个更新算法来添加新的单词和地方的数据库。为了提高更新和检索的效率,我们只向数据库中添加一定数量的特征。描述符基于其对应关键点与LiDAR中心之间的距离来选择。具体地,Specifically, only a certain number of closer features are added to the database。类似地,当检索环时,使用一定数量的更接近的特征来检索。更新算法在算法2中示出。

3.2 回环优化
在校正循环姿态之后,构建循环帧的姿态图以用于后续循环优化。姿态图的顶点是要优化的全局姿态。位姿图的边(顶点之间的连接)是观察约束,其由连续帧之间的相对位姿和校正的环位姿组成。我们将帧i和j之间的残差定义为:
通过最小化以下成本函数来优化姿态图:
其中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函数࿰…...
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]许多的初学者会卡在…...
多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...
ES6从入门到精通:前言
ES6简介 ES6(ECMAScript 2015)是JavaScript语言的重大更新,引入了许多新特性,包括语法糖、新数据类型、模块化支持等,显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var…...
Java - Mysql数据类型对应
Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...
微信小程序 - 手机震动
一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注:文档 https://developers.weixin.qq…...
LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf
FTP 客服管理系统 实现kefu123登录,不允许匿名访问,kefu只能访问/data/kefu目录,不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...
JS手写代码篇----使用Promise封装AJAX请求
15、使用Promise封装AJAX请求 promise就有reject和resolve了,就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...
代码规范和架构【立芯理论一】(2025.06.08)
1、代码规范的目标 代码简洁精炼、美观,可持续性好高效率高复用,可移植性好高内聚,低耦合没有冗余规范性,代码有规可循,可以看出自己当时的思考过程特殊排版,特殊语法,特殊指令,必须…...
在 Spring Boot 项目里,MYSQL中json类型字段使用
前言: 因为程序特殊需求导致,需要mysql数据库存储json类型数据,因此记录一下使用流程 1.java实体中新增字段 private List<User> users 2.增加mybatis-plus注解 TableField(typeHandler FastjsonTypeHandler.class) private Lis…...
python基础语法Ⅰ
python基础语法Ⅰ 常量和表达式变量是什么变量的语法1.定义变量使用变量 变量的类型1.整数2.浮点数(小数)3.字符串4.布尔5.其他 动态类型特征注释注释是什么注释的语法1.行注释2.文档字符串 注释的规范 常量和表达式 我们可以把python当作一个计算器,来进行一些算术…...
