運行官方Demo
以TUM數(shù)據(jù)集為例,運行Demo的命令:
./Examples/RGB-D/rgbd_tum Vocabulary/ORBvoc.txt Examples/RGB-D/TUM1.yaml PATH_TO_SEQUENCE_FOLDER ASSOCIATIONS_FILE
rgbd_tum.cc的源碼:
運行程序rgbd_tum時傳入了一個重要的配置文件TUM1.yaml,其中保存了相機參數(shù)和ORB特征提取參數(shù):
閱讀代碼之前你應(yīng)該知道的事情 變量命名規(guī)則 ORB-SLAM2中的變量遵循一套命名規(guī)則: 1、變量名的第一個字母為m表示該變量為某類的成員變量. 2、變量名的第一、二個字母表示數(shù)據(jù)類型: ·p表示指針類型 ·n表示int類型 ·b表示bool類型 ·s表示std::set類型 ·v表示std::vector類型 ·l表示std::list類型 ·KF表示KeyFrame類型 這種將變量類型寫進變量名的命名方法叫做匈牙利命名法. 理解多線程 為什么要使用多線程? 1、加快運算速度:
開兩個線程同時計算兩個矩陣,在多核處理器上會加快運算速度 2. 因為系統(tǒng)的隨機性,各步驟的運行順序是不確定的 . Tracking線程不產(chǎn)生關(guān)鍵幀時,LocalMapping和LoopClosing線程基本上處于空轉(zhuǎn)的狀態(tài) . 而Tracking線程產(chǎn)生關(guān)鍵幀的頻率和時機不是固定的,因此需要3個線程同時運行,LocalMapping和LoopClosing線程不斷循環(huán)查詢Tracking線程是否產(chǎn)生關(guān)鍵幀,產(chǎn)生了的話就處理.
多線程中的鎖 為防止多個線程同時操作同一變量造成混亂,引入鎖機制: 將成員函數(shù)本身設(shè)為私有變量(private或protected),并在操作它們的公有函數(shù)內(nèi)加鎖.
一把鎖在某個時刻只有一個線程能夠拿到,如果程序執(zhí)行到某個需要鎖的位置,但是鎖被別的線程拿著不釋放的話,當(dāng)前線程就會暫停下來;直到其它線程釋放了這個鎖,當(dāng)前線程才能拿走鎖并繼續(xù)向下執(zhí)行. 什么時候加鎖和釋放鎖? unique_lock
SLAM主類System System類是ORB-SLAM2系統(tǒng)的主類,先分析其主要的成員函數(shù)和成員變量:
構(gòu)造函數(shù) System(const string &strVocFile, string &strSettingsFile, const eSensor sensor, const bool bUseViewer=true): 構(gòu)造函數(shù)
LocalMapping和LoopClosing線程在System類中有對應(yīng)的std::thread線程成員變量,為什么Tracking線程沒有對應(yīng)的std::thread成員變量? 因為Tracking線程就是主線程,而LocalMapping和LoopClosing線程是其子線程,主線程通過持有兩個子線程的指針(mptLocalMapping和mptLoopClosing)控制子線程. (ps: 雖然在編程實現(xiàn)上三大主要線程構(gòu)成父子關(guān)系,但邏輯上我們認(rèn)為這三者是并發(fā)的,不存在誰控制誰的問題).
跟蹤函數(shù)
System對象所在的主線程就是跟蹤線程,針對不同的傳感器類型有3個用于跟蹤的函數(shù),其內(nèi)部實現(xiàn)就是調(diào)用成員變量mpTracker的GrabImageMonocular(GrabImageStereo或GrabImageRGBD)方法.
傳感器類型用于跟蹤的成員函數(shù)
審核編輯:劉清
-
傳感器
+關(guān)注
關(guān)注
2542文章
50260瀏覽量
750135 -
SLAM
+關(guān)注
關(guān)注
23文章
411瀏覽量
31739
原文標(biāo)題:ORB-SLAM2代碼運行流程
文章出處:【微信號:3D視覺工坊,微信公眾號:3D視覺工坊】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論