IMU预积分主要干了2件事:主要出现在vins_estimator/src/factor/integration_base.h中。
1).IMU预积分获得α、β、γ值
2).误差传递函数的获取。
一.连续形式
IMU获取的是线加速度和角速度,通过对IMU测量量的积分操作,能够获得机器人的位姿信息。IMU测量值包括加速度计得到的线加速度和陀螺仪得到的角速度。
式子一左侧上标^为IMU线加速度测量值,右侧没有上标^代表的是线加速度真实值,ba为加速度偏置,测得的线加速度是重力加速度和物体加速度的合矢量,na为高斯噪声。
式子二左侧为陀螺仪角度测量值,右侧为角度真实值,bw为角度偏置,nw为高斯噪声。
加速度计偏置和陀螺仪偏置被定义为为随机游走并随着时间变化的,它的导数满足高斯分布。
对于图像帧k和k+1,体坐标系对应为bk和bk+1,位置、速度和方向状态值PVQ可以根据[tk,tk+1]时间间隔内的IMU测量值,在世界坐标系下进行传递的。
注:其中线加速度要转化成世界坐标系下才能进行积分
其中四元数叉乘形式如下:
可得
可以看出,IMU的状态传播需要帧bk的旋转、位置和速度,当这些初始状态发生变化时,需要重新计算。特别是在基于优化的算法中,每次我们调整姿态时,都需要在它们之间重新传播IMU测量值。为了避免重复传播,我们采用了预积分算法。
将参照系由世界参照系改为局部参照系bk后,我们只能对线加速度 a^和角速度 ω^相关部分预积分如下:
其中:
以上都是连续时间的预积分,对于离散时间实现,可以采用欧拉积分、中点积分、RK4积分等不同的数值积分方法。为了便于理解,这里选择欧拉积分来演示这个过程(我们在实现代码中使用中点积分)。
4.2 误差传递矩阵--主要有2个目的
第一个是在求α、β、γ的值的时候给不同bias提供相应的Jacobian;
第二个目的是给后端优化部分中IMU部分提供信息矩阵。
实际上讲,IMU在每一个时刻的测量都是有误差的,而且这个误差是满足高斯分布的。在IMU预积分的递推过程中,由于下一时刻的值是由上一时刻的值再加上当前的测量值获得的,所以每一时刻的PVQ的计算值所对应的方差也是在不断累积。因此,求出对应的误差传递函数十分重要。
所以,根据误差传递函数的定义,我们可以建立一个下面这个形式的误差传递线性模型,它描述了下一时刻和当前时刻误差的关系:
d(zk+1)和d(zk)分别是下一时刻的误差和上一时刻的误差,上面这个等式对应的向量/矩阵表达式如下式所示:
Jacobian的迭代公式为:
这个J有了之后,带入4.1.1最后那个公式中去,就能得到真正的α、β、γ。注意的是,VINS里面出现过多次J的计算,一个是在这,另三个是在后端优化里出现,注意不要混淆。
协方差迭代公式为:
这个协方差矩阵,可以用于计算后端优化中IMU部分的信息矩阵。
噪声项的对角协方差矩阵Q为: