System 类
System类是ORB-SLAM2系统的主类,通过调用其他模块实现跟踪、局部建图、闭环等功能。主要有四个函数 System、TrackStereo、TrackRGBD、TrackMonocular。
其中System是SLAM系统的构造函数,包括所有功能模块和所有线程的初始化,而TrackStereo、TrackRGBD和TrackMonocular分别是双目、RGBD和单目的数据入口,使用过程中,先调用System函数生成SLAM系统的对象,然后根据传感器类型,调用相应的入口函数,就可以执行SLAM的流程了。
System 构造函数
构造函数中和流程相关的一共有四个参数,分别是
-
strVocFile: ORB词袋数据。词袋是在做闭环检测和重定位时候做检索用的,从历史关键帧中检索出和当前帧最相似的一帧,以进行位姿匹配。
-
strSettingsFile: 配置文件的路径。配置文件中存放了相机参数和用户显示界面的设置
-
sensor: 传感器类型,这是一个枚举变量,一共有三种,分别是MONOCULAR、STEREO和RGBD,分别代表单目、双目和RGBD。
-
bUseViewer: true代表启动显示界面,false代表不显示
流程
1)首先输出一些提示信息和传感器类型
2)打开配置文件(.yaml格式),使用cv::FileStorage进行读操作
cv::FileStorage fsSettings(strSettingsFile.c_str(), //将配置文件名转换成为字符串
cv::FileStorage::READ); //只读
加载失败会提示并退出
3)加载ORB字典
为什么加载ORB词袋
//建立一个新的ORB字典
//使用无参构造方法构造对象,使用System类中定义的ORBVocabulary类的类指针*mpVocabulary 在堆区存储对象的位置
//ORBVocabulary类来源于DBoW2中,能够快速稳定计算两帧图像的相似程度
mpVocabulary = new ORBVocabulary();
//使用指针调用类函数加载词包,并返回bool值判断是否加载成功
bool bVocLoad = mpVocabulary->loadFromTextFile(strVocFile);
4)创建关键帧数据库,主要保存ORB描述子倒排索引(即根据描述子查找拥有该描述子的关键帧)
//利用词袋初始化关键帧数据库(用于重定位和回环检测),存入关键帧数据库指针mpKeyFrameDatabase
mpKeyFrameDatabase = new KeyFrameDatabase(*mpVocabulary);
5)创建一个Map类,存储指向所有关键帧和地图点的指针mpMap
6)创建两个窗口,帧绘制器mpFrameDrawer和地图绘制器mpMapDrawer,这里的帧绘制器和地图绘制器将会被可视化的Viewer所使用
7)初始化Tracking线程,即创建Tracking对象
mpTracker = new Tracking(this, mpVocabulary, mpFrameDrawer, mpMapDrawer,
mpMap, mpKeyFrameDatabase, strSettingsFile, mSensor);
8)初始化局部地图和闭环线程,并打开对应的线程
mpLocalMapper = new LocalMapping(mpMap, mSensor==MONOCULAR); //初始化局部地图
mptLocalMapping = new thread(&ORB_SLAM2::LocalMapping::Run,mpLocalMapper); //打开对应的线程
mpLoopCloser = new LoopClosing(mpMap, mpKeyFrameDatabase, mpVocabulary, mSensor!=MONOCULAR); //初始化闭环流程
mptLoopClosing = new thread(&ORB_SLAM2::LoopClosing::Run, mpLoopCloser); //打开对应的线程
9)打开显示试图和线程
10)通过线程的set函数给各个线程之间建立关联
mpTracker->SetLocalMapper(mpLocalMapper);
mpTracker->SetLoopClosing(mpLoopCloser);
mpLocalMapper->SetTracker(mpTracker);
mpLocalMapper->SetLoopCloser(mpLoopCloser);
mpLoopCloser->SetTracker(mpTracker);
mpLoopCloser->SetLocalMapper(mpLocalMapper);
Track函数(TrackStereo、TrackRGBD和TrackMonocular)
System 对象所在的主线程就是跟踪线程,针对不同的传感器类型有3个用于跟踪的函数,其内部实现就是调用成员变量 mpTracker 的GrabImageMonocular ( GrabImageStereo 或 GrabImageRGBD )方法,他们有一个共同类型的返回值,cv::Mat,该值以齐次矩阵的形式记录了相机的位姿估计Tcw。如果跟丢了,那么这些接口将返回一个空的cv::Mat。
从途中可以看出,每次输入数据以后,会执行三种操作:
1)判断是否需要进入或者退出纯定位模式,如果需要则执行
2)判断是否需要重启tracking,如果需要则执行
3)执行双目的跟踪程序。GrabImageStereo共有三个参数,分别是左目、右目和时间戳
整体流程和双目一样,唯一的区别是此处调用的入口是RGB函数的入口,它的三个参数分别是像素图、深度图和时间戳
整体流程仍然和双目一样,区别是入口变成了单目的入口,它的两个参数分别是像素图和时间戳。
Shutdown
退出程序函数,关闭回环检测和建图线程,如果开启视图线程,关闭视图线程。
保存
SaveTrajectoryTUM 按照TUM格式保存相机运行轨迹并保存到指定的文件中
SaveKeyFrameTrajectoryTUM 保存关键帧的轨迹
SaveTrajectoryKITTI 按照KITTI数据集的格式将相机的运动轨迹保存到文件中