天天看點

Local Mapping

這裡先介紹下我參考的部落格
           
http://www.cnblogs.com/shang-slam/p/6435124.html
講的很好。
           
LocalMapping作用是将Tracking中送來的關鍵幀放在mlNewKeyFrame清單中;處理新關鍵幀,地圖點檢查剔除,生成新地圖點,Local BA,關鍵幀剔除。主要工作在于維護局部地圖,也就是SLAM中的Mapping。
我的話就直接從run()函數直接開始看,會講的更加細一點,啰嗦一點。首先檢查是否有關鍵幀在隊列中,如果有就執行新的函數ProcessNewKeyFrame();處理新的關鍵幀,在這個函數中首先将關鍵幀隊列中的最前面的一個傳給local mapping 裡面的mpCurrentKeyFrame目前關鍵幀,計算目前關鍵幀的bow,将MapPoints關聯到新的目前關鍵幀,并且更新觀測方向和描述子。如果MapPoint不在關鍵幀中,則進行三個函數
           
pMP->AddObservation(mpCurrentKeyFrame, i);
 pMP->UpdateNormalAndDepth();
pMP->ComputeDistinctiveDescriptors();
           
之前介紹過,就不在啰嗦了。之後還要更目前關鍵幀的新共視圖Covisibility,
           
mpCurrentKeyFrame->UpdateConnections();
           

然後将目前關鍵幀插入到地圖中,并傳回到run().

總結下:

  1. 處理新關鍵幀:ProcessNewKeyFrame()

做了三件事:

  a. 計算目前關鍵幀Bow,便于後面三角化恢複新地圖點;

  b. 将TrackLocalMap中跟蹤局部地圖比對上的地圖點綁定到目前關鍵幀(在Tracking線程中隻是通過比對進行局部地圖跟蹤,優化目前關鍵幀姿态),也就是在graph中加入目前關鍵幀作為node,并更新edge。而CreateNewMapPoint()中則通過目前關鍵幀,在局部地圖中添加與新的地圖點;

  c. 更新加入目前關鍵幀之後關鍵幀之間的連接配接關系,包括更新Covisibility圖和Essential圖(最小生成樹spanning tree,共視關系好的邊subset of edges from covisibility graph with high covisibility (θ=100), 閉環邊)。

執行

MapPointCulling(),就是剔除MapPoint,它會檢查最近加入的一些地圖點,它的條件兩個:

1. 跟蹤(比對上)到該地圖點的普通幀幀數(IncreaseFound)<應該觀測到該地圖點的普通幀數量(25%*IncreaseVisible):該地圖點雖在視野範圍内,但很少被普通幀檢測到。

2.

  1. 從添加該地圖點的關鍵幀算起的初始三個關鍵幀,第一幀不算,後面兩幀看到該地圖點的幀數,對于單目<=2,對于雙目和RGBD<=3;是以在地圖點剛建立的階段,要求比較嚴格,很容易被剔除;而且單目的要求更嚴格,需要三幀都看到。若從添加該地圖點的關鍵幀算起,一共有了大于三個關鍵幀,還存在清單中,則說明該地圖點是高品質的,從檢查清單中去掉。

一旦經過了這樣比較嚴格的篩選,地圖點隻有在觀測到它的關鍵幀<3時才會被剔除,這主要發生在關鍵幀被剔除(90%以上比對點可以被其他幀觀察到);或者局部捆集優化時,将地圖點歸為外點從觀測中剔除了的情況。是以地圖點中的外點是比較少的,是以整套ORB-SLAM中除了重定位和閉環很少去使用RANSAC。

ORB-SLAM中關鍵幀和地圖點的加入和删除秉承的是送入嚴出的标準,是以在提高了定位建圖準确性的前提下又很好地限制了計算量,可以用于large scale的場景。

傳回run()

CreateNewMapPoints();增加新的地圖點

根據目前關鍵幀恢複出一些新的地圖點,不包括和目前關鍵幀比對的局部地圖點(已經在ProcessNewKeyFrame中處理),注意了解與前面兩步的先後關系,先處理新關鍵幀與局部地圖點之間的關系,然後對局部地圖點進行檢查,最後再通過新關鍵幀恢複新的局部地圖點

回到run()

SearchInNeighbors() 更新并融合目前關鍵幀以及兩級相連(共視關鍵幀及其共視關鍵幀)的關鍵幀的地圖點。

回到run()

LocalBundleAdjustment(),然後對目前關鍵幀做個局部優化,

回到run()

KeyFrameCulling();候選的pKF是LocalMapping中目前處理的關鍵幀的共視關鍵幀,不包括第一幀關鍵幀與目前關鍵幀。周遊pKF中的地圖點的觀測:若有不少于3幀被觀測到(需要滿足觀測尺度不大于或近似于在pKF中的尺度),則記錄下。若pKF中90%以上的地圖點能夠被其他關鍵幀觀測到,也就是說,該關鍵幀的存在提供的地圖點觀測資訊有限,則将其删除!

晚安!

繼續閱讀