1. 程式人生 > >orb-slam2程式碼總結(三)定位

orb-slam2程式碼總結(三)定位

上一講到了SLAM中的建圖(其本質是對MapPoint的管理),有了地圖,我們就有了環境的struct,這樣我們就可以通過特徵點匹配、優化等一系列步驟進行定位了,這次將對orb-slam中的定位部分進行解析,其本質是對frame的處理,包括關鍵幀和普通幀.

1、設定當前幀的參考關鍵幀

1) 初始化完成時 2) TrackLocalMap() 函式,UpdateLocalKeyFrames() 函式選擇共視程度最高的關鍵幀作為當前幀的參考關鍵幀.

if (pKFmax) {
    mpReferenceKF = pKFmax;
    mCurrentFrame.mpReferenceKF = mpReferenceKF;
}

3) CreateNewKeyFrame()函式

KeyFrame* pKF = new KeyFrame(mCurrentFrame,mpMap,mpKeyFrameDB);

mpReferenceKF = pKF;
mCurrentFrame.mpReferenceKF = pKF;

UpdateConnections過程 首先獲得該關鍵幀的所有MapPoint點,統計觀測到這些3d點的每個關鍵與其它所有關鍵幀之間的共視程度,對每一個找到的關鍵幀,建立一條邊,邊的權重是該關鍵幀與當前關鍵幀公共3d點的個數。 並且該權重必須大於一個閾值,如果沒有超過該閾值的權重,那麼就只保留權重最大的邊(與其它關鍵幀的共視程度比較高) 對這些連線按照權重從大到小進行排序,以方便將來的處理,更新完covisibility圖之後,如果沒有初始化過,則初始化為連線權重最大的邊(與其它關鍵幀共視程度最高的那個關鍵幀),類似於最大生成樹 使用: 1) loop close執行緒,CorrectLoop()函式 2) local mapping執行緒,ProcessNewKeyFrame()函式