今天主要是梳理一下ORB-SLAM2源码的逻辑关系,GitHub和泡泡机器人上有很好的注释版本(吴博),大神请(轻)板砖。

一、文件

如图所示,Examples里面存放的分别是基于单目、双目、RGBD的实例程序,一般都是基于TUM等数据库,还有一个ROS版本的ORB-SLAM2,以及一个应用与AR的Demo程序;

include文件夹存放的是头文件,ORB-SLAM2可以被当作一个库来使用,很多函数都可以直接调用;

src文件夹存放的是和include对应的源文件,包括主要的Tracking、LocalMapping、LoopClosing等的实现过程都在这个文件夹下;

Thirdparty存放的是用到的第三方库,Vocabulary存放的是回环检测中BoW用到的视觉词典;

其它的主要是一些编译文件,作者不仅给出了CMakeLists.txt,还给出了build.sh,只要配置好了本地环境,运行一下build.sh就行了。

二、运行过程

作者将整个SLAM过程做成一个系统(System),因此只要在主函数中声明一个SLAM System就可以进入跟踪过程了,以mono_tum.cc为例:

(1)LoadImages(strFile, vstrImageFilenames, vTimestamps);//作者首先从文件中读取了图像名称列表

(2)ORB_SLAM2::System SLAM(argv[1],argv[2],ORB_SLAM2::System::MONOCULAR,true);//然后声明了一个SLAM系统,并设定是单目MONOCULAR

(3)for(int ni=0; ni<nImages; ni++)//使用一个for循环依次读取图片并将图片输入到声明的SLAM系统中;

  {  

    im = cv::imread(string(argv[3])+"/"+vstrImageFilenames[ni],CV_LOAD_IMAGE_UNCHANGED);

    SLAM.TrackMonocular(im,tframe);//进入SLAM系统的接口

  }

(4)SLAM.Shutdown();//图像读取完毕之后关闭SLAM系统;

//主函数运行结束,后面另有保存轨迹的函数等;

//从上面过程可以看出,SLAM系统的入口在TrackMonocular这个函数,SLAM的实现在System中;

//以下过程就在System.cpp文件中

//在System的构造函数中,作者在声明该SLAM系统时就启用了至少3个线程,分别计算跟踪、局部建图和回环检测,还有一个是可选的交互线程

mpTracker = new Tracking(this, mpVocabulary, mpFrameDrawer, mpMapDrawer,
  mpMap, mpKeyFrameDatabase, strSettingsFile, mSensor);//Tracking线程的初始化;

mptLocalMapping = new thread(&ORB_SLAM2::LocalMapping::Run,mpLocalMapper);//LocalMapping线程的初始化;

mptLoopClosing = new thread(&ORB_SLAM2::LoopClosing::Run, mpLoopCloser);//LoopClosing线程的初始化;

mptViewer = new thread(&Viewer::Run, mpViewer);//Viewer线程的初始化;

//构造函数中还有读取视觉词典等操作

(3.1)cv::Mat System::TrackMonocular(const cv::Mat &im, const double &timestamp);//SLAM系统的入口

(3.2)cv::Mat Tcw = mpTracker->GrabImageMonocular(im,timestamp);//跟踪线程的入口,因为调用该函数的对象为mpTracker;

//下面就进入了Tracking.cpp文件

  (3.2.1)cv::Mat Tracking::GrabImageMonocular(const cv::Mat &im, const double &timestamp)//首先进入该函数体中,进行灰度图的转换;

  (3.2.3)Track();//然后在灰度图转换的函数体中完成函数的跳转,当前这个函数就是跟踪的主函数体;

    (3.2.3.1)if(mState==NOT_INITIALIZED)  //判断系统是否初始化,没有初始化就跳转到初始化函数,这是单目所独有的过程;

          {

            MonocularInitialization();//初始化的跳转函数,具体的初始化过程在Initializer.cc文件中

          }

    (3.2.3.2)if(mpInitializer->Initialize(mCurrentFrame, mvIniMatches, Rcw, tcw, mvIniP3D, vbTriangulated))//初始化的跳转在这个函数中,因为初始化有一些条件,因此需要做判断

  (3.2.1)return mCurrentFrame.mTcw.clone();//最终在灰度图转换的函数中完成跟踪过程,返回相机位姿矩阵;

 (3.1)return Tcw;//跳转,实现对相机位姿的跟踪

三、总结

  代码的逻辑比较清晰,而且封闭性比较好,可以稍作修改作为库文件使用。

