周圍很多朋友開始做vio了,之前在知乎上也和胖爺討論過這個問題,本文主要來自於知乎的討論。
來自https://www.zhihu.com/question/53571648/answer/137726592
個人理解錯誤的地方還請不吝賜教,轉載請標明出處,內容如有改動更新,請看原博:http://www.cnblogs.com/hitcm/,如有任何問題,feel free to contact me at robotsming@gmail.com
如有問題,請及時反饋給我,博客會持續更新。
1.基本概述與分類
按照Davide Scaramuzza的分類方法,首先分成filter-based和optimization-based的兩個大類,這也和一般SLAM系統的分類方法類似。
按照是否把圖像特征信息加入狀態向量來進行分類,可以分為松耦合(loosely-coupled,下面的losely是筆誤)和緊耦合(tightly-coupled)。
這是兩種獨立的分類方法,首先看是基於濾波還是優化的,然后進一步根據狀態向量中是否加入了圖像的特征信息來判斷松緊耦合。
VIO主要嘗試的是融合Viusal和IMU的信息,因此后面的論述中也就主要考慮這兩種數據。
2.Filter-based
利用濾波的方法進行多傳感器的數據融合是一個很正常的套路。
按照是否把圖像特征信息加入特征向量來進行分類,可以分為緊耦合和松耦合。
2.1緊耦合
緊耦合需要把圖像feature進入到特征向量去,因此整個系統狀態向量的維數會非常高,因此也就需要很高的計算量。比較經典的算法是MSCKF,ROVIO。
2.2緊耦合舉例-msckf
以比較經典的msckf為例,據說這也是谷歌tango里面的算法,這要感覺Mingyang Li師兄在MSCKF的不懈工作。
在傳統的EKF-SLAM框架中,特征點的信息會加入到特征向量和協方差矩陣里,這種方法的缺點是特征點的信息會給一個初始深度和初始協方差,如果不正確的話,極容易導致后面不收斂,出現inconsistent的情況。
Msckf維護一個pose的FIFO,按照時間順序排列,可以稱為滑動窗口,一個特征點在滑動窗口的幾個位姿都被觀察到的話,就會在這幾個位姿間建立約束,從而進行KF的更新。
2.3松耦合
而松耦合的方法則簡單的多,避免把圖像的feature加入狀態向量,而是把圖像當成一個black box,計算vo處理之后才和imu數據進行融合。
Ethz的Stephen Weiss在這方面做了很多的研究,他的ssf和msf都是這方面比較優秀的開源算法,有興趣的讀者可以參考他的博士論文。
2.4松耦合舉例-ssf
代碼在https://github.com/ethz-asl/ethzasl_sensor_fusion
濾波器的狀態向量是24維,如下,相較於緊耦合的方法會精簡很多。
Ssf_core主要處理state的數據,里面有預測和更新兩個過程。
Ssf_update則處理另外一個傳感器的數據,主要完成測量的過程。
3.optimization-based
隨着研究的不斷進步和計算平台性能的不斷提升,optimization-based的方法在slam得到應用,很快也就在VIO中得到應用,緊耦合中比較經典的是okvis,松耦合的工作不多。
3.1松耦合舉例
這方面的工作不多,而且效果顯然是沒有緊耦合好的。大佬Gabe Sibley在iros2016的一篇文章《Inertial Aided Dense & Semi-Dense Methods for Robust Direct Visual Odometry》提到了這個方法。簡單來說就是把vo計算產生的位姿變換添加到imu的優化框架里面去。
3.2緊耦合舉例-okvis
代碼在https://github.com/ethz-asl/okvis
上圖左邊是純視覺的odemorty,右邊是視覺IMU融合的odemorty結構, 這個核心在於Frame通過IMU進行了聯合, 但是IMU自身測量有一個隨機游走的偏置, 所以每一次測量又通過這個偏置聯合在了一起, 形成了右邊那個結構,對於這個新的結構, 我們需要建立一個統一的損失函數進行聯合優化