(九)ORBSLAM回环检测之几何验证


 ORBSLAM2回环检测之几何验证简介

  回环检测的目的是找到当前场景在历史中是否出现过,如果出现过,那会给我们提供一个非常强的约束条件,把我们偏离很多的轨迹一下子修正到正确的位置上。当然,这么好的东西,有利自然就有弊。万一我们检测出来的回环不是真正的回环,也就是说我们认错了地方,这种时候提供的回环约束会导致轨迹被错误地“修正”了,结果就是估计的轨迹跟真实的轨迹相差十万八千里,这显然是不可接受的。

  因此,回环检测的正确性就显得非常重要。我们会宁愿不要回环约束,也不要一个错误的回环约束。所以ORBSLAM2中对回环帧的要求非常高,在外观验证/位置识别阶段的筛选就有好几轮,这我们在上一讲列的提纲里介绍过。而完成外观验证后,还要进一步进行几何验证,才能最终确定是否要回环帧。这很像一个公司里面要找一个领导,找到对的人能让公司发展步入正确的轨道,万一遇到不合适的人可能公司就会直接崩溃掉。

  几何验证很直白的意思,就是用几何约束来判断候选帧是否满足条件,这一讲,我们主要分为以下几个部分来介绍它:

  1. RANSAC方法;

  2. 双向优化确定内点;

  3. ORBSLAM2几何验证方法提纲;

  4. 重定位;


 RANSAC方法

  ORBSLAM2中采用的RANSAC方法中,求解相对位姿的方法是Berthold K. P. Horn在1987年发表的文章”Closed-form solution of absolute orientation using unit quaternions“中所提出的。这是一篇非常厉害的文章,笔者在读这篇文章的时候都感叹作者的水平是如此之高。Horn通过三维匹配点构建优化方程,但是却不需要用迭代优化的方法,直接使用闭解的方法求出了相对旋转、相对位移和尺度因子。接下来,笔者将详细介绍一下这篇文章的主要方法。

  假设我们当前有 $n$ 对已匹配的三维点,记为 $P_{l} = \{ p_{l,1}, p_{l,2}, \dots, p_{l,n}\}$ 和 $P_{r} = \{ p_{r,1}, p_{r,2}, \dots, p_{r,n}\}$。

  我们需要求解质心,这里我们用左相机和右相机表示两个位置,SLAM问题中通常表示一个相机在两个位置:

  左相机三维点:$\bar{P}_{l} = \frac{1}{n}\sum\limits_{i=1}^{n}p_{l,i}$ 并对左相机每个三维点构建新坐标:$p_{l,i}^{'} = p_{l,i} - \bar{p}_{l}$

  右相机三维点:$\bar{P}_{r} = \frac{1}{n}\sum\limits_{i=1}^{n}p_{r,i}$ 并对右相机每个三维点构建新坐标:$p_{r,i}^{'} = p_{r,i} - \bar{p}_{r}$

  则误差项可以写成:

  \begin{equation}
    e_{i} = p_{r,i}^{'} - sR_{rl}p_{l,i}^{'} - t_{rl}^{'} 
  \end{equation}

  其中 $t_{rl}^{'} = t_{rl} - \bar{P}_{r} + sR_{rl}\bar{P}_{l}$

  则代价函数则可以写成:

  \begin{equation}
    J = \sum\limits_{i=1}^{n} \|p_{r,i}^{'} - sR_{rl}p_{l,i}^{'} - t_{rl}^{'}\|^{2}     
  \end{equation}

   将代价函数展开,我们得到:

  \begin{equation}
    J = \sum\limits_{i=1}^{n} \| p_{r,i}^{'} - sR_{rl}p_{l,i}^{'} \|^{2} - 2t_{rl}^{&#

<think>好的,我现在需要帮助用户查找ORBSLAM3中ORBmatcher相关的代码实现或使用教程。首先,我应该回忆一下ORBSLAM3的结构,了解ORBmatcher在其中的作用。ORBmatcher主要用于特征点的匹配,这在SLAM系统中非常关键,比如在跟踪、地图构建和回环检测等模块中都会用到。 接下来,我需要确定用户的需求。用户可能是在开发或研究ORBSLAM3时遇到了特征匹配的问题,想要了解具体的实现细节或如何正确使用这部分代码。用户提到了“代码实现”和“使用教程”,所以需要同时提供代码位置和实际应用场景。 根据提供的引用内容,引用[2]提到了ORBextractor.cc,这可能与ORB特征的提取有关,而ORBmatcher可能在不同的文件中。不过,ORBmatcher通常是一个单独的类,可能在ORBmatcher.cc/.h中。我需要确认ORBSLAM3的代码结构,通常这些匹配函数会放在src目录下的ORBmatcher.cpp文件中,比如SearchByProjection、SearchForTriangulation等方法。 然后,用户可能需要了解如何调用这些匹配方法。比如在跟踪线程中,如何利用ORBmatcher进行特征匹配,或者在建图时如何生成新的地图点。这时,可以参考引用[3]中的Initializer::ReconstructF函数,其中可能调用了ORBmatcher的方法来进行特征匹配和三角化。 另外,引用[5]提到了MapPointCulling函数,这可能涉及到地图点的筛选标准,这也可能与ORBmatcher的匹配结果有关。比如,在创建新地图点后,需要通过匹配验证其可靠性,不符合条件的会被剔除。 关于使用教程,ORBSLAM3的官方文档可能不够详细,所以可能需要参考一些社区资源,比如CSDN博客或GitHub上的示例项目。比如引用[1]中的CSDN博客和GitHub链接可能包含相关的实现分析或教程。此外,逆向索引和正向索引的应用(引用[4])可能与特征匹配中的快速检索有关,比如在回环检测中使用词袋模型进行特征匹配时,ORBmatcher可能会与这些索引结构交互。 现在需要将以上信息整合成一个清晰的回答,分点说明ORBmatcher的功能、代码位置、核心函数、使用场景以及相关资源。同时,生成相关问题,帮助用户进一步探索,比如性能优化、参数调整、不同传感器的影响等。 需要确保回答符合用户的要求,结构清晰,引用正确,并且使用中文。同时,按照系统级指令,数学公式使用正确的格式,但在这个问题中可能涉及较少数学内容,主要关注代码和算法流程。最后,生成的相关问题要围绕ORBmatcher的实现和应用展开,帮助用户深入理解。</think>### ORBSLAM3 ORBmatcher 代码实现与使用解析 #### 一、核心功能定位 ORBmatcher 是 ORBSLAM3 中实现特征匹配的核心模块,主要负责以下任务: 1. **帧间匹配**:相邻帧的特征点跟踪(Tracking线程) 2. **地图点匹配**:地图点与关键帧的投影匹配(LocalMapping线程) 3. **回环检测验证**:候选关键帧的几何验证(LoopClosing线程) 代码文件位于:`src/ORBmatcher.cc` 和 `include/ORBmatcher.h`[^2][^5] #### 二、关键函数实现解析 ```cpp // 基于投影的匹配(Tracking线程核心方法) int ORBmatcher::SearchByProjection(Frame &F, const vector<MapPoint*> &vpMapPoints, float th) { // 通过地图点在当前帧的投影位置搜索匹配 // 使用极线约束和描述子距离筛选候选点 // 返回成功匹配数量 } ``` ```cpp // 三角化新地图点的匹配(LocalMapping线程) int ORBmatcher::SearchForTriangulation(KeyFrame *pKF1, KeyFrame *pKF2, vector<pair<size_t, size_t> > &vMatchedPairs) { // 使用词袋加速匹配 // 计算特征点方向一致性 // 应用对极几何约束 } ``` #### 三、典型使用场景 1. **跟踪线程初始化**: - 调用 `SearchByProjection()` 实现运动模型预测匹配 - 参考 `Tracking::TrackWithMotionModel()` 实现[^3] 2. **地图点创建**: ```cpp void LocalMapping::CreateNewMapPoints() { // 使用SearchForTriangulation寻找匹配对 // 三角化成功后执行MapPointCulling质量筛选 } ``` 3. **回环检测验证**: - 在 `LoopClosing::DetectLoop()` 中通过词袋匹配候选帧 - 结合逆向索引加速匹配过程[^4] #### 四、参数调优要点 1. **阈值参数**(位于 `ORBmatcher.h`): ```cpp #define TH_HIGH 100 // 描述子距离阈值 #define TH_LOW 50 // 低质量匹配阈值 static const float HISTO_LENGTH = 30; // 方向直方图分箱数 ``` 2. **传感器适配**: - RGB-D模式会跳过部分几何验证步骤 - 单目模式需要严格的对极约束检查 #### 五、学习资源推荐 1. 代码精读:`ORBmatcher.cc` 中的 `SearchByBoW()` 实现词袋匹配 2. 实践教程:参考CSDN系列文章《ORBSLAM3源码解析》[^1] 3. 扩展应用:GitHub上的RGBD-Inertial实现案例
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值