重读ORB_SLAM之Tracking线程难点
1. 初始化
當獲取第一幀圖像與深度圖后,首先設置第一幀位姿為4*4單位矩陣,然后為整個map添加關鍵幀與地圖點。且更新地圖點與關鍵幀的聯系,例如地圖點被哪個關鍵幀觀測到,而此關鍵幀又包含哪些地圖點。而且不得不為ORB的處理細節感動,每個地圖點因為對應著不同關鍵幀的特征點,需要擇優選取地圖點最合適的描述子,pNewMP->ComputeDistinctiveDescriptors()。然后為localmapping線程添加關鍵幀,以及其他一些準備工作。
2. 正常定位建圖模式
后續的定位工作,主要由四個函數完成,首先如果有速度信息,就會采取TrackWithMotionModel,沒有速度信息或者重定位后的第一幀就會采用TrackReferenceKeyFrame(),當運動速度快,或者其他原因導致定位失敗,會一直采用重定位方法。在跟蹤當前幀成功后,還要在TrackLocalMap里繼續對局部地圖做跟蹤以及優化位姿。這個localmap局部地圖很有迷惑性,跟localMapping感覺很相似。但是兩者有很大不同,localmap有兩部分組成,一個是局部關鍵幀,一個是局部地圖點。局部關鍵幀由與當前關鍵幀有共同觀測點的其他關鍵幀組成,且包括其自身。如果localkeyframes不到80幀,則繼續添加每個localkeyframes內的鄰居關鍵幀,孩子與父關鍵幀。localMapping 則是根據傳來的關鍵幀,經過計算,往整體的map中添加數據。localPoints就很容易理解了,把局部關鍵幀內所有的看到的地圖點都添加進去。重定位函數Relocalization,就是在關鍵幀庫里搜索能匹配上的關鍵幀,做相對位姿計算。
3. 只定位不建圖模式
這種模式下,首先會進行重定位,然后根據mbVO 參數判斷是進行正常的跟蹤定位操作還是要結合重定位信息。mbVO為真表示當前圖像和上一幀地圖點匹配數目小于10,有可能是運動過快的原因。
4. 結尾處理
此處有兩個點比較難理解:
梳理之后發現,在localMapping中,會對局部地圖進行優化,會對地圖點和關鍵幀的關系做出調整,有些地圖點就會刪掉某些observation。所以這里需要處理。
在TrackWithMotionModel里有一個UpdateLastFFrame函數,在純定位模式下,會根據深度圖新增一些臨時地圖點,為的是增加匹配點數,使位姿更準確。所以后面要把這些臨時的地圖點刪去。
轉載于:https://www.cnblogs.com/easonslam/p/9077001.html
總結
以上是生活随笔為你收集整理的重读ORB_SLAM之Tracking线程难点的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: EE4J项目情况汇总,微软加入Jakar
- 下一篇: Django的mode的分组查询和聚合查