(六)ORBSLAM地圖的更新策略



ORBSLAM2地圖更新策略簡介

  地圖的更新目標在於如何插入新的關鍵幀和地圖點,同樣,怎么剔除多余的關鍵幀和沒用的地圖點。

  接下來,筆者會從下面幾個方面來介紹地圖的更新策略:

  1. 統計當前關鍵幀的共視圖關鍵幀,構建臨時的局部地圖;

  2. 剔除當前關鍵幀中質量較差的地圖點;

  3. 局部地圖重投影獲取更多匹配對;

  4. 剔除冗余的關鍵幀。


 共視圖關鍵幀

  共視圖是ORBSLAM2中一個非常重要的概念,他的目的是將與當前幀有共同觀測的關鍵幀集合起來,構建一個臨時地圖,通過構建更強和更多的約束條件來優化相機的位姿。接下來,我們來看看ORBSLAM2的共視圖是如何構建的。

                                                                                     

  首先,我們引用ORBSLAM論文里的一個圖,從這個圖中我們看到了四種顏色。藍色表示地圖中的關鍵幀,綠色表示當前幀,紅色表示共視圖關鍵幀的共同觀測,黑色表示當前幀觀測不到的地圖點。顯然,我們構建的共視圖,就是和當前幀一起觀測到這些紅色地圖點的所有關鍵幀構成的。

  有了一個直觀的認識,我們再來具體看看在細節上,ORBSLAM2是怎么做的。同樣,為了方便大家理解,筆者還是以列提綱的形式,將其主要思路羅列出來。

  構建共視圖的具體流程是:

  1. 讀取當前關鍵幀的所有地圖點;

    原因:只是為了方便遍歷索引。

  2. 遍歷當前幀所有地圖點,將其按觀測情況進行分類。已有共同觀測,則更新觀測信息和地圖點;沒有共同觀測的,則臨時存儲;

    原因:主要是區分新創建的地圖點和已有的地圖點,目的是保留高質量的地圖點。

  3. 對當前幀所有地圖點提取觀測信息(每個地圖點包含多個觀測,每個觀測是一個映射,表示關鍵幀指針和對應的特征點ID),統計各個關鍵幀與當前幀的共同觀測數量並排序。將共同觀測數量大於15的關鍵幀加入共視圖中,若無滿足條件的,則將共同觀測數量最多的關鍵幀加入共視圖中,並取共同觀測數量最大的作為當前幀的父節點。

    原因:共視圖的含義即是與當前關鍵幀有共同觀測的關鍵幀所組成的圖,當時ORBSLAM2在更新地圖的時候,將約束條件增強了,只取共同觀測數量較多的關鍵幀加入共視圖中,在優化相機位姿時具有很好的幫助。


 剔除地圖點

  有些新創建的地圖點需要通過嚴格的篩選機制,才能確定是否加入地圖中,對每一個地圖點的篩選機制如下:

  1. 在預測該地圖點可見的所有關鍵幀中,實際跟蹤到該地圖點的關鍵幀數量必須占總數的25%以上;

    原因:在預測可見的關鍵幀中卻沒有跟蹤到該地圖點,顯然該地圖點是比較劣質的,但是ORBSLAM2放寬了條件,只要求其25%以上的關鍵幀能跟蹤到即可。

  2. 該地圖點被觀測到的次數過少,並且從上一次觀測到該點過后連續兩幀沒觀測到;

    原因:地圖點篩除機制的目的是保持地圖的緊湊性,以及保證跟蹤的質量。因此,插入地圖點的條件嚴苛些,其實是為了更好的定位。

  3. 該地圖點在被觀測到后,連續三幀內未被繼續觀測到;

    原因:地圖點的作用主要是為了更好的跟蹤,一個新建的地圖點,在創建后就跟蹤不到了,顯然這個地圖點的質量是非常差的,因此必須剔除。

  在剔除了不滿足要求的地圖點后,剩下的地圖點都是要插入地圖的。因此需要三角化新的地圖點,由於涉及一些理論知識,限於篇幅,筆者將單獨一講介紹地圖點的三角化。


