您的位置:首页 > 编程语言

ORB-Slam详解2 代码流程

2017-12-04 13:52 423 查看
转载自http://blog.csdn.net/u010128736/


一、整体框架

  ORB_SLAM的代码非常整齐,简洁,便于阅读。由于我将使用其做室外场景的单目SLAM,所以我们从mono_kitti.cc这个主程序来看整个代码。为了更加方便阅读,我将其中的关键步骤做成思维导图,这样就可以一目了然了。喜欢的朋友请点赞!~ 

  如下图所示,程序在接收参数传递的参数后,就能够找到存放数据和参数的目录,开始运行。 



(1)首先使用LoadImages读取图片目录和时间戳文件 
(2)创建ORB_SLAM2::System对象 
(3)循环读取数据 

 (3.1)读取图片 

 (3.2)读取时间戳 

 (3.3)将图片传给SLAM系统 
(4)关闭SLAM系统 
(5)将相机轨线保存到硬盘中


二、SLAM系统的创建

  在主函数中,我们创建了一个ORB_SLAM2::System的对象SLAM,这个时候就会进入到SLAM系统的主接口System.cc。这个代码是所有调用SLAM系统的主入口,在这里,我们将看到前面博客所说的ORB_SLAM的三大模块:Tracking、Mapping和LoopClosing。如下图所示: 



我们可以看到在这个对象的实例化过程中,我们创建了以下对象: 
(1)创建了ORB词袋的对象 
(2)创建了关键帧的数据库 
(3)创建地图对象 
(4)创建两个显示窗口 
(5)初始化Tracking对象 
(6)初始化Local Mapping对象,并开启线程运行 
(7)初始化Loop Closing对象,并开启线程运行 
(8)初始化窗口,开启线程显示图像和地图点

  在这个实例化的过程中,我们开启了三个线程,分别是Local Mapping、Loop Closing和窗口显示的线程,那第一步Tracking在哪里运行呢?


三、Tracking的运行

  上面我们提到Tracking的运行入口,回顾第一部分,我们在循环读取图片的时候,调用了一个SLAM.TrackMonocular()函数,这个函数就是在主线程里调用Tracking的函数入口了。所以Tracking是运行在主线程中,并且在每次读取一帧新的图像时运行一次。如下图所示: 



可以看到,跟了两步之后,就能很清晰地看到,程序将读取的图片转成灰度图,然后对帧进行特征点检测,就直接调用Tracking.cc中的Track()函数,进行跟踪。另外要注意的是,由于使用的是单目相机,所以在跟踪时需要判断是否初始化或有没有前序关键帧,如果没有,使用mpIniORBextractor的参数进行特征点检测。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: