DSO全家桶(一) DSO流程概述

2021-10-14 01:58:17 字數 4056 閱讀 6167

嗨,各位讀者朋友們好久不見。在開始之前,再碎碎念幾句。

筆者從2023年開始接觸dso,主要是得益於趙開勇博士的指導,將我領入dso的大門。隨後,在學習的過程中,也遇到非常多的挫折,雖然現在還有很多問題沒徹底搞清楚,但是有幸的是,泡泡機械人slam的朋友們為我提供了非常多的幫助,其中包括但不限於勇哥(趙開勇)、威爺(曲星威)、晨博(邱笑晨)、金戈戈(塗金戈)、龔益群、吳佳田等大佬的指導和幫助。

雖然目前對於dso認識還比較淺薄,但是也算是多少有些收穫,因此想從現在開始把dso整個體系再梳理一遍,更加系統地把各個模組的知識再學習學習,同時整理成筆記(部落格),算是給自己定個小目標吧。畢竟,再不寫部落格的話,可能東西就快忘光了...

筆者想著跟往期的orb-slam2一樣,完成每一篇部落格之後,再同步把對應的原始碼摳出來模組化,使其能夠單獨執行。不得不說,肢解乙個slam系統,將其模組化,可真算是筆者特別喜歡的事情了...   雖然有可能會像往期的orb-slam2一樣,只實現一部分,但是筆者盡力而為吧。

接下來就是列一下表,將後續的部落格內容都安排一下,筆者會主要圍繞著這個大綱來寫,至於啥時候能更完,這個事就隨緣了。不過開弓沒有回頭箭,筆者就努力努力吧。

筆者能力有限,有寫錯的或者不足的地方,也煩請各位同行指正、交流。

圖1. dso全家桶部落格標題列表

dso流程概述

好的,那麼我們就開始今天這一講的內容了,先對dso[1]的整體流程做乙個概述。

圖2. dso重建效果(參考dso[1])

dso全稱direct sparse odometry,是慕尼黑工業大學計算機視覺實驗室[2]的雅各布博士在2023年發表的工作。在dso之前,雅各布博士的另乙個直接法巨作是lsd-slam[3]及其雙目版本lsd-slam2[4]。非常幸運的是,高翔博士在知乎上的文章dso詳解[5]對dso做了非常詳細的分析,因此我們可以非常系統的了解dso系統的整體框架。

為了更加流暢地對整個系統流程進行介紹,筆者參考了塗金戈的部落格dso**框架。

一. 前端

前端的主要任務是對感測器的輸入進行預處理,隨後進行資料關聯,並構建目標函式,通過優化目標函式估計初始的相機位姿變換。

1. 初始化

初始化階段需要兩幀影象:

第一幀是作為基準幀,即dso視第一幀所在的相機座標係為世界座標系。對影象構建影象金字塔,逐層對影象提取梯度較大的點,並在層間設定關聯關係,同時為每個點初始化乙個深度值,通常為1。

第二幀基於第一幀的點,構建光度誤差函式,通過gauss-newton法優化得到初始相對位姿。隨後將第一幀設定為關鍵幀,將第一幀中提取的梯度點啟用,將其加入滑動視窗的優化中。在dso中,點分為兩種型別,一種是啟用點、一種是未成熟點。通常在影象中剛剛提取的或者深度未收斂的點稱為未成熟點,具有非常大的深度範圍。通過深度濾波器在幀間不斷地濾波,使得點的深度不斷收斂,最終得到的點會被啟用,加入滑動視窗中,這種點被稱為啟用點。

dso中的點在剛剛提取時,都是設定為深度範圍非常大的未成熟點。而在前端跟蹤階段,新幀都是不會先提取點的,只有在確定為關鍵幀時,經過視窗優化後,才會對當前幀提取點,並將滑動視窗所有啟用點投影到該幀中構建深度圖,作為後續幀的參考幀。而第二幀就是這種情況,在初始化後,進入滑動視窗優化,在這個階段會判斷初始化是否成功,若殘差太大,則判定初始化失敗,需要重新設定第一幀,重複上述過程。

2. 跟蹤

從第三幀開始,進入正式的跟蹤流程。需要明確的一點是,直接法不同於特徵點法,特徵點法可以通過特徵提取以及特徵匹配進行幀間資料關聯,並採用多檢視幾何的方式構建幀間約束關係,比如採用ransac pnp或者對極幾何等方式估算初始位姿變換。而直接法沒有這種資料關聯方式,它必須通過幀間運動將參考幀中的點反投影到當前幀中構建光度誤差函式,從而優化幀間相對位姿。那麼問題來了,又要用相對位姿來做反投影、又要反過來用這個投影的結果構建的誤差函式優化這個相對位姿,那麼這個初始的位姿怎麼來呢?直接法中採用的方式是運動模型,通過考慮1倍的、2倍的、0.5倍的、0倍的速度假設,構建多個運動模型,而基數是基於前幾幀間的相對位姿變換。

