一、局部地圖構建簡介
為什么叫“局部”地圖構建,我的理解是這個線程的主要任務是像地圖中插入關鍵幀(包括地圖點等信息),以及需要進行LocalBA優化一個局部地圖,這是相對於回環檢測時進行的全局優化來說的,所以稱為局部地圖構建。而局部地圖構建的主要任務就是上面說的,等待跟蹤過程判斷是否應該插入一個新的關鍵幀,並把關鍵幀插入到地圖中,並對局部地圖(跟蹤過程中有一個局部地圖跟蹤)進行BA優化。具體細節包括三角化3D點,3D點的融合匹配,關鍵幀插入等。
二、局部地圖構建邏輯分析
根據跟蹤過程中的關鍵幀判定函數判斷是否插入關鍵幀,生成一個關鍵幀隊列,這個隊列中都是待插入地圖的關鍵幀;首先判斷該線程是否正在執行插入關鍵幀的操作(上一個關鍵幀插入沒有完成),然后計算當前關鍵幀的BoW向量、共視關系等信息並插入地圖;每個關鍵幀都附帶有特征點和描述符等信息(跟蹤過程中使用到的),但是並不是所有的特征點都會成為3D地圖點,因此需要剔除一些不合格的點,然后通過三角化創建地圖點;接下來判斷關鍵幀隊列中是否仍有關鍵幀,如果沒有(線程不是很忙)則進行3D點融合、LocalBA、冗余關鍵幀剔除等優化操作,而如果線程比較忙,則直接執行插入關鍵幀到閉環檢測隊列的操作(每一個關鍵幀都會判斷是否遇到閉環);最后更改線程狀態。
局部建圖線程一開始看比較亂,但是只要弄清楚了地圖中包含哪些信息(如上圖所示)邏輯上還是比較清楚的,就是把當前關鍵幀(包括MapPoints,Features等信息)插入到地圖中,並更新一下這個關鍵幀和其他關鍵幀之間的共視關系以及關鍵幀和地圖點的觀察關系等,但是有些地圖點或關鍵幀經過判斷之后顯得多余或不合適(如這個關鍵幀的點幾乎都能在其他關鍵幀上找到,或者這個關鍵幀上的點在其他關鍵幀上幾乎找不到),就需要刪除它,還有的3D點可能由於三角化誤差的關系,本來是一個點,被三角化成了兩個距離比較近的點,就需要進行融合等。
局部地圖和前面的跟蹤和后面的回環檢測都有聯系,關鍵幀是通過跟蹤線程產生的,而局部地圖進行LocalBA的條件是沒有發現回環以及關鍵幀隊列為空。這里地圖包含的要素對保存和加載地圖也是很有幫助的。
三、總結
相比跟蹤過程,邏輯上比較簡化,但是代碼並不簡單。分析關於局部地圖的更新量對於地圖的保存與加載也是很有幫助的,后面還會給出ORB-SLAM的地圖保存與加載的分析。