ORB-SLAM2详解(六)闭环检测

本文详细介绍了ORB-SLAM2系统中的闭环检测流程,包括闭环条件检测、Sim3计算、闭环融合及EssentialGraph优化等步骤,旨在通过闭环检测减少累积误差,提高SLAM系统的准确性。

ORB-SLAM2详解(六)闭环检测

欢迎转载,转载请注明网址http://blog.youkuaiyun.com/u010128736/



  毋庸置疑的是,随着相机的运动,我们计算的相机位姿,三角化得到的点云位置,都是有误差的,即使我们使用局部的或全局的BA去优化,仍然会存在累积误差。而消除误差最有效的办法是发现闭环,并根据闭环对所有结果进行优化。闭环是一个比BA更加强烈、更加准确的约束,所有如果能够检测到闭环,并对其优化,就可以让结果更加准确。 
  整个LoopClosing模块是在线程中完成,并在创建线程时调用LoopClosing::Run()函数让其运行。整个框架如下图所示: 
这里写图片描述

一、闭环条件检测

  首先我们计算关键帧Ki和在Covisibility Graph中与其相连的关键帧之间的词袋(BOW)之间的相似度。本文中,作者离线训练了大量的基于ORB描述的词袋,在程序运行时加载进去。这里的词袋作为对该关键帧的描述,将闭环检测转变为一个类似于模式识别的问题。当相机再次来到之前到过的场景时,就会因为看到相同的景物,而得到类似的词袋描述,从而检测到闭环。这里的接口是

// Detect loop candidates and check covisibility consistency
    if(DetectLoop())
 
  • 1
  • 2
  • 1
  • 2

跟进函数接口,可以很清晰地看到检测闭环的过程,这里作者使用了DBOW2库。

二、计算Sim3

  单目SLAM系统存在一个问题,就是尺度的模糊性。如下图所示: 
这里写图片描述
这个很好理解,因为针对一个三维点P点来说,我们在单目拍摄的两幅图中可以匹配到pL和pR,但是无法确定其在三角化里的具体位置,所以存在尺度模糊。而对于立体相机或RGBD相机,这里的尺度就可以唯一确定。所以,单目SLAM是一个Sim3相似变换群,有7个自由度,即1个尺度因子s、3个旋转角度、3个位移,即[sR|t]。显然,立体相机和RGBD相机中s=1。所以单目相机在优化时,是在相似变换群优化,本文是在RANSAC框架下进行优化。这个接口为:

// Compute similarity transformation [sR|t]
// In the stereo/RGBD case s=1
   if(ComputeSim3())
 
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

三、闭环融合

  闭环矫正的第一步是融合重复的点云,并且在Covisibility Graph中插入新的边以连接闭环。首先当前帧的位姿会根据相似变换而被矫正,同时所有与其相连的关键帧也会被矫正。所有的被闭环处的关键帧观察到的地图点会通过映射在一个小范围里,然后去搜索它的近邻匹配。这样就可以对所有匹配的点云进行更加有效的数据融合,并更新关键帧位姿,以及在图中的边。这部分接口为:

// Perform loop fusion and pose graph optimization
   CorrectLoop();
 
  • 1
  • 2
  • 1
  • 2

四、Essential Graph优化

  为了有效地完成闭环,本文使用本质图(Essential Graph)去优化位姿图。这样就可以将闭环的误差分散到整个图中。这部分主要是在CorrectLoop()中的后部分:

 // Optimize graph
    Optimizer::OptimizeEssentialGraph(mpMap, mpMatchedKF, mpCurrentKF, NonCorrectedSim3, CorrectedSim3, LoopConnections, mbFixScale);

