視覺慣性里程計Visual–Inertial Odometry(VIO)概述

周圍不少朋友開始作vio了,以前在知乎上也和胖爺討論過這個問題,本文主要來自於知乎的討論。git

來自https://www.zhihu.com/question/53571648/answer/137726592github

我的理解錯誤的地方還請不吝賜教,轉載請標明出處,內容若有改動更新,請看原博:http://www.cnblogs.com/hitcm/,若有任何問題,feel free to contact me at robotsming@gmail.com算法

若有問題,請及時反饋給我,博客會持續更新框架

1.基本概述與分類

       按照Davide Scaramuzza的分類方法,首先分紅filter-basedoptimization-based的兩個大類,這也和通常SLAM系統的分類方法相似。dom

       按照是否把圖像特徵信息加入狀態向量來進行分類,能夠分爲鬆耦合(loosely-coupled,下面的losely是筆誤)和緊耦合(tightly-coupled)。ide

       這是兩種獨立的分類方法,首先看是基於濾波仍是優化的,而後進一步根據狀態向量中是否加入了圖像的特徵信息來判斷鬆緊耦合。函數

        VIO主要嘗試的是融合Viusal和IMU的信息,所以後面的論述中也就主要考慮這兩種數據。性能

2.Filter-based

利用濾波的方法進行多傳感器的數據融合是一個很正常的套路。優化

按照是否把圖像特徵信息加入特徵向量來進行分類,能夠分爲緊耦合和鬆耦合。blog

2.1緊耦合

緊耦合須要把圖像feature進入到特徵向量去,所以整個系統狀態向量的維數會很是高,所以也就須要很高的計算量。比較經典的算法是MSCKF,ROVIO。

image

2.2緊耦合舉例-msckf

以比較經典的msckf爲例,聽說這也是谷歌tango裏面的算法,這要感受Mingyang Li師兄在MSCKF的不懈工做。

在傳統的EKF-SLAM框架中,特徵點的信息會加入到特徵向量和協方差矩陣裏,這種方法的缺點是特徵點的信息會給一個初始深度和初始協方差,若是不正確的話,極容易致使後面不收斂,出現inconsistent的狀況。

Msckf維護一個pose的FIFO,按照時間順序排列,能夠稱爲滑動窗口,一個特徵點在滑動窗口的幾個位姿都被觀察到的話,就會在這幾個位姿間創建約束,從而進行KF的更新。

image

2.3鬆耦合

而鬆耦合的方法則簡單的多,避免把圖像的feature加入狀態向量,而是把圖像當成一個black box,計算vo處理以後才和imu數據進行融合

Ethz的Stephen Weiss在這方面作了不少的研究,他的ssf和msf都是這方面比較優秀的開源算法,有興趣的讀者能夠參考他的博士論文。

image

2.4鬆耦合舉例-ssf

代碼在https://github.com/ethz-asl/ethzasl_sensor_fusion

濾波器的狀態向量是24維,以下,相較於緊耦合的方法會精簡不少。

image

Ssf_core主要處理state的數據,裏面有預測和更新兩個過程。

Ssf_update則處理另一個傳感器的數據,主要完成測量的過程。

image

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

image

image

       上圖左邊是純視覺的odemorty,右邊是視覺IMU融合的odemorty結構, 這個核心在於Frame經過IMU進行了聯合, 可是IMU自身測量有一個隨機遊走的偏置, 因此每一次測量又經過這個偏置聯合在了一塊兒, 造成了右邊那個結構,對於這個新的結構, 咱們須要創建一個統一的損失函數進行聯合優化

相關文章
相關標籤/搜索