视觉惯性里程计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自身测量有一个随机游走的偏置, 因此每一次测量又经过这个偏置联合在了一块儿, 造成了右边那个结构,对于这个新的结构, 咱们须要创建一个统一的损失函数进行联合优化

相关文章
相关标签/搜索