詳見:
void tracking::
stereoinitialization()
void tracking::
monocularinitialization
()
主要步驟如下:
將當前幀初始化為關鍵幀keyframe
在地圖map
中新增該初始關鍵幀keyframe
:mpmap->addkeyframe(pkfini)
得到特徵點的3d座標
(for mono)更新新插入的關鍵幀的連線關係(即關鍵幀中的covisibility graph共檢視以及spanning tree生成樹)
(for mono)進行全域性優化:optimizer::globalbundleadjustemnt(mpmap,20)
總結:
跟蹤的三大策略:
bool tracking::
trackwithmotionmodel()
bool tracking::
trackreferencekeyframe()
bool tracking::
relocalization
()
適用情況:若有恆速值,則呼叫tracking::trackwithmotionmodel()
若無恆速值,或者恆速模型失敗,則呼叫關鍵幀模型tracking::trackreferencekeyframe()
若跟蹤失敗,則啟用重定位模型tracking::relocalization()
利用恆速模型得到初始位姿,縮小匹配區域,加速orb特徵匹配
根據恆速模型得到初始位姿變換
若匹配點太少則加大搜尋框的半徑,重新匹配:matcher.searchbyprojection(mcurrentframe,mlastframe,2*th,msensor==system::monocular)
利用g2o優化位姿:optimizer::poseoptimization(&mcurrentframe);
利用bow模型,與相同節點的特徵點進行匹配與篩選,加速orb特徵匹配
計算當前幀的bow向量:mcurrentframe.computebow()
以上一幀的位姿作為初始位姿進行g2o優化,以加快收斂
重定位包含閉環檢測與閉環驗證環節
計算當前幀的bow向量
閉環檢測篩選候選關鍵幀:vectorkeyframedatabase::detectrelocalizationcandidates(frame *f)
找出和當前幀具有公共單詞的所有關鍵幀
統計所有閉環候選幀中與當前幀f具有共同單詞最多的單詞數,求得候選幀閾值mincommonwords = maxcommonwords*0.8f
篩選大於閾值的候選幀並計算相似度得分:mpvoc->score(f->mbowvec,pkfi->mbowvec)
根據關鍵幀covisibility共檢視的連線關係分組,計算組得分,記錄組中最高得分關鍵幀,以及所有組中得分最高的得分
在組得分最高的候選幀中選擇大於閾值的關鍵幀:minscoretoretain = 0.75f*bestaccscore
第乙個篩選:得到一批相似度較高的候選幀
第二個篩選:可能候選幀中有些幀的共視程度是較高的,即較近的,所以再進一步通過分組篩選,得到一批與當前幀較為相似且空間位置較為稀疏的候選幀
利用epnp求解3d-2d問題,得到相對於候選關鍵幀的當前幀位姿
增加匹配點後,若匹配點足夠多,則進行g2o位姿優化
以當前幀為中心構建乙個區域性地圖,對這個區域性地圖的地圖點進行跟蹤,優化位姿
詳見:
bool tracking::
tracklocalmap
()
更新區域性關鍵幀:void tracking::updatelocalkeyframes()
與這些關鍵幀具有共視關係的最佳10幀(根據covisibility graph得到)
這些關鍵幀的父關鍵幀與子關鍵幀(根據spanning tree得到)
更新區域性關鍵點:void tracking::updatelocalpoints()
利用該g2o優化位姿optimizer::poseoptimization(&mcurrentframe)
詳見:
if
(neednewkeyframe()
)createnewkeyframe()
;
判斷當前幀是否為關鍵幀
bool tracking::
neednewkeyframe
()
根據執行緒層面,判斷是否插入關鍵幀:
很久沒有插入關鍵幀–>c1a條件
if((c1a||c1b||c1c)&&c2)
:插入關鍵幀
建立新的關鍵幀
void tracking::
createnewkeyframe
()
將當前幀構造成關鍵幀;將當前關鍵幀設定為當前幀的參考關鍵幀
插入關鍵幀
>
insertkeyframe
(pkf)
;>
setnotstop
(false);
ORB SLAM2 定位模式
void load const string filename,systemsetting mysystemsetting,keyframedatabase mpkeyframedatabase 別忘了新增標頭檔案和命名空間中的類宣告。同樣,需要在map.cc檔案中修改load 函式。laod 函式...
ORB SLAM筆記 2 框架概述
上篇已經提到過,raulmur博士開源了兩版orb,其中第二版在第一版的基礎上加入了雙目以及rgbd相機的前端介面,並且在回環模組中增開了全域性優化的執行緒。我們先從第一版的pipeline開始說起。另外要說的是這篇總結主要還是從整體上對架構進行說明,大體介紹每個模組的作用以及模組之間是怎麼聯絡起來...
ORBSLAM2之LocalMapping執行緒
一 處理新關鍵幀processnewkeyframe 五 區域性ba 六 刪除冗餘關鍵幀keyframeculling 七 將當前關鍵幀插入閉環檢測佇列 更新當前關鍵幀的共檢視updateconnections a 遍歷當前關鍵幀的mp,更新共檢視 b 更新當前關鍵幀的子關鍵幀與父關鍵幀 i.與當前...