回環檢測之理解一二三

2021-09-13 14:22:53 字數 1911 閱讀 9583

回環檢測要克服的難題是視角變化和環境條件的變化,保證在劇烈環境變化下回環檢測的穩健性,實時性等特點。

回環檢測大部分的**是套路已有演算法做改進。而現有的演算法中,大部分都是借用cnn獲取影象描述符,或是區域性描述符,或是全域性描述符,然後採用pca降維處理, 再做相似性測量。所做的改進方向,或是改進cnn結構,或是改進描述符處理,讓這些描述符更具魯棒性或穩健性,再做相似性測量。現在越來越多的**傾向於提取影象中的語義資訊,經過處理再測量相似度。注意所使用的資料集也大多包含了季節光照視角變化下的環境影象。

理解回環檢測

什麼是回環檢測?

一般講回環檢測,都是在說slam的回環檢測環節,而slam又具體指什麼呢?回環檢測指什麼?回環檢測又在slam中起到什麼作用呢?這些問題在高翔老師的《slam十四講》中講得很清楚,我這裡只做引用,加上簡單的個人理解。

並且引用了右邊鏈結的分析

在視覺里程計(vo)環節,我們要在它根據相鄰影象的資訊估計出粗略的相機運動,從而給出乙個短時間內的軌跡和地圖;而後端優化環節通常考慮一段更長時間內或者說所有時間內的狀態估計問題,而且不僅使用過去的資訊更新自己的狀態,也會用未來的資訊更新自己,以期構建乙個大規模、長時間的最優軌跡和地圖。

位姿的估計往往是乙個遞推的過程,即由上一幀位姿解算當前幀位姿,因此其中的誤差便這樣一幀一幀的傳遞下去,也就是我們所說的累計誤差。我們的位姿約束都是與上一幀建立的,第五幀的位姿誤差中便已經積累了前面四個約束中的誤差。但如果我們發現第五幀位姿不一定要由第四幀推出來,還可以由第二幀推算出來,顯然這樣計算誤差會小很多,因為只存在兩個約束的誤差了。像這樣與之前的某一幀建立位姿約束關係就叫做回環。回環通過減少約束數,起到了減小累計誤差的作用。

那麼我們怎麼知道可以由第二幀推算第五幀位姿呢?也許第一幀、第三幀也可以呢。確實,我們之所以用前一幀遞推下一幀位姿,因為這兩幀足夠近,肯定可以建立兩幀的約束,但是距離較遠的兩幀就不一定可以建立這樣的約束關係了。找出可以建立這種位姿約束的歷史幀,就是回環檢測。

回環檢測的意義

有了前端的視覺里程計及後端優化的slam系統,似乎已經比較好用了。但其在提高實時性的同時精度卻降低了,一旦精度降低,又會面臨長時間累計誤差的問題,特別是像orb-slam那樣只做區域性地圖優化的方案。我們該如何平衡這個矛盾呢?

我們不妨先思考下,在乙個陌生的環境中,我們人類是如何進行環境地圖的建立?在區域性區域,人不斷的移動從而在腦海中建造增量式地圖,時間長了大部分人也分不清東南西北了,與起始點的關係又如何。假如人正巧回到了之前路過的位置,在對環境足夠敏感的情況下,他就能發現這個事實,從而修正自己之前對方位的判斷。我們說,此時檢測到了乙個回環,顯然,人可以通過面前看到的景象與腦海中殘缺的印象來對比從而檢測到回環的,對於slam來說也可以通過對比當前幀與過去關鍵幀的相似度,如相似度超過某一閥值時就可以被認為是檢測到回環。

現在,問題的關鍵就在於如何判斷兩幀的相似度。最直觀的做法是特徵匹配,比較匹配的數量是否足夠多。但由於特徵匹配非常耗時,回環檢測需要與過去所有關鍵幀匹配,這個運算量是絕對無法承受的。因此,有人提出了詞袋模型,用來加速特徵匹配。

什麼是詞袋模型呢?

詞袋模型就是把特徵看成是乙個個單詞,通過比較兩張中單詞的一致性,來判斷兩張是否屬於同一場景。

為了能夠把特徵歸類為單詞,我們需要訓練乙個字典。所謂的字典就是包含了所有可能的單詞的集合,為了提高通用性,需要使用海量的資料訓練。

字典的訓練其實是乙個聚類的過程。假設所有中共提取了10,000,000個特徵,可以使用k-means方法把它們聚成100,000個單詞。但是,如果只是用這100,000個單詞來匹配的話效率還是太低,因為每個特徵需要比較100,000次才能找到自己對應的單詞。為了提高效率,字典在訓練的過程中構建了乙個k個分支,深度為d的樹,如下圖所示。直觀上看,上層結點提供了粗分類,下層結點提供了細分類,直到葉子結點。利用這個樹,就可以將時間複雜度降低到對數級別,大大加速了特徵匹配。

python之理解 遞迴

古之欲明明德於天下者,先治其國 欲治其國者,先齊其家 欲齊其家者,先修其身 欲修其身者,先正其心 欲正其心者,先誠其意 欲誠其意者,先致其知,致知在格物。物格而後知至,知至而後意誠,意誠而後心正,心正而後身修,身修而後家齊,家齊而後國治,國治而後天下平。這是從林海峰部落格裡面copy的。很好的解釋了...

Quartz 理解一二

1.schedule ctory 例項化例項scheduler,才能使用。2.每次使用前,都必須被例項化,一旦重啟,需要再次例項化 3.scheduler啟動,才有可能去執行觸發器,執行job.其實暫停狀態,也不會去執行。4.quartz關鍵介面 1.scheduler 排程器介面 2.job 具體...

VINS 回環檢測與全域性優化

回環檢測 vins回環檢測與全域性優化都在pose graph.cpp內處理。首先在pose graph node載入vocabulary檔案給briefdatabase用,如果要載入地圖,會loadposegraph,它會讀取一些列檔案,然後載入所有的keyframe。同時在經過一系列 函式得到建...