vins-迴環檢測單獨剝離運行

由於前端如果單純依靠視覺+imu作爲里程計,效果經常不穩定。因此最近做項目的過程中,將前端轉化爲以里程計(碼盤編碼器)來進行,相對比較魯棒。由於這個局部傳感器有累計誤差,因此長期運行不可靠,因此將vins-mono中迴環部分脫離出來。進行獨立運行。
這裏假定機器人運行的環境是在一個固定,變化相對較小的環境,因此圖像數據庫不進行更新。即
list<keyframe*> keyframelist
這個只保留載入存儲的特徵圖片。

在vio線程中,通過圖像特徵跟蹤,並三角化特徵點,能夠得到空間中三維點雲的信息。這些點,存在了關鍵幀的這三個類成員中:
在這裏插入圖片描述

缺點:這些特徵點沒有描述子,並且數量比較少,大概在100個以下。因此在構建關鍵幀的時候,需要兩個步驟:
(1)給這些關鍵點添加描述子信息(brief),這些特徵點在這裏暫時叫做窗口特徵點。
(2)給該幀提取更多的特徵點,用fast角點,提取非常多的特徵點(500個以上),同樣並給這些特徵點添加描述子信息。這些特徵點在這裏暫時叫做姿態特徵點。這些姿態特徵點沒有三維信息,只有像素座標和歸一化座標兩種座標。

迴環匹配分成兩個步驟
(1)用bow詞袋模型先找出歷史的圖像數據庫中,歷史的哪一幀與現在這一幀長得最像。
(2)找出最像的這幀圖像,因此歷史中這幀關鍵幀存有非常多的姿態特徵點,因此開始進行特徵點匹配。

匹配的過程是:
歷史的迴環候選幀的姿態特徵點當前幀窗口特徵點 兩者之間的匹配。
因爲姿態特徵點數量遠遠大於窗口特徵點數量,就找和當前幀窗口特徵點漢明距離最近的一些姿態特徵點。
爲什麼一個選擇姿態特徵點,一個選擇窗口特徵點?
因爲至少需要一個特徵點是知道3D座標的。纔可能知道當前幀相對於歷史幀的位姿。

因此知道了3D座標,知道了2D座標的投影,就能夠知道迴環候選幀在當前幀爲真值的情況下,迴環候選幀的姿態,與實際的迴環候選幀的姿態做一個姿態變換,其實就是當前幀應該做的一個姿態變換。比較饒,不過VINS-MONO確實是這樣做的。

VINS-MONO支持地圖的保存,保存的信息包括:
1.關鍵幀圖片(optional)
2.關鍵幀姿態
3.關鍵幀的姿態特徵點2D座標
4.關鍵幀的姿態特徵點2D歸一化座標
5.關鍵幀的姿態特徵點描述子

現在一個問題是,將vins-mono中迴環部分脫離出來。進行獨立運行。如果還是按照上面這個思路來做的話,由於需要知道特徵點的3D座標,因此同樣也是需要前端的VINS_ESTIMATOR來進行三角化的。因此脫離得不夠完全。因此我們需要換一種思路。

因此我們地圖保存的信息變成:
1.關鍵幀圖片(optional)
2.關鍵幀姿態
3.關鍵幀的窗口特徵點2D座標
4.關鍵幀的窗口特徵點3D座標
5.關鍵幀的窗口特徵點描述子

保存的這些信息後,現在我們還是按照這個思路
(1)用bow詞袋模型先找出歷史的圖像數據庫中,歷史的哪一幀與現在這一幀長得最像。
(2)找出最像的這幀圖像,因此歷史中這幀關鍵幀存有非常多的姿態特徵點,因此開始進行特徵點匹配。

但是特徵匹配的時候,現在我們匹配的過程是:
歷史的迴環候選幀的窗口特徵點當前幀姿態特徵點 兩者之間的匹配。
因此知道了3D座標,知道了2D座標的投影,就能夠知道迴環候選幀姿態爲真值的情況下,當前幀的姿態。

由於窗口特徵點有3D座標,當前幀只需要特徵點的2D座標,因此整個過程只需要運行一個pose_graph 包即可。

因此,整個流程應該是這樣的:
1.在一個熟悉的環境,運行vins-mono完整版,採集關鍵幀的姿態,完成後,保存關鍵幀姿態。(保存的信息需要進行修改,從姿態特徵點修改爲窗口特徵點)
2.直接運行修改後的pose_graph包,這個包訂閱的消息就只有圖像,不需要運行feature_tracking,以及 vins_estimator。

當然了vins-mono爲了追求發論文的高精度,因此把很多閾值調的比較苛刻,才認爲是迴環。因此,在實際運用中,爲了追求迴環的高輸出,我們可以把一些閾值降低,這些閾值包括:
1.詞袋模型找最接近的圖片,論文中認爲最像的圖像應該比第二像的圖片可信度高一定的閾值。
2.特徵點匹配過程中漢明距離的閾值。
3.PNP求解的過程,內點和外點的比例閾值。
4.PNP求解出來特徵點內點的數量閾值。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章