ORB SLAM2詳解(六)閉環檢測

2021-08-03 08:32:45 字數 1740 閱讀 9181

首先我們計算關鍵幀ki和在covisibility graph中與其相連的關鍵幀之間的詞袋(bow)之間的相似度。本文中,作者離線訓練了大量的基於orb描述的詞袋,在程式執行時載入進去。這裡的詞袋作為對該關鍵幀的描述,將閉環檢測轉變為乙個類似於模式識別的問題。當相機再次來到之前到過的場景時,就會因為看到相同的景物,而得到類似的詞袋描述,從而檢測到閉環。這裡的介面是

// detect loop candidates and check covisibility consistency

if(detectloop())

跟進函式介面,可以很清晰地看到檢測閉環的過程,這裡作者使用了dbow2庫。

單目slam系統存在乙個問題,就是尺度的模糊性。如下圖所示: 

這個很好理解,因為針對乙個三維點p點來說,我們在單目拍攝的兩幅圖中可以匹配到pl和pr,但是無法確定其在三角化裡的具體位置,所以存在尺度模糊。而對於立體相機或rgbd相機,這裡的尺度就可以唯一確定。所以,單目slam是乙個sim3相似變換群,有7個自由度,即1個尺度因子s、3個旋轉角度、3個位移,即[sr|t]。顯然,立體相機和rgbd相機中s=1。所以單目相機在優化時,是在相似變換群優化,本文是在ransac框架下進行優化。這個介面為:

// compute similarity transformation [sr|t]

// in the stereo/rgbd case s=1

if(computesim3())

閉環矯正的第一步是融合重複的點雲,並且在covisibility graph中插入新的邊以連線閉環。首先當前幀的位姿會根據相似變換而被矯正,同時所有與其相連的關鍵幀也會被矯正。所有的被閉環處的關鍵幀觀察到的地圖點會通過對映在乙個小範圍裡,然後去搜尋它的近鄰匹配。這樣就可以對所有匹配的點雲進行更加有效的資料融合,並更新關鍵幀位姿,以及在圖中的邊。這部分介面為:

// perform loop fusion and pose graph optimization

correctloop();

為了有效地完成閉環,本文使用本質圖(essential graph)去優化位姿圖。這樣就可以將閉環的誤差分散到整個圖中。這部分主要是在correctloop()中的後部分:

// optimize graph

optimizer::optimizeessentialgraph(mpmap, mpmatchedkf, mpcurrentkf, noncorrectedsim3, correctedsim3, loopconnections, mbfixscale);

// add loop edge

mpmatchedkf->addloopedge(mpcurrentkf);

mpcurrentkf->addloopedge(mpmatchedkf);

至此,整個orb_slam2系統介紹完了。在整個記錄過程中,我也學到了很多。orb_slam2是乙個十分優秀的專案,整個工程**十分清晰簡潔,且與**描述高度吻合,是乙個優秀的開源學習專案。另外orb_salm2中集合了當下各種流行的slam框架,所以對slam的學習也是具有十分重要的意義。希望越來越多的人加入計算機視覺領域,互相分享互相學習,為了更新更有意思的技術給人類帶來福祉。我還是一名小小螺絲釘,仍需繼續努力··· ··

ORB SLAM2詳解(四)跟蹤

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

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.與當前...