讲解IMU预积分之前先来讲一下在VINS-MONO里面对旋转的定义,其用法不同于ORB2里面的李群李代数的使用
各旋转的区别
旋转矩阵:
运算方便,使用9个量描述3自由度旋转(roll,pitch,yaw),引入额外约束(正交矩阵,行列式=1),求导困难,要求导只能对李代数(也是旋转向量)求导,无法对旋转矩阵进行求导
旋转向量 :
紧凑的表示旋转,没有额外的约束;具有周期性 θ + 2 k Π θ+2kΠ θ+2kΠ; n ⃗ ∈ 3 × 1 \vec{n}∈ 3 ×1 n∈3×1 , θ θ θ ∈标量
欧拉角:
直观,用户友好;需要指定旋转顺序,存在万象节死锁问题,无法进行球平面平滑插值,VINS中与欧拉角相关的部分的旋转顺序统一为ZYX
四元数:
紧凑不带奇异的表示方法;对用户不太直观,要求单位四元数 ∣ ∣ q ∣ ∣ = 1 ||q||=1 ∣∣q∣∣=1单位四元数才能表示旋转,额外约束的引进就会使得表示旋转也会过参数化,即4个变量描述3个自由度,当需要描述旋转误差的协方差矩阵时,其对应的矩阵为 4 × 4 4×4 4×4的矩阵,通常采用旋转向量来进行描述,对应的协方差矩阵 ∈ 3 × 3 ∈3×3 ∈3×3。
四元数: q = q= q= [ q w q x q y q z ] \begin{bmatrix} qw \\ qx\\ qy\\ qz\\ \end{bmatrix} qwqxqyqz = [ c o s θ 2 n ⃗ ⋅ s i n θ 2 ] \begin{bmatrix} cos\frac{θ}{2}\\ \vec{n}·sin\frac{θ}{2}\\ \end{bmatrix} [cos2θn⋅sin2θ]
IMU的频率一般为100HZ,则t=0.01s ,此时θ足够的小,可以近似θ → \to → 0
此时 lim θ → 0 c o s θ 2 = 1 \lim_{θ\to 0}cos\frac{θ}{2} = 1 limθ→0cos2θ=1, lim θ → 0 s i n θ 2 = θ 2 \lim_{θ\to 0}sin\frac{θ}{2} = \frac{θ}{2} limθ→0sin2θ=2θ
则 lim θ → 0 \lim_{θ \to 0} limθ→0 [ c o s θ 2 n ⃗ ⋅ s i n θ 2 ] \begin{bmatrix} cos\frac{θ}{2}\\ \vec{n}·sin\frac{θ}{2}\\ \end{bmatrix} [cos2θn⋅sin2θ] = [ 1 n ⃗ ⋅ θ 2 ] \begin{bmatrix} 1\\ \vec{n}·\frac{θ}{2}\\ \end{bmatrix} [1n⋅2θ]
而 n ⃗ ⋅ θ = w ⃗ ⋅ Δ t \vec{n}·θ=\vec{w}·Δt n⋅θ=w⋅Δt,在IMU里面就用陀螺仪的读数乘上时间就可以表示这个旋转的变化
当由 t 0 → t 1 t_{0}\to t_{1} t0→t1时刻的旋转变化 R 10 R_{10} R10 = [ 1 1 2 ⋅ w ⃗ Δ t 01 ] \begin{bmatrix} 1\\ \frac{1}{2} · \vec{w} Δt_{01}\\ \end{bmatrix} [121⋅wΔt01] 在代码里面采用中值积分,所以到时候这个 w ⃗ \vec{w} w会是一个固定的值 w ⃗ \vec{w} w = w 0 + w 1 2 \frac{w_{0}+w{1}}{2} 2w0+w1
这里采用了旋转向量进行表示,虽然旋转向量有周期性的问题,但是后面是采用误差卡尔曼进行计算,维护的是一个角度的误差量,误差量都是在0附近的,起码 ∈ ( Π , − Π ) ∈(Π,-Π) ∈(Π,−Π),此时就不再具有周期性的缺点了。