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