獲取更多匹配對

  由於在特征匹配階段,ORBSLAM2只留下質量比較高的特征點,那些被篩除的特征點實際上比例非常高。因此ORBSLAM2通過構建局部地圖,在局部地圖中為這些篩除掉的特征點查找最優匹配。具體的查找方式同我們先前介紹的匹配方法類似,不過問題的規模稍微比之前的要大一些。具體流程如下:

  1. 在如前所述的共視圖關鍵幀中,從每個關鍵幀各自的共視圖中取出共同觀測最多的前5幀關鍵幀,如下圖所示。以此來構建更大的共視圖網絡。

    原因:擴大搜索范圍,能夠更容易為當前關鍵幀的每個特征點找到最優匹配。

    

  2. 遍歷上述共視圖所有的關鍵幀,將當前關鍵幀的所有地圖點逐個投影到共視圖中的關鍵幀。假設關鍵幀為 $KF_{covis}$,旋轉為 $R_{covis}$, 位移為 $t_{covis}$ ,當前關鍵幀為 $KF_{curr}$,當前關鍵幀中的一個地圖點 $P_{w}$,相機內參為 $K$,則:

   首先將當前關鍵幀的地圖點變換到關鍵幀 $KF_{covis}$ 相機坐標系中: $P_{covis} = R_{covis}P_{w} + t_{covis}$ ;

   再將其投影到關鍵幀 $KF_{covis}$ 的像平面中: $p_{covis} = KP_{covis}$ 。

   在像平面以 $p_{covis}$ 為中心的圓內找最優匹配。匹配的方法我們前面已經介紹過了,與這里的並無二致,筆者就不再贅述了。

    原因:投影的目的是為當前幀的所有地圖點找到最優匹配點。

  3.  除了將當前幀的所有地圖點投影到共視圖所有關鍵幀的像平面中去查找最優匹配點,ORBSLAM2還采用了逆過程,將共視圖所有關鍵幀的地圖點投影到當前關鍵幀中,查找最優的匹配。為當前關鍵幀的地圖點找到更優的匹配點。

    原因:由於前一次匹配的點,質量可能有提高的空間,再次匹配的時候可以用更好的代替。

  4. 匹配了所有地圖點后,需要更新地圖點的描述子和法向量以及深度信息;

    原因:也是為了保證地圖點更有分辨力,可以將該地圖點表示鄰域地圖點的一個聚類中心。


 剔除冗余關鍵幀

  在更新了地圖點之后,ORBSLAM2還執行了一次局部Bundle Adjustment。通過將共視圖關鍵幀和當前關鍵幀全部設置為優化變量,並將共視圖關鍵幀的共視圖作為固定節點,將共同觀測作為約束的邊,放入Bundle Adjustment中進行優化,最后得到更好的位姿。優化的思路同之前介紹的PNP方法有些類似,但不完全一樣。筆者將在閉環這一節中再詳細介紹Bundle Adjustment。這里就是稍稍略過,讓大家知道這里實際上有一次優化過程。

  優化以后,需要進行關鍵幀的篩除,具體如下:

  1. 對於共視圖中的任意一個關鍵幀,統計其所有地圖點重復觀測的數量,若其重復觀測的數量超過其地圖點總量的90%,則說明這個關鍵幀是冗余的,予以剔除。

    原因:ORBSLAM2堅持使用最小的信息冗余度來保持地圖的緊湊性,除了保證跟蹤的質量,也能避免內存和計算資源的消耗。

  篩除冗余的關鍵幀后,將當前關鍵幀輸入回環檢測線程,同時終止全局Bundle Adjustment,執行回環檢測,相關內容筆者會在后續介紹。


 總結:  

  在這一講中,我們主要介紹了ORBSLAM2地圖的更新策略,包括共視圖關鍵幀的創建,地圖點的剔除和插入以及關鍵幀的剔除策略。

  在這一講需要涉及的,但是沒有細講的內容包括地圖點的三角化,局部Bundle Adjustment和全局Bundle Adjustment,這些內容筆者會在接下來的內容中為大家介紹。

  下一講,筆者將為大家介紹ORBSLAM2地圖點的三角化。

PS:

  如果您覺得我的博客對您有所幫助,歡迎關注我的博客。此外,歡迎轉載我的文章,但請注明出處鏈接。

  對本文有任何問題可以在留言區進行評論,也可以在泡泡機器人論壇:http://paopaorobot.org/bbs/index.php?c=cate&fid=1中的SLAM技術交流模塊發帖提問。

  我的github鏈接是:https://github.com/yepeichu123/orbslam2_learn

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM