(十三)ORBSLAM3子地图融合优化

本文介绍了ORB-SLAM3中引入的子地图功能,旨在解决跟踪丢失时的地图重置问题。子地图策略能有效避免重定位失败导致的数据丢失,提高系统的鲁棒性和精度。回环检测策略在多子地图环境中进行了改进,提高召回率。子地图的融合通过匹配、相对变换和局部Bundle Adjustment实现,同时讨论了线程异步问题和工程实践中的注意事项。

前言

  距离上一次博客更新已经过去了N年。。。

  ORB-SLAM2继续更新,这真的是有生之年系列。

  ORB-SLAM3在2的基础上,引进了IMU的初始化和融合估计,以及子地图功能。笔者目前 IMU 相关的知识相对比较薄弱,因此准备在第十四讲的时候再为大家介绍VI-ORBSLAM相关的内容。本讲主要关心的是纯视觉的子地图融合功能。


ORB-SLAM子地图简介

  ORB-SLAM3使用子地图的原因是:当我们在跟踪丢失的情况下,不至于在唯一的一张地图中疯狂重定位。因为重定位的结果只有两个,一个是马上重定位成功,那么这是最理想的情况,我们可以继续进行环境探索;另一种就比较吃亏了,我们一直无法重定位成功,最终的结果就是系统判断当前跟踪状态为跟踪丢失,系统会直接将之前所重建的环境信息全部清除!重新生成一张地图。

  这意味着什么?这就好比我们辛辛苦苦在word里面写了成千上万字的文档,word一个bug直接把你所有的数据清空了,你还找不回,只能从头写那么头疼!

  那么解决的策略是啥?ORB-SLAM3就提出用子地图的方案!那么子地图好在哪里?我们还是以word为例:

  当我们写了成千上万字的word文档被bug卡没以后,这部分的文字会自动存储到某个位置(历史子地图),新增的文字会写在另一个word文档中(当前子地图),当缘分来临的时候(回环检测),这两个word文档就有机会合并到一起(子地图合并),形成统一的一个word文档!oh man,想想就觉得激动人心。

  ps:笔者无意针对word文档,只是因为前不久有个同事刚好因为word把文档内容卡没了,所以笔者才以此为例,xxxxxxx。。。


 ORB-SLAM子地图算法

  在介绍子地图功能之前,我们有几个问题需要着重关心一下:

  1. 子地图功能和ORB-SLAM2中使用的单一地图的方法有什么异同?

  2. 存在多个子地图的情况下,回环检测怎么做?这个方法与ORB-SLAM2中的回环检测有何区别?

  3. 两个子地图怎么进行合并?

  4. 合并的过程中,前端tracking到的新帧要怎么处理,此处必然会存在一个异步问题。

OK,那么我们逐个问题来回答!

1. 子地图的好处

  其实子地图的好处我们已经在简介的时候有所提及,当我们只维护一个地

### ORB-SLAM3 地图融合方法实现 ORB-SLAM3地图融合机制是在其前代版本基础上进行了显著改进的功能之一,特别是在引入地图的概念之后。以下是关于 ORB-SLAM3地图融合的具体实现方式: #### 1. 地图结构概述 在 ORB-SLAM3 中,每个地图都被视为独立的地图单元,具有自己的参考帧和局部地图点集合[^3]。这些地图共享一个全局 DBoW 数据库,用于支持重定位和回环检测等功能。 #### 2. 回环检测与地图关联 当系统检测到回环时,可能会涉及两种不同的场景: - **同一活跃地图内的闭环**:这种情况下,处理逻辑类似于传统的 ORB-SLAM 系统,通过调整关键帧之间的关系来消除累积误差。 - **跨地图的闭环**:如果发现当前活跃地图 (active map) 和某个非活跃地图 (non-active map) 形成闭环,则会触发地图融合过程。 #### 3. 地图融合的核心流程 地图融合的主要目的是将两个存在闭环关系的地图合并为一个新的统一地图。具体步骤如下: ##### a. 关键帧筛选 在执行地图融合之前,需要确定哪些关键帧参与优化。通常会选择那些与闭环相关的部分关键帧作为待调整的关键帧 (`vpAdjustKF`),而其他不直接参与闭环的部分则被固定下来 (`vpFixedKF`)[^4]。 ##### b. 局部束法平差 (Bundle Adjustment, BA) 为了减少计算复杂度并提高效率,在实际实施过程中采用了一种称为 Local Bundle Adjustment 的简化形式来进行参数估计。该算法仅针对选定的一组变量进行优化,而不是对整个系统的状态进行全面更新。 ```cpp // 假设我们已经获得了要调整的关键帧列表 vpAdjustKF 和固定的帧列表 vpFixedKF void LoopClosing::MergeLocal() { // 初始化优化器 g2o::SparseOptimizer optimizer; // 添加相机姿态、路标位置等顶点至图模型中... // 构建边连接各个节点,并设置观测数据... // 执行一次迭代式的最小化求解 optimizer.initializeOptimization(); optimizer.optimize(10); // 这里可以调节最大迭代次数 // 更新地图中的真实值以反映最新结果 } ``` 上述伪代码展示了如何利用 `g2o` 库构建稀疏图优化问题并通过数值方法寻找最优解的过程。 ##### c. 合并后的地图激活 完成上述操作后,新生成的大规模综合地图会被指定为最新的活动区域供后续跟踪线程继续工作。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值