1. 程式人生 > >ORBSLAM2--System類

ORBSLAM2--System類

該類的功能主要是給整個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);