【视觉惯性SLAM:十九、ORB-SLAM3 中的闭环及地图融合线程】

ops/2025/1/19 8:00:31/

ORB-SLAM3 的闭环检测和地图融合线程是其重要组成部分,旨在提升位姿估计精度、优化地图一致性以及减少累计误差。本章分为两大部分:闭环检测和地图融合,每部分包括具体步骤及其原理、实现细节和扩展。

19.1 检测共同区域

闭环检测的目标是识别当前帧与历史帧之间的重叠区域,以便为全局优化提供约束。该部分包括寻找初始候选关键帧、求解位姿变换和校验候选关键帧。

19.1.1 寻找初始候选关键帧

背景与意义

在长时间运行的 SLAM 系统中,累计误差不可避免。闭环检测通过识别当前帧和历史关键帧的重叠区域,为全局优化提供约束,显著降低误差。寻找初始候选关键帧是闭环检测的第一步,关系到整个闭环模块的效率和准确性。

实现方法

ORB-SLAM3 使用词袋模型(Bag of Words, BoW)快速检索候选关键帧,这是一种高效的特征检索方法。以下为具体实现步骤:

  1. ORB 特征提取:从当前帧中提取 ORB 特征点及其描述子。

    • ORB 特征具有良好的旋转不变性和尺度不变性,是实时系统的理想选择。
    • 提取的描述子将作为后续匹配的基础。
  2. 构建词袋模型:词袋模型通过量化特征描述子,将图像表示为稀疏特征向量。

    • 离线阶段:构建视觉单词字典(通常使用 K-Means 聚类)。
    • 在线阶段:将当前帧的特征描述子量化为特征词向量。
  3. 快速候选检索:利用 BoW 向量和数据库中已存储的关键帧向量进行快速匹配。

    • 使用相似性度量(如内积或余弦相似度)计算匹配得分。
    • 选择得分最高的若干帧作为候选关键帧。
  4. 设置阈值:过滤掉匹配得分低于设定阈值的关键帧,以减少后续计算量。

方法:基于词袋模型的候选关键帧检索

ORB-SLAM3 中常用的候选关键帧检索方法是基于词袋模型(Bag of Words, BoW)。词袋模型通过对图像特征进行量化编码,将视觉特征表示为特征向量,然后通过快速匹配查找相似关键帧。

具体步骤:

  1. 特征提取:从当前帧中提取 ORB 特征,并使用词袋模型对其量化。
  2. 候选关键帧查找:将量化后的特征与数据库中的所有关键帧进行比较,选出得分较高的候选关键帧。
  3. 设定候选阈值:仅保留匹配分数超过设定阈值的关键帧。
候选关键帧的加速实现
  • KD 树加速匹配:通过使用 KD 树存储特征点的描述子,可以快速查找与当前帧匹配的特征点。
  • 层次化匹配策略:首先在粗略尺度匹配特征点,然后逐步精细化。
伪代码示例
def find_candidate_keyframes(current_frame, database):candidates = []current_bow = compute_bow(current_frame.features)for keyframe in database.keyframes:score = compute_similarity(current_bow, keyframe.bow)if score > THRESHOLD:  # 阈值判断candidates.append(keyframe)return candidates
扩展:基于时空约束的优化

为了进一步提高检索效率,可以结合时空信息(如运动轨迹和位姿变化)对候选关键帧进行约束,排除明显不相关的关键帧。

性能优化

  • KD 树加速检索:将特征描述子存储在 KD 树中,实现快速最近邻搜索。
  • 基于时空一致性的过滤:结合帧间时间和空间信息排除不合理候选关键帧。

优缺点

  • 优点:检索速度快,适合实时系统;存储需求低。
  • 缺点:依赖字典质量,可能存在量化误差。

扩展案例

在大规模环境中,可以结合场景分割信息进一步提升检索效率。例如,利用语义分割先划分场景类别,仅对同类场景的关键帧进行匹配,从而减少搜索空间。


19.1.2 求解位姿变换

背景

在找到初始候选关键帧后,需要计算当前帧与候选关键帧之间的位姿变换。这一过程的结果将作为闭环优化的重要约束条件。

数学模型

位姿变换可以表示为:

T c w = [ R t 0 1 ] T_{cw} = \begin{bmatrix} R & t \\ 0 & 1 \end{bmatrix} Tcw=[R0t1]

其中, R R R 为旋转矩阵, t t t 为平移向量。目标是通过匹配的三维点对,估计 T c w T_{cw} Tcw

目标函数为最小化重投影误差:

E = ∑ i ∥ u i − π ( K [ R ⋅ P i + t ] ) ∥ 2 E = \sum_{i} \| u_i - \pi(K[R \cdot P_i + t]) \|^2 E=iuiπ(K[RPi+t])2

其中:

  • u i u_i ui 为当前帧中的像素点。
  • P i P_i Pi 为三维地图点。
  • K K K 为相机内参矩阵。
实现步骤
  1. 特征匹配:对当前帧与候选关键帧提取的 ORB 特征描述子进行匹配。

    • 使用 Hamming 距离衡量特征相似性。
    • 保留匹配分数最高的前 N 个匹配点。
  2. RANSAC 过滤:使用随机抽样一致性算法(RANSAC)剔除错误匹配点。

    • 随机选取点对,估计位姿变换。
    • 根据投影误差判断一致点。
    • 重复多次,保留一致点最多的模型。
  3. 位姿优化:采用非线性优化(如 Levenberg-Marquardt 算法)进一步优化位姿。

    • 输入:匹配点对、初始位姿估计。
    • 输出:优化后的位姿。
