今天主要是梳理一下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. [HDU6288]Tree

    题目 题解 首先读题就很成问题....英语咋办呐!!! 直接考虑有点复杂,直接分析每一条边能否被选入最终答案.对于这条边,看看他的\(size[v]\) 与 \(n-size[v]\) 是否都大于等于 ...

  2. 使用Runtime自定义KVO,原理浅析

    一.介绍 什么是KVO?全称key-value-observer,键值观察,观察者设计模式的另一种实现.其作用是通过观察者监听属性值的变化而做出函数回调. 二.原理 KVO基于Runtime机制实现, ...

  3. React中useEffect使用

    2019-08-24 07:00:00 文摘资讯 阅读数 1364  收藏 博文的原始地址     之前我们已经掌握了useState的使用,在 class 中,我们通过在构造函数中设置 this.s ...

  4. PHPer的项目RESTful API设计规范是怎样的?

    RESTful 是目前最流行的 API 设计规范,用于 Web 数据接口的设计. 什么是RESTful RESTful是一种软件设计风格, 主要用于客户端与服务端交互的软件. 一般来说RESTful ...

  5. 一个Web前端工程师或程序员的发展方向,未来困境及穷途末路

    如果你刚好是一个Web前端工程师,或者你将要从事web前端工作.你应该和我有同样的感慨,web前端技术到了自己的天花板,前端工作我能做多少年?3年或5年?自己的职业规划应该怎么样?收入为什么没有增长? ...

  6. 【CF933E】A Preponderant Reunion(动态规划)

    [CF933E]A Preponderant Reunion(动态规划) 题面 CF 洛谷 题解 直接做很不好搞,我们把条件放宽,我们每次可以选择两个相邻的非零数让他们减少任意值,甚至可以减成负数(虽 ...

  7. 前端之json,ajax和jsonp

    json json是 JavaScript Object Notation 的首字母缩写,单词的意思是javascript对象表示法,这里说的json指的是类似于javascript对象的一种数据格式 ...

  8. 在.net core程序中使用EntityFrameok(非EF Core)

    最近用NoSQL较多写,用传统的EF到不多,但在一些.net core小程序中也小试牛刀过,不过当时用的是微软为.net core量身定制的Entity Framework Core,只是一些比较常规 ...

  9. VS 自动创建带增删查改的MVC网站

    VS 自动创建带增删查改的MVC网站 MVC.Net教程   废话放在前头,说一下这个文章的缘起某天某妹纸找我,说这个MVC的创建不太会,要记一下controllers.models.还有页面引用的东 ...

  10. bootstrap table使用colResizable后表格不能自适应

    窗口缩小放大后,b表格不能自适应,table加了宽度没效果,求教