VIO算法总结(二)

VIO后端,后端有两种方法,一种是非线性优化,另一种是滤波,这两种有啥区别呢?其实这里面的知识还挺多的。

在数学上两者都是从full Bayesian推导的,我们都知道Kalman filter的无偏估计是要求系统是线性的,而且噪声是高斯的。对于非线性和噪声非高斯的系统如slam,需要线性近似,即EKF。这是有线性误差的,对于非线性优化其实也有线性误差的。因此我认为滤波和非线性优化两种方法,如果在约束条件相同的条件下,两者在数学上是等价的。

区别呢?

滤波一直在维护一个状态变量(所有优化变量)的协方差矩阵。

VIO算法总结(二)_第1张图片 EKF 更新方程

对于msckf,imu进行预计分得到pose的先验信息,和imu的先验协方差(和非线性优化一样):

VIO算法总结(二)_第2张图片

对协方差矩阵进行更新。假设imu和camera的整个协方差为:

VIO算法总结(二)_第3张图片

imu更新结束之后,当新的camera的状态来临的时候,需要对这个协方差进行augmented。

除了augmentaed协方差矩阵外,还需要对imu的状态和整个协方差进行correct。和正常的EKF的correct一样。

这里需要注意的是camera的误差方程不仅有pose项,还有landmark项即:

以此我们需要消去有关landmark那项:

现在可以正常的correct了。

msckf也有一个sliding window,和非线性一样,每一次新的测量到来是都会更新这个窗口里的状态变量,只不过msckf是靠维护协方差的方式来更新,二非线性优化是通过优化的方式来迭代优化。

msckf里面的feature和pose随着新的state到来时,sliding window里的某一帧图像的state会被remove掉。对应的landmark如果没有被剩下的camera观测到,也会被remove掉。对于非线性优化来讲remove掉的那些信息往往要做marginalization。marginalization最后会形成一个先验信息。具体给一看okvis'的论文和vins的code。这个对于非线性优化是很重要的。

如果想要在非线性优化中加入闭环,还是很容易的,保存之前多有关键帧的信息就可以了。但是对于滤波来讲就要从头一直维护所有landmark的协方差矩阵,这是很庞大的。relocation类似。

滤波:不需要做marginalization,重定位难。因为不需要迭代,速度略快。

优化:需要marginalization(比较耗时间),重定位容易。迭代优化,速度略慢。

 

 

 

你可能感兴趣的:(VINS,slam学习)