// Add loop edge
    mpMatchedKF->AddLoopEdge(mpCurrentKF);
    mpCurrentKF->AddLoopEdge(mpMatchedKF);
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

  至此,整个ORB_SLAM2系统介绍完了。在整个记录过程中,我也学到了很多。ORB_SLAM2是一个十分优秀的项目,整个工程代码十分清晰简洁,且与论文描述高度吻合,是一个优秀的开源学习项目。另外ORB_SALM2中集合了当下各种流行的SLAM框架,所以对SLAM的学习也是具有十分重要的意义。希望越来越多的人加入计算机视觉领域,互相分享互相学习,为了更新更有意思的技术给人类带来福祉。我还是一名小小螺丝钉,仍需继续努力··· ···

### ORB-SLAM 源码详解与教程解析 ORB-SLAM 是一个开源的视觉 SLAM 系统,支持单目、双目和 RGB-D 相机。其源码结构复杂,涉及多线程、特征提取、位姿估计等多个模块。以下是对 ORB-SLAM 源码的详细解析和教程内容。 #### 1. ORB-SLAM 的代码框架 ORB-SLAM 的代码框架分为多个模块,包括跟踪(Tracking)、局部映射(Local Mapping)、回环检测(Loop Closing)等[^1]。这些模块通过多线程并行运行,确保系统的实时性和鲁棒性。推荐使用 Understand 工具来分析代码的流程图和依赖关系,这有助于理解整个框架的设计思路。如果预算有限,SourceInsight 也是一个不错的选择,可以方便地查看类的定义和方法实现[^1]。 #### 2. 运行 ORB-SLAM 的基本步骤 以 TUM 数据集为例,运行 ORB-SLAM 的命令如下: ```bash ./Examples/RGB-D/rgbd_tum Vocabulary/ORBvoc.txt Examples/RGB-D/TUM1.yaml PATH_TO_SEQUENCE_FOLDER ASSOCIATIONS_FILE ``` 其中: - `ORBvoc.txt` 是词袋模型文件,用于回环检测- `TUM1.yaml` 是相机的配置文件,包含内参信息。 - `PATH_TO_SEQUENCE_FOLDER` 是数据集路径。 - `ASSOCIATIONS_FILE` 是时间戳文件,用于同步图像和深度数据[^2]。 #### 3. 跟踪模块的具体实现 跟踪模块的核心任务是估计当前帧的相机位姿,并建立当前帧与地图点(Map Points, MP)之间的对应关系。具体流程如下: - 根据上一帧的位姿和匹配的 3D-2D 点对,预测当前帧的相机位姿。 - 将上一帧的地图点投影到当前帧的图像平面上。 - 在投影点附近搜索匹配的特征点,更新当前帧与地图点的关系[^3]。 #### 4. 局部映射模块的作用 局部映射模块负责构建和维护局部地图。它通过三角化当前帧中的特征点,生成新的地图点,并优化它们的空间位置。此外,局部映射还会剔除不可靠的地图点,确保地图的质量[^1]。 #### 5. 回环检测模块的功能 回环检测模块通过比较当前帧与全局地图的关键帧,检测是否存在闭环。一旦检测闭环,系统会通过非线性优化调整地图点和关键帧的位姿,消除累积误差[^1]。 #### 6. 学习资源推荐 对于初学者,建议从官方文档和相关论文入手,了解 ORB-SLAM 的设计原理和算法细节。同时,可以参考以下教程: - [ORB-SLAM 官方 GitHub 页面](https://github.com/raulmur/ORB_SLAM2) - [ORB-SLAM 代码详解系列博客](https://blog.youkuaiyun.com/column/details/orb-slam-code-analysis.html) #### 示例代码:初始化 ORB 特征提取器 以下是 ORB-SLAM 中初始化 ORB 特征提取器的代码示例: ```cpp #include <opencv2/opencv.hpp> int main() { cv::Ptr<cv::ORB> orb = cv::ORB::create(); cv::Mat image = cv::imread("example.jpg", cv::IMREAD_GRAYSCALE); std::vector<cv::KeyPoint> keypoints; cv::Mat descriptors; orb->detectAndCompute(image, cv::Mat(), keypoints, descriptors); return 0; } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值