天天看點

ORB-SLAM學習(2)—— Localmapping線程

ORB-SLAM的局部建圖線程實際做的工作是來維護全局map以及管理關鍵幀的,對tracking得到的關鍵幀進行篩選融合,以及對關鍵幀中的地圖點進行融合,剔除備援的關鍵幀和地圖點,維護一個穩定的全局map,并将篩選後的關鍵幀提供給回環檢測使用。

代碼架構

這一部分通過之前執行個體化SLAM系統對象時,執行個體化了一個LocalMapping的對象,并且開啟一個線程,運作LocalMapping::Run()函數。整個代碼邏輯如下:

ORB-SLAM學習(2)—— Localmapping線程

局部建圖線程主函數流程

  1. 設定目前不能接受新的關鍵幀到系統中,即在局部建圖(處理關鍵幀)過程中不允許新關鍵幀集有變動
  2. 對新關鍵幀進行處理。
  3. 篩選目前關鍵幀對應的地圖
  4. 對極限制檢測特征點,并建立地圖點加入全局map。
  5. 進行資料融合。
  6. 将關鍵幀交給回環檢測
  7. 設定目前可以接受新的關鍵幀到系統中,即在局部建圖(處理關鍵幀)過程中允許新關鍵幀集有變動

關鍵幀插入

  • 我們先計算目前關鍵幀的BoW向量
  • 然後更新目前關鍵幀所看到的地圖點的觀測值
  • 接着更新Covisibility圖的邊,并将該關鍵幀插入到地圖中
ORB-SLAM學習(2)—— Localmapping線程

地圖點的篩選

在這一步需要檢查最近加入的這些地圖點,并将一些備援的地圖點從最近地圖點的清單中去除 有四處地圖點的剔除規則:

  • 地圖點是被标記為bad的時候l
  • 有超過25%的關鍵幀可以看到這個點
  • 未被超過2個關鍵幀看到,并且目前關鍵幀的ID和看到該點的第一個關鍵幀之間的ID之差大于等于2的時候
  • 目前關鍵幀的ID和看到該點的第一個關鍵幀之間的ID之差大于等于3的時候
ORB-SLAM學習(2)—— Localmapping線程

新的地圖點建立

相機運動過程中和共視程度比較高的關鍵幀通過三角化恢複出一些MapPoints

  1. 擷取Cov圖中附近的關鍵幀
  2. 計算目前幀和每個附近關鍵幀之間的對極限制,計算滿足對極限制的比對點
  3. 對目前幀和某一個關鍵幀之間的比對點進行三角化計算,求解比對點的深度
  4. 接着分别檢查新得到的點在兩個平面上的重投影誤差,如果大于一定的值,直接抛棄該點。
  5. 檢查尺度一緻性
ORB-SLAM學習(2)—— Localmapping線程

局部集束調整

局部BA優化的過程是,通過目前取得的關鍵幀找到附近的局部關鍵幀,局部地圖點和可以觀察到這些局部地圖點但是不是局部關鍵幀的關鍵幀作為固定關鍵幀。我們通過固定附近的fixFK,統一優化附近的局部關鍵幀和目前關鍵幀的位姿,如果局部關鍵幀為空,那麼不調整局部關鍵幀。

ORB-SLAM學習(2)—— Localmapping線程

關鍵幀的篩選

檢查備援關鍵幀(僅限局部關鍵幀)

如果它看到的90%的MapPoints至少在其他3個關鍵幀(同樣或更精細的尺度)中被看到,則關鍵幀被認為是備援的.

參考博文:

https://blog.csdn.net/chishuideyu/article/details/76021496

https://blog.csdn.net/u010128736/article/details/53395936

https://blog.csdn.net/qq_30356613/article/details/80588326

繼續閱讀