《視覺SLAM進階:從零開始手寫VIO》第一講作業

1 視覺與IMU融合之後有何優勢?

要說視覺與IMU融合之後有何優勢,首先要明白視覺與IMU各自的侷限:

(1)IMU雖然可以測得加速度和角速度,但這些量都存在明顯的漂移,使得積分兩次得到的位姿數據非常不可靠。好比說,我們將IMU放在桌上不動,用它的讀數積分得到的位姿也會漂出十萬八千里。但是,對於短時間內的快速運動,IMU能夠提供一些較好的估計。這正是相機的弱點。當運動過快時,(捲簾快門的)相機會出現運動模糊,或者兩幀之間重疊區域太少以至於無法進行特徵匹配,所以純視覺SLAM非常害怕快速的運動。而有IMU,即使在相機數據無效的那段時間內,我們還能保持一個較好的位姿估計,這是純視覺SLAM無法做到的。

(2)相比於IMU,相機數據基本不會有漂移。如果相機放在原地固定不動,那麼(在靜態場景下)視覺SLAM 的位姿估計也是固定不動的。所以,相機數據可以有效地估計並修正IMU讀數中的漂移,使得在慢速運動後的位姿估計依然有效。

(3)當圖像發生變化時,本質上我們沒法知道是相機自身發生了運動,還是外界條件發生了變化,所以純視覺SLAM 難以處理動態的障礙物。而IMU能夠感受到自己的運動信息,從某種程度上減輕動態物體的影響。

(4)對於單目視覺SLAM,存在尺度不確定性,融合IMU後可以恢復尺度。

(5)純視覺SLAM在容易受弱紋理場景和光照變化的影響,在定位失敗時,可以依靠IMU進行短暫的定位。

綜上,視覺與IMU融合之後會彌補各自的劣勢,可利用視覺定位信息來估計IMU的零偏,減少IMU由零偏導致的發散和累積誤差;IMU可以爲視覺提供快速運動時的定位,以及因爲某種因素(場景特徵點較少,光照變化較大等)定位失敗時。

2 有哪些常見的視覺+IMU融合方案?有沒有工業界應用的例子?

(1)常見的視覺+IMU融合方案

  • MSCKF
  • OKVIS
  • ROVIO
  • VIORB
  • VINS-Mono,VINS-Mobile,VINS-Fusion

以上方案基本都在Github上開源了。

(2)工業界應用

  • Google:Tango,ARCore
  • Apple:ARKit
  • Microsoft:HoloLens
  • 百度:DuMix AR

3 在學術界,VIO研究有哪些新進展?有沒有將學習方法應用到VIO的例子?

要找學術研究的新進展,可以去Google Scholar通過關鍵詞(VIO,Visual-Inertial Odometry)和限定時間(如2019年以來)來檢索,還可以在機器人,計算機視覺等頂會(如IROS,ICRA,CVPR)上檢索。檢索是第一步,接下來就要閱讀題目和摘要,篩選有意義的研究,然後再選擇性精讀論文。

目前,我對學術論文關注較少,今天正好看到有人在知乎上發佈了VIO新進展,就簡單地搬運到這裏。

(1)傳統方法新進展

[1] Usenko V , Demmel N , Schubert D , et al. Visual-Inertial Mapping with Non-Linear Factor Recovery[J]. 2019.
[2] Shao W , Vijayarangan S , Li C , et al. Stereo Visual Inertial LiDAR Simultaneous Localization and Mapping[J]. 2019.

(2)基於學習方法的例子

[1] Clark R, Wang S, Wen H, et al. VINet: Visual-Inertial Odometry as a Sequence-to-Sequence Learning Problem[C]//AAAI. 2017: 3995-4001.
[2] Chen, Changhao, et al. “Selective Sensor Fusion for Neural Visual-Inertial Odometry.” arXiv preprint arXiv:1903.01534 (2019).
[3] Shamwell, E. Jared, et al. “Unsupervised Deep Visual-Inertial Odometry with Online Error Correction for RGB-D Imagery.” IEEE transactions on pattern analysis and machine intelligence (2019).
[4] Lee, Hongyun, Matthew McCrink, and James W. Gregory. “Visual-Inertial Odometry for Unmanned Aerial Vehicle using Deep Learning.” AIAA Scitech 2019 Forum. 2019.
[5] Wang, Chengze, Yuan Yuan, and Qi Wang. “Learning by Inertia: Self-supervised Monocular Visual Odometry for Road Vehicles.” ICASSP 2019-2019 IEEE International Conference on Acoustics, Speech and Signal Processing (ICASSP). IEEE, 2019.

4 四元數和李代數更新

在這裏插入圖片描述
(1)代碼

#include <iostream>

#include <Eigen/Core>
#include <Eigen/Geometry>

#include "sophus/so3.h"
#include "sophus/se3.h"

using namespace std; 

int main( int argc, char** argv )
{
    // 沿Z軸轉90度的旋轉矩陣
    Eigen::Matrix3d R = Eigen::AngleAxisd(M_PI/2, Eigen::Vector3d(0,0,1)).toRotationMatrix();
    
    cout << "R * R^t ?= I"<< endl << R * R.transpose() <<endl;

    Sophus::SO3 SO3_R(R);               // 從旋轉矩陣構造Sophus::SO(3)
    Eigen::Quaterniond q(R);            // 從旋轉矩陣構造四元數

    // 李代數更新
    Eigen::Vector3d update_so3(0.01, 0.02, 0.03); //更新量
    Sophus::SO3 SO3_updated = SO3_R * Sophus::SO3::exp(update_so3);
    cout<<"SO3 updated = "<< endl << SO3_updated.matrix() <<endl;
    
    //四元數更新
    Eigen::Quaterniond q_update(1, update_so3(0)/2, update_so3(1)/2, update_so3(2)/2); 
    Eigen::Quaterniond q_updated = (q * q_update).normalized(); //四元數歸一化
    cout<<"q2R = "<< endl << q_updated.toRotationMatrix() <<endl;

    return 0;
}

·(2)輸出結果

在這裏插入圖片描述

5 求導

在這裏插入圖片描述
在這裏插入圖片描述

參考

[1] 《視覺SLAM進階:從零開始手寫VIO》
[2] 《視覺SLAM十四講》
[3] https://zhuanlan.zhihu.com/p/68627439https://zhuanlan.zhihu.com/p/68627439

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章