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