版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_16481211/article/details/83541598
该类的功能主要是给整个SLAM系统工程进行配置,开启视觉里程计的跟踪定位线程,地图构建线程,回环检测线程,观测器线程等。
step1
将配置文件读入到内存中,存储到fsSettings变量中
cv::FileStorage fsSettings(strSettingsFile.c_str(), cv::FileStorage::READ);
step2
加载ORB Vocabulary 到mpVocabulary中
mpVocabulary = new ORBVocabulary();
bool bVocLoad = mpVocabulary->loadFromTextFile(strVocFile);
step3
创建关键帧数据集
mpKeyFrameDatabase = new KeyFrameDatabase(*mpVocabulary);
step4
创建地图
mpMap = new Map();
step5
创建观测器帧的观测器和地图观测器
mpFrameDrawer = new FrameDrawer(mpMap);
mpMapDrawer = new MapDrawer(mpMap, strSettingsFile);
step6
初始化跟踪线程器(主线程)
step7
初始化当地地图线程并启动
mpLocalMapper = new LocalMapping(mpMap, mSensor==MONOCULAR);
mptLocalMapping = new thread(&ORB_SLAM2::LocalMapping::Run,mpLocalMapper);
初始化一个mptLocalMapping 线程对象。进入Run方法中执行该线程,该线程不会阻塞主线程。
一个可执行的线程是在一个多线程环境中与其类似的指令同时执行的一系列指令,并且可以共享相同的地址空间。
step8
初始化回环检测线程并启动
mpLoopCloser = new LoopClosing(mpMap, mpKeyFrameDatabase, mpVocabulary, mSensor!=MONOCULAR);
mptLoopClosing = new thread(&ORB_SLAM2::LoopClosing::Run, mpLoopCloser);
step9
初始化观测器线程并启动
mpViewer = new Viewer(this, mpFrameDrawer,mpMapDrawer,mpTracker,strSettingsFile);
mptViewer = new thread(&Viewer::Run, mpViewer);
mpTracker->SetViewer(mpViewer);
构造了一个观测GUI的对象,同时开启一个对应的线程,然后跳到mpViewer对象的Run函数执行观测器的功能。
然后将Tracking与Viewer线程相关联。
step10
各个线程之间建立联系,这个功能主要是将一个对象的指针传递到另一个对象中的一个成员中,方便一个线程中的对象去调用另一个线程中的对象的成员变量,实现内存共享。
mpTracker->SetLocalMapper(mpLocalMapper);
mpTracker->SetLoopClosing(mpLoopCloser);
mpLocalMapper->SetTracker(mpTracker);
mpLocalMapper->SetLoopCloser(mpLoopCloser);
mpLoopCloser->SetTracker(mpTracker);
mpLoopCloser->SetLocalMapper(mpLocalMapper);