转载自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的参数进行特征点检测。