ORB SLAM2 理論知識梳理

2021-10-22 23:27:41 字數 3498 閱讀 1835

其中tracking執行在主線程,由tracking::grabimagemonocular()進入; 

loopclosing執行緒由loopclosing::run()進入;    

我將由這個3個執行緒講述orbslam2的單目模式是如何運作的。 

系統將交給tracking::grabimagemonocular()後,先將轉化為灰度圖,然後使用構建了乙個frame

注意系統在初始化的時候使用了不同的orbextractor來構建 frame,是因為在初始化階段的幀需要跟多的特徵點。

然後將進入了track(),tracking的大部分功能將在這裡實現:

tracking執行了4個任務:

1、單目初始化;

2、通過上一幀獲得初始位姿估計或者重定位。也就是求出當前幀在世界座標系下的位姿  t2​;

3、跟蹤區域性地圖(tracklocalmap())

單目初始化需要兩幀。具體如何選擇這兩幀不在這裡詳述。

得到可以用於初始化的兩幀後,我們先匹配他們兩之間的特徵點。

根據得到的兩幀影象的特徵匹配,我們就可以計算單應矩陣h,和基礎矩陣f這裡就是高翔的slam十四講第七章的2d-2d對級約束問題。

計算單應矩陣h,和基礎矩陣f的過程採用了ransac演算法來減少誤匹配對計算結果的影響。

最後計算出的單應矩陣h,和基礎矩陣f會有對應的得分,我們根據得分情況來選擇使用單應矩陣h,還是基礎矩陣f來進行初始化。

確定好使用單應矩陣h,還是基礎矩陣f之後,會將h或者f分解為r,t

在通過h或者f分解為r,t時,會有多個r,t的組合,我們需要將匹配的特徵點通過三角化重投影後,更具投影結果來選擇具體是哪個r,t的組合。

所以算出r,t後,我們自然也通過三角化得到了通過三角化重投影成功的匹配特徵點的相對第一幀的3d座標。至於剩下那些不能通過r,t重投影成功的匹配點,我們在後面將它剔除,

將初始化第一幀的光心作為世界座標系原點,那麼初始化第二幀在世界座標系中的座標就可以根據r,t計算出來了。

初始化成功後,後面的幀所面對的情況是一樣的。所以我們不從第3幀開始,我們從 第i開始

乙個乙個暴力匹配?不可能的,這輩子都是不可能滴,信不信我tracking分分鐘卡死給你看!

orbslam2提供了3種方式回到上述我提的問題,分別為trackwithmotionmodel(),trackreferencekeyframe(),relocalization()

具體如何實施呢?當上一幀跟蹤正常的時候,我們會生成乙個速度模型 mvelocity,使得mvelocity不為空,於是就我們就會進入trackwithmotionmodel()

速度模型mvelocity就是上一幀和上上幀的位姿變化。由於在短時間內,速度模型不會變化太大,這樣我們可以認為上一幀的速度模型(即上一幀和上上幀的位姿變化)等於當前幀的速度模型(即當前幀和上幀的位姿變化)。根據上一幀的求得的速度模型,以及上一幀在世界座標系的位姿得到當前幀在世界座標系中的初始位姿 t0​。

優化得到當前幀的較為精確的位姿  t1​.

當 速度模型 mvelocity為空時,會進入trackreferencekeyframe()通過參考關鍵幀獲得初始位姿估計(很少使用

如果上一幀被用來轉化為了關鍵幀,那麼參考關鍵幀就為上一幀轉化的關鍵幀。

如果上一幀沒有被轉化為參考關鍵幀,那麼參考關鍵幀就為在後面tracklocalmap()中找到的,和上一幀共視程度最高的那個關鍵幀

然後,我們再進行ba位姿優化。為了加速ba,我們將當前幀在世界座標系中的位姿的初始值 t0​設定為以上一幀的位姿在世界座標系中的位姿;

當mstate=lost時,我們會進入relocalization()當速度模型不能用,參考關鍵幀也沒有的時候,就意味著tracking已經跟丟了

這時候,我們先將當前幀轉化為bow,然後將代表當前幀的bow交給keyframedatabase,它就會返回乙個和當前幀很相似的集合作為候選幀。

接著,我們對當前幀和候選關鍵幀進行通過bow加速的特徵點匹配。並剔除特徵匹配數少於15的候選幀。

對於剩下的候選關鍵幀我們通過epnp結合ransac演算法進行篩選,並算出當前幀在世界座標系中的位姿 t2​。

此時,我們通過trackwithmotionmodel(),或者trackreferencekeyframe()或者relocalization()

距離上一次全域性重定位(global relocalisation),必須大於20幀;

進入;它主要做了以下幾件事:

1、   計算了插入的關鍵幀的mbowvec,mfeatvec;

3、   更新共檢視covisibility graph,spanningtree;

4、  將該關鍵幀插入到地圖map中;

從該點建立開始,到現在已經過了不小於2個關鍵幀,但是觀測到該點的關鍵幀數卻不超過cnthobs幀,那麼該點檢驗不合格

當前關鍵幀的covisibility graph中找到共視程度最高的n幀相鄰幀存入 vpneighkfs。

匹配當前關鍵幀未匹配的特徵點與vpneighkfs中未被匹配的特徵點,並校驗是否符合對級約束。

三角化匹配成功的特徵點對,得到其在世界座標系中的座標,生成乙個空間點;

檢查其生成的空間點是否復合以下要求

檢測並剔除當前幀相鄰的關鍵幀中冗餘的關鍵幀

剔除的標準是:計算在 covisibility graph 中與此節點  ki​連線的節點(即關鍵幀),總的來說這一步是為了計算閾值 minscore;

在最低相似度 minscore的要求下,向mpkeyframedb索要可能形成閉環檢測的候選幀集合;

對這些閉環檢測候選幀進行連續性檢測,剔除那些不滿足連續性檢測的閉環檢測幀;

在這一步進一步確定關鍵幀   ki​和哪乙個候選幀形成閉環檢測;

並通過計算sim3確定關鍵幀   ki​和閉環檢測幀之間的位姿;

ORB SLAM2 定位模式

void load const string filename,systemsetting mysystemsetting,keyframedatabase mpkeyframedatabase 別忘了新增標頭檔案和命名空間中的類宣告。同樣,需要在map.cc檔案中修改load 函式。laod 函式...

ORBSLAM2之LocalMapping執行緒

一 處理新關鍵幀processnewkeyframe 五 區域性ba 六 刪除冗餘關鍵幀keyframeculling 七 將當前關鍵幀插入閉環檢測佇列 更新當前關鍵幀的共檢視updateconnections a 遍歷當前關鍵幀的mp,更新共檢視 b 更新當前關鍵幀的子關鍵幀與父關鍵幀 i.與當前...

ORB SLAM2詳解(四)跟蹤

這一部分是orb slam系統中最基本的一步,會對每一幀影象進行跟蹤計算。tracking執行緒執行在主線程中,主要思路是在當前幀和 區域性 地圖之間尋找盡可能多的對應關係,來優化當前幀的位姿。每次新採集到一幀影象,就是用下列介面將影象傳入slam系統就行處理。該 位於主程式中 pass the i...