ORB-SLAM2 源码解读
流程图
初始流程
首先调用mono_tum.cc 运行程序
有以下几块内容
- LoadImages (const string &strFile, vector &vstrImageFilenames,vector &vTimestamps);读取影像数据
- ORB_SLAM2::System SLAM (argv[1],argv[2],ORB_SLAM2::System::MONOCULAR,true); 系统的初始化、建立线程
- SLAM.TrackMonocular(im,tframe); 将每张影像传入单目处理函数
- vTimesTrack[ni]=ttrack; 计算处理所用的时间
- 等待加载下一帧
- 结束
- 将相机轨迹写入KeyFrameTrajectory.txt
输入参数有4个
Usage: ./mono_tum path_to_vocabulary path_to_settings path_to_sequence
分别对应:调用的程序、词袋、相机内参和特征提取器的参数 影像数据
调用的函数有3个
1、LoadImages (const string &strFile, vector &vstrImageFilenames,vector &vTimestamps);参数为:影像数据的文件名,输出为 时间戳和对应的影像名。
2、 ORB_SLAM2::System SLAM(argv[1],argv[2],ORB_SLAM2::System::MONOCULAR,true); 参数为:词袋、相机内参和特征提取器的参数、单目/双目/RGB-D,是否启动显示界面。
3、SLAM.TrackMonocular(im,tframe); 参数为 影像和对应的时间戳。
系统流程
接下来进入到system.cc,才算是真的进入到系统中。
首先,这个文件中有4个函数
- System
- TrackStereo
- TrackRGBD
- TrackMonocula
System是SLAM系统的构造函数,包括所有功能模块和所有线程的初始化,而TrackStereo、TrackRGBD和TrackMonocular分别是双目、RGBD和单目的数据入口。这里对应着mono_tum.cc的流程,先调用System初始化功能和线程,接着调用对应的单目入口函数TrackMonocula,就可以执行ORB-SLAM的流程了。
1、System构造函数介绍
1)初始化词袋
mpVocabulary = new ORBVocabulary();
bool bVocLoad = mpVocabulary->loadFromTextFile(strVocFile);
//参数为词袋文件名
2)检查相机参数
FileStorage fsSettings(strSettingsFile.c_str(), cv::FileStorage::READ);
//参数为相机参数和特征提取器文件的参数
3)初始化关键帧数据集
mpKeyFrameDatabase = new KeyFrameDatabase(*mpVocabulary);
//参数为词袋
4)创建地图
mpMap = new Map();
5)创建用户显示界面
mpFrameDrawer = new FrameDrawer(mpMap);
mpMapDrawer = new MapDrawer(mpMap, strSettingsFile);
//参数为创建的地图和相机参数文件
6)初始化位姿追踪线程
mpTracker = new Tracking(this, mpVocabulary, mpFrameDrawer, mpMapDrawer, mpMap, mpKeyFrameDatabase, strSettingsFile, mSensor);
//参数为:词袋、关键帧显示界面、地图显示界面、地图、关键帧数据集、相机参数文件、单目/双目/RBG-D
7)初始化局部地图,并打开相应线程
mpLocalMapper = new LocalMapping(mpMap, mSensor==MONOCULAR);
mptLocalMapping = new thread(&ORB_SLAM2::LocalMapping::Run,mpLocalMapper);
//参数为地图
8)初始化回环检测、并打开相应线程
mpLoopCloser = new LoopClosing(mpMap, mpKeyFrameDatabase, mpVocabulary, mSensor!=MONOCULAR);
mptLoopClosing = new thread(&ORB_SLAM2::LoopClosing::Run, mpLoopCloser);
//参数为地图、关键帧数据集、词袋
9)给各线程之间建立关联
mpTracker->SetLocalMapper(mpLocalMapper);
mpTracker->SetLoopClosing(mpLoopCloser);
mpLocalMapper->SetTracker(mpTracker);
mpLocalMapper->SetLoopCloser(mpLoopCloser);
mpLoopCloser->SetTracker(mpTracker);
mpLoopCloser->SetLocalMapper(mpLocalMapper);
2、TrackMonocular介绍
Monocular是单目相机的入口函数。
参数为时间戳和影像
流程分为两个检查模块
- 检查模式变更
- 检查重置
1)检查是否激活纯定位模式
是:停止地图构建,等待局部地图构建完成,开启纯定位模式
2)检查是否取消纯定位模式
是:关闭纯定位模式、重启局部地图构建
3)检查是否需要重置
是:开启重置
4)进行下一步
Mat Tcw = mpTracker->GrabImageMonocular(im,timestamp);
unique_lock<mutex> lock2(mMutexState);
mTrackingState = mpTracker->mState;
mTrackedMapPoints = mpTracker->mCurrentFrame.mvpMapPoints;
mTrackedKeyPointsUn = mpTracker->mCurrentFrame.mvKeysUn;