在得到了運動模型之後,便是逐個對運動模型進行驗證。即採用運動模型,將參考幀中的點反投影到當前幀中構建光度誤差函式,利用gauss-newton法優化目標函式,若結果收斂,則跳出模型驗證,直接給出相對位姿初值。否則,重複上述過程。

二. 後端

後端的內容主要包括深度濾波、未成熟點啟用、視窗優化。

1. 深度濾波

如前所述,所有未成熟點的深度範圍值都是非常大,在dso中初始化為[0, +∞]。通過在幀間進行極線搜尋,找到匹配的點後,採用gauss-newton進一步優化,值得注意的是,每次深度濾波器濾波後得到的結果仍然是乙個深度範圍,而不是單一乙個深度值。深度濾波在關鍵幀和非關鍵幀中都會用到。後續的博文中我們會詳細介紹。

2.未成熟點啟用

通過多次深度濾波,有些關鍵幀的未成熟點的深度範圍已經收斂,通過多種條件判定後,將未成熟點啟用,加入滑動視窗中進行聯合優化。

3. 視窗優化

通過將滑動視窗中的所有關鍵幀位姿和啟用點全部聯合起來優化乙個總的光度誤差函式,相比於兩幀之間的約束,滑動視窗中提供的約束條件更多,可以優化前端估計的相對位姿初值。後續我們會詳細介紹。

三. 邊緣化

在滑動視窗的優化中,隨著新的關鍵幀和點的加入,滑動視窗的大小會不斷增大,最終失去它靈活高效的功能。為了保持固定大小的視窗(dso預設值是7個關鍵幀和2000個啟用點),dso採用邊緣化策略將舊幀和舊點剔除。如圖3左圖所示,優化問題中的海塞矩陣具有良好的稀疏性,這種稀疏性可以使得slam問題的求解更加高效。但是,有些錯誤的操作通常會導致海塞矩陣的稀疏結構被破壞。參考所長(賀一家)的博文:slam中的marginalization 和 schur complement,由於同乙個點,可以被不同的關鍵幀觀測到,會產生約束關係。若我們貿然地將某個狀態給邊緣化了,會得到圖3右圖所示的結果,即稀疏性被完全破壞了。而在dso中,對於被多個關鍵幀觀測到的點,若已經到了需要邊緣化的階段,通常會選擇直接捨棄。並且,dso採用先邊緣化點,再邊緣化關鍵幀的目的也是為了保證海塞矩陣的稀疏性。  

圖3. 海塞矩陣的稀疏性(參考dso[1])

四. 參考文獻

[1] engel j, koltun v, cremers d. direct sparse odometry[j]. ieee transactions on pattern analysis and machine intelligence, 2017, 40(3): 611-625.

[2] 慕尼黑工業大學計算機視覺實驗室

[3] engel j, schöps t, cremers d. lsd-slam: large-scale direct monocular slam[c]//european conference on computer vision. springer, cham, 2014: 834-849.

[4] engel j, stückler j, cremers d. large-scale direct slam with stereo cameras[c]//2015 ieee/rsj international conference on intelligent robots and systems (iros). ieee, 2015: 1935-1942.

[5] dso詳解

[6] dso**框架

[7] mur-artal r, tardós j d. orb-slam2: an open-source slam system for monocular, stereo, and rgb-d cameras[j]. ieee transactions on robotics, 2017, 33(5): 1255-1262.

[8] 深度濾波器

[9] slam中的marginalization 和 schur complement

DSO全家桶(一) DSO流程概述

嗨,各位讀者朋友們好久不見。在開始之前,再碎碎念幾句。筆者從2019年開始接觸dso,主要是得益於趙開勇博士的指導,將我領入dso的大門。隨後,在學習的過程中,也遇到非常多的挫折,雖然現在還有很多問題沒徹底搞清楚,但是有幸的是,泡泡機械人slam的朋友們為我提供了非常多的幫助,其中包括但不限於勇哥 ...

DSO的零空間一些記錄

1 前言 看到篇對dso零空間介紹的文章,記錄一下防迷路,致敬大神!1.slam中的零空間 通常舉例子最常用的就是尺度,也就是當地圖的規模擴大乙個倍數的時候,整個slam的優化問題是不變的,也就是我們所說的不客觀。進而這裡明確乙個點 slam中的零空間其實是整個優化問題的零空間,而不是說是優化中某個...

vue全家桶(一) 使用 vue cli 構建專案

一.安裝node.js 二.安裝vue cli 全域性安裝 vue cli npm install g vue cli最新的 vue 專案模板中,都帶有 webpack 外掛程式,所以這裡可以不安裝 webpack。然後再命令列工具中使用 vue v 注意 v 大寫 檢視是否安裝成功。三.用 vue...