ORB-SLAM2详解(三)自动地图初始化

本文详细介绍了ORB-SLAM2系统的自动地图初始化过程,包括初始对应点查找、双模型计算与选择、运动恢复及集束调整等关键步骤。

ORB-SLAM2详解(三)自动地图初始化 

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


  系统的第一步是初始化,ORB_SLAM使用的是一种自动初始化方法。这里同时计算两个模型:用于平面场景的单应性矩阵H和用于非平面场景的基础矩阵F,然后通过一个评分规则来选择合适的模型,恢复相机的旋转矩阵R和平移向量t。

一、找到初始对应点

  在当前帧 Fc 中提取ORB特征点,与参考帧Fr进行匹配。如果匹配点对数过少,就重置参考帧。这一步骤在Tracking.cc中的Tracking::MonocularInitialization函数中。

int nmatches = matcher.SearchForInitialization(mInitialFrame,mCurrentFrame,mvbPrevMatched,mvIniMatches,100);
 
  • 1
  • 1

nmatches表示匹配到的对应点对数。

二、同时计算两个模型

  在找到对应点之后,开始调用Initializer.cc中的Initializer::Initialized函数进行初始化工作。为了计算R和t,ORB_SLAM为了针对平面和非平面场景选择最合适的模型,同时开启了两个线程,分别计算单应性矩阵 Hcr 和基础矩阵 Fcr 。如下所示:

thread threadH(&Initializer::FindHomography,this,ref(vbMatchesInliersH), ref(SH), ref(H));
thread threadF(&Initializer::FindFundamental,this,ref(vbMatchesInliersF), ref(SF), ref(F));
 
  • 1
  • 2
  • 1
  • 2

这里的H和F分别满足下列关系: 

xc=HcrxrxTcFcrxr=0

线程threadH调用 Initializer::FindHomography 函数,计算单应性矩阵H,采用归一化的直接线性变换(normalized DLT)。线程threadF调用 Initializer::FindFundamental 函数计算基础矩阵F,使用归一化8点法。为了评估哪个模型更合适,文中使用 SH SF 来计算各自的分值。分别调用 Initializer::CheckHomography 函数和 Initializer::CheckFundamental 函数进行计算,计算的方法如下所示,其中 SM 统一表示 SH SF : 
SM=i(ρM(d2cr(xic,xir,M)+ρM(d2rc(xic,xir,M))ρM(d2)={τd2  if  d2<TM0  if  d2TM

其中, d2cr d2rc 表示对称的转换误差,分别是从当前帧到参考帧的变换误差和参考帧到当前帧的变换误差。这里: 
TH=5.99,   TF=3.84τ=TH

三、模型选择

  文中认为,当场景是一个平面、或近似为一个平面、或者视差较小的时候,可以使用单应性矩阵H,而使用基础矩阵F恢复运动,需要场景是一个非平面、视差大的场景。这个时候,文中使用下面所示的一个机制,来估计两个模型的优劣: 

RH=SHSH+SF

RH 大于0.45时,选择从单应性变换矩阵还原运动。不过ORB_SLAM2源代码中使用的是0.4作为阈值,如下:

    // Compute ratio of scores
    float RH = SH/(SH+SF);

    // Try to reconstruct from homography or fundamental depending on the ratio (0.40-0.45)
    if(RH>0.40)
        return ReconstructH(vbMatchesInliersH,H,mK,R21,t21,vP3D,vbTriangulated,1.0,50);
    else //if(pF_HF>0.6)
        return ReconstructF(vbMatchesInliersF,F,mK,R21,t21,vP3D,vbTriangulated,1.0,50);
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

四、运动恢复(sfm)

  选择好模型后,就可以恢复运动。 
(1)从单应性变换矩阵H中恢复 
  在求得单应性变化H后,本文使用FAUGERAS的论文[1]的方法,提取8种运动假设。这个方法通过可视化约束来测试选择合理的解。但是如果在低视差的情况下,点云会跑到相机的前面或后面,测试就会出现错误从而选择一个错误的解。文中使用的是直接三角化8种方案,检查两个相机前面具有较少的重投影误差情况下,在视图低视差情况下是否大部分云点都可以看到。如果没有一个解很合适,就不执行初始化,重新从第一步开始。这种方法在低视差和两个交叉的视图情况下,初始化程序更具鲁棒性。程序中调用Initializer::ReconstructH函数恢复运动。

(2)从基础矩阵F中恢复 
  在得到基础矩阵F,并且一直摄像机内参K的情况下,可以计算得到本质矩阵E,然后使用[2]中的方法,恢复出4个运动假设的解。这一部分的理论推导在之前博客做过介绍。其中基础矩阵F得到本质矩阵E的公式如下所示: 

Erc=KTFrcK

同样的,这4个解中只有一个是合理的,可以使用可视化约束来选择,本文使用与单应性矩阵做sfm一样的方法,即将4种解都进行三角化,然后从中选择出最合适的解。这里使用的是 Initializer::ReconstructF 函数。

五、集束调整

  最后使用一个全局集束调整(BA),优化初始化结果。这一部分是在Tracking.cc中的CreateInitialMapMonocular()函数中,使用了如下语句:

Optimizer::GlobalBundleAdjustemnt(mpMap,20);
 
  • 1
  • 1

  如下图所示,PTAM和LSD_SLAM在这个数据集中,会将所有点初始化在一个平面上,而ORB_SLAM会一直等到有足够的视差,才使用基础矩阵,得到最正确的初始化。由于ORB-SLAM对初始化的要求较高,因此初始化时可以选择一个特征丰富的场景,移动摄像机给它提供足够的视差。另外,由于坐标系会附着在初始化成功的那帧图像的位置,因此每次初始化不能保证在同一个位置。

这里写图片描述

引用

[1]. O.D.Faugeras and F.Lustman. “Motion and structure from motion in a piecewise planar environment.” International Journal of Pattern Recognation and Artificial Intelligence, vol.2, no.03,pp.485-508,1988. 
[2]. R.Hartley and A. Zisserman, Multiple View Geometry in Computer Vision, 2nd ed. Cambridge University Press,2004.

### 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; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值