一.构造SLAM初始系统
ORB_SLAM2::System SLAM(argv[1],argv[2],ORB_SLAM2::System::STEREO,true)
初始化SLAM系统主要在 System.cc中实现,其中在在System中:
1.设置相机类型
2.读取参数文件 cv::FileStorage fsSettings(strSettingsFile.c_str(), cv::FileStorage::READ);
3.加载字典 bool bVocLoad = mpVocabulary->loadFromTextFile(strVocFile);
4.创建关键帧数据库 mpKeyFrameDatabase = new KeyFrameDatabase(*mpVocabulary);
5.创建地图 mpMap = new Map();
6.创建两个显示窗口
mpFrameDrawer = new FrameDrawer(mpMap);
mpMapDrawer = new MapDrawer(mpMap, strSettingsFile);7.初始化三个线程,其中track线程在主函数的loop 中,localmapping 和loopcloosing 在并行的线程中。
//Initialize the Local Mapping thread and launch
mpLocalMapper = new LocalMapping(mpMap, mSensor==MONOCULAR); mptLocalMapping = new thread(&ORB_SLAM2::LocalMapping::Run,mpLocalMapper); //Initialize the Loop Closing thread and launch mpLoopCloser = new LoopClosing(mpMap, mpKeyFrameDatabase, mpVocabulary, mSensor!=MONOCULAR); mptLoopClosing = new thread(&ORB_SLAM2::LoopClosing::Run, mpLoopCloser);8.除了这三个线程 还有 viewer 线程这个viwer 线程中,
//Create Drawers. These are used by the Viewer
mpFrameDrawer = new FrameDrawer(mpMap); mpMapDrawer = new MapDrawer(mpMap, strSettingsFile);然后
//Initialize the Viewer thread and launch
if(bUseViewer) { mpViewer = new Viewer(this, mpFrameDrawer,mpMapDrawer,mpTracker,strSettingsFile); mptViewer = new thread(&Viewer::Run, mpViewer); mpTracker->SetViewer(mpViewer); }9.在system中 各个线程的激活,停止存储地图,写入地图中。还有一些改变线程的 状态的初始化
//!!!!key:system.cc中 主要是 各种初始化,并且初始化个 bool 变量均为F。主要的函数的是
cv::Mat System::TrackStereo(const cv::Mat &imLeft, const cv::Mat &imRight, const double ×tamp)
输入 图像, return mpTracker->GrabImageStereo(imLeft,imRight,timestamp);
mpTracker:计算相机位姿,决定是否插入keyFrame,创造地图点,并且当lost的时候rocolization。
并且这个函数主要执行的是return mpTracker->GrabImageStereo(imLeft,imRight,timestamp); 从这一步获取tracker 的状态 ,然后改变bool变量的模式,决定 执行的是什么/。
//除了这个函数 就是通过unique_lock<mutex> lock(mMutexMode); 来决定当前的模式,(这里不是太懂,以后看)
// 以上整体就是system中的东西,获取图像, TrackStereo -----GrabImageStereo -----track ---
在TrackStereo 中会决定是localmapping 还是onlytracking 。。然后就学习tracking 线程吧。