ORB SLAM(六)回環檢測

2021-08-10 04:37:16 字數 2168 閱讀 2057

這件事情就好比乙個人走在陌生的城市裡,一開始還能分清東南西北,但隨著在小街小巷轉來轉去,已經不知道自己在什麼地方了。通過認真辨識周邊環境,他可以建立起區域性的地圖資訊(區域性優化)。再回憶以前走過的路徑,他可以糾正一些以前的地圖資訊(全域性優化)。然而他還是不敢確定自己在城市的精確方位。直到他看到了乙個之前路過的地方,就會恍然大悟,「噢!原來我回到了這個地方。」此時,將這個資訊傳遞歸整個地圖,就可以得到相當準確的地圖資訊。這就是回環檢測。

因此,回環檢測在大尺度地圖構建上是乙個非常有用的方法。回環檢測可以從二維影象出發,也可以從三維點雲出發。目前大家更推薦基於二維影象的方法。

dbow2

基於二維影象的方法本質上是乙個場景識別的問題。我沒有深入研究過,因此直接介紹一下orb-slam中用到的dbow2的方法。

bow(bag of words,詞袋模型),可以理解為乙個以特徵描述作為元素的詞典。如果是orb特徵,那就是orb詞典;如果是sift特徵,那就是sift詞典。詞典可以從影象資料集中訓練出來。下面舉乙個簡單的例子。假如我們有乙個一萬幅影象的資料集,並認為它基本上涵蓋了我們所面臨的場景。

從每幅影象中提取特徵點和特徵描述;特徵描述一般是乙個多維向量,因此可以計算兩個特徵描述之間的距離;

將這些特徵描述進行聚類(比如k-means),類別的個數就是詞典的單詞數,比如1000;也可以用beyes、svm等;

dbow2將這個詞典組織成樹的形式,方便搜尋。

在實際應用中,每一幅影象都在詞典中搜尋其最近鄰的單詞,並在該單詞下留下標記。如果a、b兩幅影象定位到同乙個單詞時,說明這兩幅影象有可能有相似的特徵點。當a、b有一定量的相似點時,可以認為這兩幅影象之間存在著一定的相似性。

orb-slam的作者修改了dbow2,輸出一系列候選影象(candidate)而不是一幅最相似的影象。

基於bow的方法有一些非常好的優勢:

詞典可以離線訓練。在實時應用中能離線的東西越多越好。作者提供了通過大量資料訓練出來的brief和sift的詞典。

搜尋速度飛快。小尺寸的影象可以在毫秒級別完成。作者提供了正向(direct index)和反向(inverse index)兩種輔助指標。反向指標在節點(單詞)上儲存到達這個節點的影象特徵的權重資訊和影象編號,因此可用於快速尋找相似影象。正向指標則儲存每幅影象上的特徵以及其對應的節點在詞典樹上的某一層父節點的位置,因此可用於快速特徵點匹配(只需要匹配該父節點下面的單詞)。

很多slam應用本身就需要計算特徵點和描述,因此可以用特徵來搜尋。

orb-slam的作者還用詞典的特性做快速的特徵篩選,減少特徵匹配需要的時間(特別是在大尺度上搜尋特徵時)。​

當然它也有自己的劣勢:

如果應用的場景比較特殊,請訓練自己的詞典。一般的詞典會不太好用。

bow一般不太考慮特徵之間的幾何關係(有人在做,但不清楚效果和計算量如何)

還有幾個comments:

如果應用本身不需要計算特徵,那要考慮額外的計算時間。

推薦像orb-slam一樣,bow只用來快速篩選影象,後續需要通過其它方法一一驗證、嚴格驗證。如果回環選錯了,那,就跪了。

如果場景特徵很少,或者重複的特徵太多,比較難辦。

在稠密點雲重建中,如果場景本身有豐富的幾何紋理,那麼可以利用兩幀之間(包括相鄰位置)的三維點雲匹配去驗證回環。如果匹配的誤差足夠小,那麼回環是比較準確的。

回環驗證和sim3優化

對每個候選的回環幀,作者先匹配其和當前幀上的特徵點,然後用特徵點對應的三維點去求解乙個相似變換矩陣(ransac框架下)。如果某個回環幀對應的矩陣有足夠多的內點,那去做sim3優化。利用優化結果再去尋找更多的特徵匹配,再做一遍優化。如果內點足夠多,那麼接受這個回環。

回環融合(fusion)

這裡有乙個隱含假設,即誤差隨著時間不斷累積,相對而言,我們更信任之前的資訊而不是當前的資訊。這部分主要是把回環幀的資訊融合到當前幀裡面,包括匹配的特徵點對應的三維資訊(深度、尺度等),世界座標系下的位姿(通過sim3的結果轉化過去)等等。融合也包括回環幀的鄰域和當前幀的鄰域。

全域性優化

預告

這個系列寫到這裡就暫時告一段落啦。回頭來看,前面幾篇寫的並不滿意,尤其追蹤那部分,將來爭取重寫一下。

接下來,本來想寫關於lsd的文章,估計會暫緩一下,先寫一兩篇關於網格生成的文章。

ORB SLAM(六)回環檢測

這件事情就好比乙個人走在陌生的城市裡,一開始還能分清東南西北,但隨著在小街小巷轉來轉去,已經不知道自己在什麼地方了。通過認真辨識周邊環境,他可以建立起區域性的地圖資訊 區域性優化 再回憶以前走過的路徑,他可以糾正一些以前的地圖資訊 全域性優化 然而他還是不敢確定自己在城市的精確方位。直到他看到了乙個...

orb slam2回環檢測初探1

1.detectloop 步驟1 如果距離上次閉環沒多久 小於10幀 或者map中關鍵幀總共還沒有10幀,則不進行閉環檢測 if mpcurrentkf mnidadd mpcurrentkf 將當前關鍵幀新增到資料庫中 mpcurrentkf seterase return false 步驟2 遍...

3D SLAM LeGo LOAM(2) 回環檢測

lego loam的回環檢測策略比較簡單,它同時對距離和時間作考量。1.利用了pcl中基於半徑的近鄰搜尋演算法,以機械人當前位姿為搜尋點,查詢半徑為7m範圍內的若干個位姿 2利用時間作為約束,如果歷史位姿對應時間與當前位姿對應時間的時間差太小,說明是個小回環,意義不大,作者在程式裡將時間差設定為大於...