伪代码
def estimate_pose(current_frame, candidate_frame):matches = match_features(current_frame.features, candidate_frame.features)inliers = ransac(matches)pose = nonlinear_optimization(inliers)return pose
扩展

对于视觉惯性系统,可以将 IMU 数据纳入优化目标函数。例如,将 IMU 提供的角速度和加速度作为先验约束,提高估计精度。


19.1.3 校验候选关键帧

必要性

候选关键帧可能包含误匹配,为避免错误优化影响全局地图一致性,必须对候选关键帧进行校验。

校验方法
  1. 几何一致性校验

    • 验证三维点云的重投影误差是否满足预设阈值。
    • 确保特征点对的深度信息一致。
  2. 回环验证

    • 使用双向匹配检查当前帧与候选关键帧之间的闭环关系。
    • 只有当双向匹配结果一致时,才认为闭环有效。
  3. 拓扑一致性校验

    • 检查候选关键帧与其相邻关键帧是否存在合理的拓扑关系。
    • 确保闭环不会导致地图拓扑结构紊乱。
案例扩展

在动态环境中(如室外行人区域),误匹配可能由动态物体(如行人)引起。此时,可以结合语义分割结果剔除动态物体的特征点,提升校验精度。


19.2 地图融合

地图融合负责将多源地图整合为一致的全局地图,包括纯视觉地图融合和视觉惯性地图融合。


19.2.1 纯视觉地图融合

流程
  1. 子地图匹配:使用词袋模型或直接特征匹配找到共享关键帧。
  2. 地图对齐:利用共享关键帧的位姿变换,将子地图对齐。
  3. 全局优化:通过全局 BA 调整所有关键帧和地图点的位置。
扩展方法
  • 基于时空约束的融合:根据时间和空间信息提高匹配效率。
  • 多分辨率优化:先粗略对齐再逐步细化。

19.2.2 视觉惯性地图融合

视觉惯性地图融合将 IMU 数据引入地图优化,显著提高对动态环境的适应能力。

实现细节
  • 惯性先验约束:通过 IMU 提供的位姿信息,减少优化的自由度。
  • 联合优化模型:将视觉误差和惯性误差联合构建优化目标函数。

http://www.ppmy.cn/ops/151324.html

相关文章

00_专栏《Redis 7.x企业级开发实战教程》介绍

大家好,我是袁庭新。Redis作为一款高性能、多用途的内存数据库,凭借其丰富的数据结构、高速读写能力、原子操作特性及发布订阅等功能,在缓存加速、分布式锁、消息队列等场景中不可或缺,极大提升了系统性能与开发效率,是现代互联网应用架构的关键组件。 你是否在学习Redis…

Java开发提效秘籍:巧用Apache Commons IO工具库

一、引言 在 Java 开发的广袤领域中,输入输出(I/O)操作宛如一座桥梁,连接着程序与外部世界,从文件的读取与写入,到网络数据的传输,I/O 操作无处不在,其重要性不言而喻。然而&#xf…

Python大数据可视化:基于python大数据的电脑硬件推荐系统_flask+Hadoop+spider

开发语言:Python框架:flaskPython版本:python3.7.7数据库:mysql 5.7数据库工具:Navicat11开发软件:PyCharm 系统展示 管理员登录 管理员功能界面 价格区间界面 用户信息界面 品牌管理 笔记本管理 电脑主机…

考研408《操作系统》复习笔记,第七章《线程》

参考资料 s​​​​​​​c​​​​​​​2.1_6_线程的实现方式和多线程模型_哔哩哔哩_bilibili 多线程编程:一次性搞懂线程同步机制_哔哩哔哩_bilibili 【操作系统】进程和线程的区别_哔哩哔哩_bilibili 一、线程是啥 在前后端开发里我们就经常遇到线程&#xff…

技术总结:Vue在前端开发中的应用与实践

​🌈个人主页:前端青山 🔥系列专栏:Vue篇 🔖人终将被年少不可得之物困其一生 依旧青山,本期给大家带来Vue篇专栏内容:Vue-开发应用与实践 #博客之星2024年度总评选-主题文章创作# 前言 嗨喽,我是青山,本年度创作已然…

iOS - 内存屏障的使用场景

内存屏障的使用是为了解决以下几个关键问题: 1. CPU 乱序执行 // 没有内存屏障时,CPU 可能乱序执行 void example() {// 这两行代码可能被 CPU 重排序a 1; // 操作1flag true; // 操作2 }// 使用内存屏障确保顺序 void safeExample() {a 1;…

相机拍照参数:WB、FF、S、ISO、EV、焦距

WB(白平衡,White Balance): 白平衡用于去除不真实的色彩偏移,调整照片的颜色以确保白色在不同光源下都呈现为白色。不同的光源有不同的色温(例如日光、钨丝灯、荧光灯等),这会影响照…

Active Prompting with Chain-of-Thought for Large Language Models

题目 大型语言模型的思维链主动提示 论文地址:https://arxiv.org/abs/2302.12246 项目地址:https://github.com/shizhediao/active-prompt 摘要 大型语言模型(LLM)规模的不断扩大为各种需要推理的复杂任务带来了涌现能力,例如算术和常识推理…