ORB-SLAM2初步(源码逻辑分析)的更多相关文章

  1. ORB原理与源码解析

    转载: http://blog.csdn.net/luoshixian099/article/details/48523267 CSDN-勿在浮沙筑高台 没有时间重新复制代码,只能一股脑的复制,所以代 ...

  2. (二)ORB描述子提取源码思路与实现

    ORBSLAM2中ORB特征提取的特点 ORBSLAM2中通过对OpenCV中的ORB特征点提取类进行修改,对图像进行分块提取,而后划分节点,使得每个节点中保存的特征点性能是该节点所有特征点中最好的. ...

  3. 【浅墨著作】《OpenCV3编程入门》内容简单介绍&amp;勘误&amp;配套源码下载

    经过近一年的沉淀和总结,<OpenCV3编程入门>一书最终和大家见面了. 近期有为数不少的小伙伴们发邮件给浅墨建议最好在博客里面贴出这本书的文件夹,方便大家更好的了解这本书的内容.事实上近 ...

  4. 关于ORB SLAM2资源整理(持续更新)

    ORB SLAM2源码讲解(吴博) https://www.youtube.com/watch?v=2GVE7FTW7AU 泡泡机器人视频整理: http://space.bilibili.com/3 ...

  5. spring cloud EurekaClient 多网卡 ip 配置 和 源码分析(转)

    https://blog.csdn.net/qq_30062125/article/details/83856655 1.前言对于spring cloud,各个服务实例需要注册到Eureka注册中心. ...

  6. OpenCV开发笔记(六十五):红胖子8分钟带你深入了解ORB特征点(图文并茂+浅显易懂+程序源码)

    若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...

  7. [dpdk] 熟悉SDK与初步使用 (四)(L3 Forwarding源码分析)

    接续前节:[dpdk] 熟悉SDK与初步使用 (三)(IP Fragmentation源码分析) 前文中的最后一个问题,搁置,并没有找到答案.所以继续阅读其他例子的代码,想必定能在其他位置看到答案. ...

  8. Spark Streaming揭秘 Day5 初步贯通源码

    Spark Streaming揭秘 Day5 初步贯通源码 引子 今天,让我们从Spark Streaming最重要的三个环节出发,让我们通过走读,逐步贯通源码,还记得Day1提到的三个谜团么,让我们 ...

  9. 在android源码环境下写上层应用的一个初步解决方法

    在android源码环境下编写上层应用,一直以来我都觉得很麻烦.因为如果单纯将应用导入eclipse,那么framework层一些定制的API无法自动提示和补全,使用起来不太方便:如果将整个andro ...

随机推荐

  1. <Matrix> 311 378

    311. Sparse Matrix Multiplication 稀疏矩阵的计算.稀疏矩阵的特点是有大量的0,如果采用暴力算法则比然会有很多无意义的计算. C[ i ][ j ] += A[ i ] ...

  2. shell基础概念, if+命令, shell中引用python, shell脚本的几种执行方式

    说明: 虚拟机中shell_test目录用来练习shell, 其中有个test.log文件用来存放日志 #!/usr/bin/bash      # shell文件开头, 用来指定该文件使用哪个解释器 ...

  3. js正则高级函数(replace,matchAll用法),实现正则替换(实测很有效)

    有这么一个文档,这是在PC端显示的效果,如果放在移动端,会发现字体大小是非常大的,那么现在想让这个字体在移动端能按照某个比例缩小,后台返回的数据格式是: <html> <head&g ...

  4. The trap of Bash trap

    Can you spot the problem with the following Bash script? resource_created="false" function ...

  5. golang数据结构之树的三种遍历方式

    tree.go package tree import ( "fmt" ) type TreeNode struct { ID int Val int Left *TreeNode ...

  6. 终端中的 zsh 和 bash-魔法切换

    常用ubuntu,这两个终端都装了,平时使用zsh比较方便,可是,有时候出现了问题,不知道是谁的问题时候,还要做一下切换操作的,怎么才能迅速切换呢? 要切换,首先要知道你现在使用的是什么,请看第一个命 ...

  7. JMeter 使用 http长连接 |史上最全

    疯狂创客圈 Java 高并发[ 亿级流量聊天室实战]实战系列 [博客园总入口 ] 疯狂创客圈(笔者尼恩创建的高并发研习社群)Springcloud 高并发系列文章,将为大家介绍三个版本的 高并发秒杀: ...

  8. pytest框架之parametries数据驱动参数化

    在测试用例的前面加上:@pytest.mark.parametrize('参数名', 列表数据) 参数名:用来接收每一项数据,并作为测试用例的参数 列表参数:一组测试数据(元组.列表.字典) 方式一: ...

  9. Protractor - 环境设置

    去年出于好奇搭建过一个Protractor+Cucumber的测试框架,当时项目上并没有用到AngularJS,所以框架能运行起来之后没有再深入了.最近新项目引入了AngularJS,想起去年搭的那个 ...

  10. 记一次feign的问题排查(短路、线程池、队列)

    https://www.jianshu.com/p/f7fb59f43485 昨天开了一百个线程采用feign去请求第三方项目,结果报错,出现了短路,大概是下面这样的.(feign整合了hystrix ...