眾所周知,斯坦德機器人(深圳)有限公司是一家專注于工業級移動機器人的研發與生產的國家高新技術企業。目前已實現了從機器人底層定位算法、操作系統、控制器等核心技術的自主研發全覆蓋,主要業務為激光SLAM自主移動機器人及柔性物流解決方案。
作為移動機器人行業的龍頭企業之一,為了能更好的推動行業技術交流,積極用科技賦能社會,引領工業物流柔性變革,斯坦德機器人將開設“斯坦德機器人大學”學習欄目,和大家分享交流移動機器人相關的產品知識、技術研究經驗、項目實施方案、行業銷售動態以及市場洞察走向等內容,賦能嘉賓不僅來自于斯坦德內部專業團隊,更有神秘行業大咖空降。
本次分享的嘉賓來自斯坦德slam算法技術團隊的AndreYe,主要內容是關于雙目DSO的詳解。
關于DSO
今天我們來講一講視覺SLAM相關的東西,當然,既然是技術分享,那得講點有難度的東西才行。至少,要講的東西不是滿大街都有的才行。所以今天我們來分析一下雙目DSO這個東西它到底是怎么實現的。
DSO全稱Direct Sparse Odometry,即直接稀疏里程計,是慕尼黑工業大學計算機視覺實驗室的Jakob Engel博士在2016年提出的,到今年已經是第4個年頭了。但是DSO相關的資料還是非常少,至少對比ORB-SLAM是少得可憐。大概這就是高翔博士所說的歷史遺留問題帶來的連鎖反應吧。不過好在高翔博士在DSO的基礎上優化了數據結構(LDSO),至少在前后端數據結構上是清晰了不少,至于DSO這個后端嘛... 希望大家能懂我這個尷尬的笑容: )
正所謂前人栽樹后人乘涼,多虧了高翔博士在知乎的分享:DSO詳解,這才使得這篇文章可以節省大量的篇幅。有關于DSO一些概念性的問題還有流程,我們大體都不會細究,主要是分析雙目DSO和DSO不同的地方。
初始化
首先,先來看看初始化。DSO是一個單目視覺里程計,那么不可避免的會面臨初始化的問題。
單目DSO初始化會在最開始的時候會為每一個點賦值深度,隨后創建一個深度地圖,通常這需要一個特殊的運動軌跡才能完成初始化。另外,在窗口優化以后,需要對新的關鍵幀提取未成熟點,由于新的關鍵幀只有一個視角,無法通過三角化得到深度信息,因而這些點的初始化范圍通常會被設置為0到正無窮,顯然這需要多次濾波才可能讓深度值收斂。
雙目DSO由于引入了固定基線,通過靜態雙目約束,可以為系統引入絕對尺度信息。那么它是怎么做到的呢?在初始化的時候,由于雙目圖像已經通過雙目矯正,使得極線在水平方向,因此采用3*5的窗口沿著極線進行NCC搜索匹配,可以得到匹配關系,如果有人覺得3*5這個窗口太小不靠譜,可以嘗試一下把它改大一點。通過雙目立體視覺可以很容易得到深度信息。因此雙目DSO的初始化地圖可以直接從單一一個幀得到,無需特定的運動軌跡,簡化了初始化的操作。在窗口優化以后,對新提取的未成熟點,同樣也是利用雙目匹配計算深度信息,為這些點提供一個較小的深度變化范圍,在后續的深度濾波過程中可以非常快的收斂。是的,你可以認為對新關鍵幀提取點之后,給點估計的深度值不需要特別準確,只要包含在該深度范圍里就好了,因為后面濾波會讓他慢慢收斂的。當然,能準確的估計就更好了,畢竟這會對定位精度帶來一定影響。
如圖1 我們的NCC匹配效果
窗口優化
窗口優化其實跟單目DSO差不大多,只不過將雙目的右目相機考慮進來了。但是這里有一個假設,就是左右目之間的相機內參是一致的。那么結果就變成:每一個關鍵幀需要優化的變量有14維,其中包括相機內參4維、左相機位姿6維、左右相機各兩個光度仿射參數,記作
正常來說,左右相機之間的內參數差別是不大的,如果很不幸,相機的內參數差別較大,那么很可能每一幀需要優化的參數得有18維了。
在窗口優化中,我們會將滑動窗口中的所有關鍵幀以及激活點(通常DSO窗口中包含7個關鍵幀和2000個左右的激活點)全部包含進一個優化函數中。
同原文一樣,為了方便,這里我們省略了Pattern的記號。這個函數的意思是指將第 i 個關鍵幀中的點 p 反投影到第 j 個關鍵幀中,計算二者之間的光度誤差。具體怎么反投影的,我們就不在這里展開了,在高翔博士的那篇知乎里寫得非常詳細。這里我們可以看到,為了對光照變化進行建模,DSO引入了兩個光度仿射參數,每一個幀都有一對這樣的參數a, b。那么對于雙目相機來說,當然得有兩對啦。
公式(3)這東西,雙目DSO里管它叫動態殘差。有動態就得有靜態,不然沒必要分那么清楚。通過雙目固定基線約束引入的殘差,就叫靜態殘差,如公式(4)所示。
與前面介紹的動態殘差一樣,只不過是將第i 個關鍵幀中host的激活點,投影到對應的右幀中,構建殘差函數。從上面可以看出,雙目DSO與DSO差別的地方就在于多了個雙目約束。
上面完成了對問題的描述,接下來得進入關鍵節點了。首先先假設滑動窗口中有 N f 個關鍵幀, N p 個激活點。于是,我們需要優化的變量有:
優化的操作基本上跟單目DSO基本沒有差別,不過需要注意的是零空間需要去除尺度項,畢竟已經提供了絕對尺度了,尺度不確定性的問題就克服了。否則,得到的軌跡仍然是單目的。
邊緣化
邊緣化的操作跟DSO比起來就更沒有什么不同之處了。為了讓大家更加方便的看出雙目DSO和單目DSO的差別,我們這里做一下對比:
實驗
在實驗部分,首先我們先看看原論文的這個圖(圖2),很多人很好奇為什么會需要加一個這樣的靜態雙目權重。這應該算是一個小技巧了,通過引入一個權重,對靜態雙目更多重視,這樣可以讓定位更加準確一些。可是作者并沒有給出運動軌跡圖,這讓許多研究人員非常容易忽略這個細節。
圖2 雙目DSO論文實驗靜態雙目權重
那么我們既然打算寫這篇文章,那肯定就本著專業的心態,為大家提供一下這個直觀一點的解釋。首先先看圖3,在未加權重的時候,我們會得到一個比較大的定位誤差,在測評的時候這個定位的軌跡絕對誤差最高可能會達到46米,最低也不低于10米。從圖3中可以看到,紅色方框那個區域是導致軌跡誤差偏大的主要原因。那么加了權重以后是怎么樣的呢?看看圖4,這是在加了權重的運動結果,整體應該是比較符合實際情況的,總體軌跡誤差大概是在一米左右,屬于可接受的范圍。
圖3 KITTI06未添加雙目權重時的估計軌跡與真值軌跡對比
圖4 KITTI06添加雙目權重后的估計軌跡與真值軌跡對比
后續在KITTI數據集上測試的效果基本上與原文差不太多,所以詳細的實驗配置大家可以參考雙目DSO原始論文即可。最后放幾個實驗圖看看效果。
圖5 KITTI06 未添加雙目權重的軌跡圖
圖6 KITT06 添加雙目權重的軌跡圖
圖7 KITTI07添加雙目權重的軌跡圖
以上,本期關于雙目DSO的知識分享就到這里了。如果有感興趣的學習伙伴、同行朋友,歡迎前來溝通交流【hello@standard-robots.com】
2025-04-18 08:54
2025-04-18 08:53
2025-04-17 08:16
2025-04-17 08:13
2025-04-16 10:55
2025-04-16 08:50
2025-04-14 14:57
2025-04-14 14:53
2025-04-09 12:40
2025-04-08 08:51