ORBSLAM2--System类

版权声明:本文为博主原创文章,未经博主允许不得转载。 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);

猜你喜欢

转载自blog.csdn.net/qq_16481211/article/details/83541598