最近在讀ORB-SLAM的代碼,雖然代碼注釋算比較多了,但各種類和變量互相引用,看起來有點痛苦。索性總結(jié)了一下Tracking部分的代碼結(jié)構(gòu),希望能抓住主要思路,不掉坑里。
追蹤
追蹤部分的主要思路是在當前幀和(局部)地圖之間尋找盡可能多的對應關系,來優(yōu)化當前幀的位姿。
作者在追蹤這部分主要用了幾種模型:運動模型(Tracking with motion model)、關鍵幀(Tracking with reference key frame)和重定位(Relocalization)。
下面一一介紹。
Tracking with motion model
假設物體處于勻速運動,那么可以用上一幀的位姿和速度來估計當前幀的位姿。上一幀的速度可以通過前面幾幀的位姿計算得到。這個模型適用于運動速度和方向比較一致,沒有大轉(zhuǎn)動的情形下,比如勻速運動的汽車、機器人、人等。而對于運動比較隨意的目標,當然就會失效了。此時就要用到下面兩個模型。
Tracking with reference key frame
假如motion model已經(jīng)失效,那么首先可以嘗試和最近一個關鍵幀去做匹配。畢竟當前幀和上一個關鍵幀的距離還不是很遠。作者利用了bag of Words(BoW)來加速匹配。首先,計算當前幀的BoW,并設定初始位姿為上一幀的位姿;其次,根據(jù)位姿和BoW詞典來尋找特征匹配(參見ORB-SLAM(六)回環(huán)檢測);最后,利用匹配的特征優(yōu)化位姿(參見ORB-SLAM(五)優(yōu)化)。
Relocalization
假如當前幀與最近鄰關鍵幀的匹配也失敗了,那么意味著此時當前幀已經(jīng)丟了,無法確定其真實位置。此時,只有去和所有關鍵幀匹配,看能否找到合適的位置。首先,利用BoW詞典選取若干關鍵幀作為備選(參見ORB-SLAM(六)回環(huán)檢測);其次,尋找有足夠多的特征點匹配的關鍵幀;最后,利用特征點匹配迭代求解位姿(RANSAC框架下,因為相對位姿可能比較大,局外點會比較多)。如果有關鍵幀有足夠多的內(nèi)點,那么選取該關鍵幀優(yōu)化出的位姿。
更新局部地圖
Tracking成功以后,需要更新motion model,并判斷當前幀是否是新的關鍵幀。如果是,將其加入并更新局部地圖(local map),建立當前關鍵幀與其它關鍵幀的連接關系,更新當前關鍵幀與其它關鍵幀之間的特征點匹配關系,并利用三角法生成新的三維點,最后做一個局部優(yōu)化(local BA,包括相鄰關鍵幀和它們對應的三維點,參見ORB-SLAM(五)優(yōu)化)。
如果讀者對作者的程序有興趣,那么可以參照下圖來閱讀追蹤這部分的程序。
該系列的其它文章:
ORB-SLAM(一)簡介
ORB-SLAM(二)性能
ORB-SLAM(三)初始化
ORB-SLAM(五)優(yōu)化
ORB-SLAM(六)回環(huán)檢測
轉(zhuǎn)載請注明作者和出處(http://www.cnblogs.com/luyb),未經(jīng)允許請勿用于商業(yè)用途。[email protected]/LUYBCONTACT: luyanbin7 at Gmail.com
新聞熱點
疑難解答