ORBSLAM2 Tracking主線程

2021-10-17 08:11:45 字數 2999 閱讀 3798

詳見:

void tracking::

stereoinitialization()

void tracking::

monocularinitialization

()

主要步驟如下:

將當前幀初始化為關鍵幀keyframe

在地圖map中新增該初始關鍵幀keyframempmap->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.與當前...