ORB-SLAM2初步(源码逻辑分析)

今天主要是梳理一下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;//跳转,实现对相机位姿的跟踪

三、总结

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

时间: 2024-08-04 21:34:01

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

深入源码剖析LruCache

引言:最近许多人在博客中提到自己在面试时被问"LruCache 的原理是?",发现自己之前完全没有接触过这个知识点,本着知其然知其所以然的态度,先搜索了一些博文了解相关知识,就去看源码了.现在大概知道 LruCache 是啥,写个博文权当是学习笔记把 LruCache 的前世今生 LruCache 是何方神圣? 我一般不喜欢野路子的定义,所以我摘选了 Android 官方对 LruCache 的定义: A cache that holds strong references to a

Spring源码学习的初步体会

Spring源码学习的初步体会: 深入学习和巩固java的基础知识,其中的java知识范围全部,可以边研究源码边巩固复习基础知识 体会其中用到的设计思想:其中包含的设计原则和设计模式. 加深对spring的理解,在业务开发中使用spring更容易和深入,提高了生产率.

Drf03 /呼啦圈网页初步实现、drf筛选、视图(源码实现)

目录 Drf03 /呼啦圈网页初步实现.drf筛选.视图(源码实现) 内容回顾与补充 今日详细 1.呼啦圈初步实现 2. 筛选 3.视图 Drf03 /呼啦圈网页初步实现.drf筛选.视图(源码实现) 内容回顾与补充 restful规范 - URL中一般用名词: http://www.luffycity.com/article/ (面向资源编程,网络上东西都视为资源) - 根据请求不同做不同操作:GET/POST/PUT/DELTE/PATCH - 筛选条件,在URL参数中进行传递: http:

[dpdk] 熟悉SDK与初步使用 (三)(IP Fragmentation源码分析)

对例子IP Fragmentation的熟悉,使用,以及源码分析. 问题一: main()函数大概是这样的:标红的三行将与下面叙述的事情相关 int main(int argc, char **argv) { ... ... /* init EAL */ ret = rte_eal_init(argc, argv); if (ret < 0) rte_exit(EXIT_FAILURE, "rte_eal_init failed"); ... ... /* launch per-

2-14 MySQL初步认识,及CentOS6.8环境,源码方式安装MySQL

什么是数据库: 存放数据的仓库RDBMS-->(Relational Database Management System) 关系型数据库管理系统DBMS--->(Database Managerment System) 数据库管理系统 数据库分类:1. 关系型数据库2. 非关系型数据库常用关系型数据库:Oracle,MySQL,MariaDB,SQL Server,Access,PostgreSQL,DB2,Informix,SybasePostgreSQL 自由的对象-关系数据库服务器(数

scrapy初步解析源码即深度使用

scrapy深度爬虫 ——编辑:大牧莫邪 本章内容 深度爬虫概述 scrapy Spider实现的深度爬虫 scrapy CrawlSpdier实现的深度爬虫 案例操作 课程内容 1. 深度爬虫概述 爬虫程序,主要是用与数据采集处理的一种网络程序,在操作过程中针对指定的url地址进行数据请求并根据需要采集数据,但是在实际项目开发过程中,经常会遇到目标url地址数量不明确的情况,如之前的章节中提到的智联招聘项目,不同的岗位搜索到的岗位数量不一定一致,也就意味着每个工作搜索到的工作岗位列表页面的数量

ORB SLAM2在Ubuntu 16.04上的运行配置

安装依赖 安装OpenGL 1. 安装opengl Library$sudo apt-get install libgl1-mesa-dev2. 安装opengl utility$sudo apt-get install libglu1-mesa-dev3. 安装opengl utility toolkit$sudo apt-get install freeglut3-dev 安装GLEW $sudo apt-get install libglew-dev 安装boost $sudo apt-g

Android异步消息处理机制详解及源码分析

PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbober 转载烦请注明出处,尊重分享成果] 最近相对来说比较闲,加上养病,所以没事干就撸些自己之前的知识点为博客,方便自己也方便别人. 1 背景 之所以选择这个知识点来分析有以下几个原因: 逛GitHub时发现关注的isuss中有人不停的在讨论Android中的Looper , Handler , Me

QCustomplot使用分享(二) 源码解读

一.头文件概述 从这篇文章开始,我们将正式的进入到QCustomPlot的实践学习中来,首先我们先来学习下QCustomPlot的类图,如果下载了QCustomPlot源码的同学可以自己去QCustomPlot的目录下documentation/qcustomplot下寻找一个名字叫做index.html的文件,将其在浏览器中打开,也是可以找到这个库的类图.如图1所示,是组成一个QCustomPlot类图的可能组成形式. 一个图表(QCustomPlot):包含一个或者多个图层.一个或多个ite