MSCKF3讲:后端理论推导(上)
文章目录
- MSCKF3讲:后端理论推导(上)
- 1 MSCKF中的状态变量
- ① `IMU`状态:
- ② `cam0`状态:
- ③ `IMU`和`cam0`间状态关系
- 2 微分方程递推(数值解)
- 3 IMU状态预测
- 3.1 连续时间下**IMU状态**运动学方程(微分方程)
- ① 状态(理想值)
- ② 状态(测量值)
- 3.2 离散时间下**IMU状态**运动学方程(差分方程)
- 4 IMU误差状态预测
- 4.1 连续时间下 误差状态
- 4.1.1 推导过程
- ① 旋转
- ② 速度
- ③ 平移
- ④ 偏置
- 4.1.2 结论
- 4.2 离散时间下误差状态
- 4.2.1 均值
- 4.2.2 协方差矩阵
- 4.3 状态增广
- 4.3.1 什么是状态增广?
- <1> 雅可比推导
- <2> 扩展误差状态协方差
- 4.3.2 为什么要状态增广
- 5 状态更新
- 5.1 理论分析
- 5.2 视觉观测雅可比矩阵H推导
- 5.3 视觉观测雅可比的后续处理
- 5.3.1 左零空间投影
- 5.3.2 QR分解降低计算量
- 5.4 更新
- 6 左零空间投影
- 6.1 为什么要进行左零空间投影
- 6.2 如何计算零空间矩阵V
写在前面,这篇论文中C表示旋转矩阵,或者把q变为旋转矩阵的意思。
1 MSCKF中的状态变量
下面G
表示世界系,I
表示IMU
坐标系(作为body
系),cam0
表示左目相机系。关于坐标系表示的申明,下面这种表达方式 G I R ^I_G{R} GIR等价于 R I G {R}_{IG} RIG,是一种常见的转换关系。
① IMU
状态:
(4+3+3+3+3)×1 = 16×1
X I = [ G I q ˉ T b g T G v I T b a T G p I T ] T \mathbf{X}_\mathrm{I}=\begin{bmatrix}^I_G\bar{q}^T&\mathbf{b}_g^T&^G\mathbf{v}_I^T&\mathbf{b}_a^T&^G\mathbf{p}_I^T\end{bmatrix}^T XI=[GIqˉTbgTGvITbaTGpIT]T
- G I q ˉ T ^I_G\bar{q}^T GIqˉT表示
the rotation from frame {G} to frame {I}
,描述世界系到惯性系的旋转,用单位四元数表示,4维。因为是JPL,局部坐标系,所以是 q I G q_{IG} qIG而不是 q G I q_{GI} qGI - G p I T ^G\mathbf{p}_I^T GpIT和 G v I T ^G\mathbf{v}_I^T GvIT表示位置和速度,即平移量,
the IMU position and velocity with respect to {G}
,在世界系下表示。 - b g T \mathbf{b}_g^T bgT和 b a T \mathbf{b}_a^T baT分别表示
the biases affecting the gyroscope and accelerometer measurements
,即陀螺仪和加速度计的偏差。
② cam0
状态:
利用滑动窗口来记录的,不只是一帧的相机姿态。at any time instant the EKF state vector comprises (i) the evolving IMU state (ii)a history of up to N max past poses of the camera
X C = [ T m T ⋯ T n T ] T \mathbf{X}_\mathrm{C}=\begin{bmatrix}\mathbf{T}_m^T\cdots\mathbf{T}_n^T\end{bmatrix}^T XC=[TmT⋯TnT]T
注意相机的每个T都是由 C q G ^C{q}_G CqG和 G p C a m 0 ^G\mathbf{p}_{Cam0} GpCam0表示(C也是cam0
,简单表示,(4+3)×1×N
)
③ IMU
和cam0
间状态关系
(4+3)×1
C I q ⊤ I p C ⊤ _C^I\mathbf{q}^\top\quad{}^I\mathbf{p}_C^\top CIq⊤IpC⊤
2 微分方程递推(数值解)
微分方程
{ y ′ ( x ) = f ( x , y ) , x ∈ I = ( a , b ) y ( x 0 ) = y 0 \left.\left\{\begin{array}{l}y^{\prime}(x)=f(x,y),\quad x\in I=(a,b)\\y\left(x_0\right)=y_0\end{array}\right.\right. {y′(x)=f(x,y),x∈I=(a,b)y(x0)=y0
拉格朗日中值定理
y ( x n + 1 ) − y ( x n ) h = y ′ ( x + θ h ) \frac{y\left(x_{n+1}\right)-y\left(x_{n}\right)}h=y^{\prime}(x+\theta h) hy(xn+1)−y(xn)=y′(x+θh)
欧拉法:本质一阶泰勒,线性近似求导
y ( x i + Δ x ) = y ( x i ) + y ′ ( x i ) Δ x + y ′ ′ ( x i ) 2 ! Δ x 2 + ⋯ + y ( n ) ( x i ) n ! Δ x n + O ( Δ x n + 1 ) y\left(x_i+\Delta x\right)=y\left(x_i\right)+y^{\prime}\left(x_i\right)\Delta x+\frac{y^{\prime\prime}\left(x_i\right)}{2!}\Delta x^2+\cdots+\frac{y^{\left(n\right)}\left(x_i\right)}{n!}\Delta x^n+O\left(\Delta x^{n+1}\right) y(xi+Δx)=y(xi)+y′(xi)Δx+2!y′′(xi)Δx2+⋯+n!y(n)(xi)Δxn+O(Δxn+1)
y ( x i + Δ x ) − y ( x i ) Δ x + O ( Δ x ) = f ( x i , y ( x i ) ) \frac{y\left(x_{i}+\Delta x\right)-y\left(x_{i}\right)}{\Delta x}+O(\Delta x)=f\left(x_{i},y\left(x_{i}\right)\right) Δxy(xi+Δx)−y(xi)+O(Δx)=f(xi,y(xi))
{ y i + 1 = y i + ℏ f ( x i , y i ) , i = 0 , 1 , ⋯ n − 1 y 0 = y ( x 0 ) \left.\left\{\begin{array}{l}y_{i+1}=y_i+\hbar f\left(x_i,y_i\right),\quad i=0,1,\cdots n-1\\y_0=y\left(x_0\right)\end{array}\right.\right. {yi+1=yi+ℏf(xi,yi),i=0,1,⋯n−1y0=y(x0)
四阶龙格库塔法
{ y n + 1 = y n + h 6 ( k 1 + 2 k 2 + 2 k 3 + k 4 ) k 1 = f ( x n , y n ) k 2 = f ( x n + h 2 , y n + h 2 k 1 ) k 3 = f ( x n + ℏ 2 , y n + ℏ 2 k 2 ) k 4 = f ( x n + h , y n + h k 3 ) \left.\left\{\begin{array}{l}y_{n+1}=y_n+\frac h6\left(k_1+2\boldsymbol{k}_2+2k_3+k_4\right)\\k_1=f\left(x_n,y_n\right)\\k_2=f\left(x_n+\frac h2,y_n+\frac h2k_1\right)\\k_3=f\left(x_n+\frac\hbar2,y_n+\frac\hbar2\boldsymbol{k}_2\right)\\\boldsymbol{k}_4=\boldsymbol{f}\left(\boldsymbol{x}_n+\boldsymbol{h},\boldsymbol{y}_n+\boldsymbol{h}\boldsymbol{k}_3\right)\end{array}\right.\right. ⎩ ⎨ ⎧yn+1=yn+6h(k1+2k2+2k3+k4)k1=f(xn,yn)k2=f(xn+2h,yn+2hk1)k3=f(xn+2ℏ,yn+2ℏk2)k4=f(xn+h,yn+hk3)
3 IMU状态预测
预测是对状态估计量state进行迭代预测,而不是误差状态向量Error State(用来更新),但协方差是根据误差状态的运动模型进行更新。
每一帧的IMU
观测数据,需要对 X I X_I XI中的姿态 G I q T _G^Iq^T GIqT、速度 G v I T ^Gv_I^T GvIT和位置 G p I T ^Gp_I^T GpIT进行预测,偏差 b a , b g b_a,b_g ba,bg保持不变。
b g ( t + Δ t ) = b g ( t ) , b a ( t + Δ t ) = b a ( t ) , g ( t + Δ t ) = g ( t ) . \begin{aligned}\boldsymbol b_g(t+\Delta t)&=\boldsymbol{b}_g(t),\\\boldsymbol{b}_a(t+\Delta t)&=\boldsymbol{b}_a(t),\\\boldsymbol{g}(t+\Delta t)&=\boldsymbol{g}(t).\end{aligned} bg(t+Δt)ba(t+Δt)g(t+Δt)=bg(t),=ba(t),=g(t).
这里相直接给出了离散时间下的IMU偏差的运动学方程,没有给出从连续时间到离散的推导(实际上因为偏置的导数是一个高斯过程,其均值是0,所以离散条件下,偏置保持不变)。
3.1 连续时间下IMU状态运动学方程(微分方程)
这部分参考论文A Multi-State Constraint Kalman Filterfor Vision-aided Inertial Navigation
之3.1节
① 状态(理想值)
注意下面式子描述了IMU状态真值的运动学变化,包括了均值和协方差
G I q ˉ ˙ ( t ) = 1 2 Ω ( ω ( t ) ) G I q ˉ ( t ) , b ˙ g ( t ) = n w g ( t ) v ˙ I ( t ) = G a ( t ) , b ˙ a ( t ) = n w a ( t ) , p ˙ I ( t ) = G v I ( t ) \begin{aligned} {^{I}_{G}\dot{\bar{q}}(t)}&=\frac{1}{2}\boldsymbol{\Omega}\big(\boldsymbol{\omega}(t)\big)_{G}^{I}\bar{q}(t),&\dot{\mathbf{b}}_{g}(t)&=\mathbf{n}_{wg}(t)\\\dot{\mathbf{v}}_{I}(t)&={}^{G}\mathbf{a}(t),&\dot{\mathbf{b}}_{a}(t)&=\mathbf{n}_{wa}(t),&\dot{\mathbf{p}}_{I}(t)&={}^{G}\mathbf{v}_{I}(t)\end{aligned} GIqˉ˙(t)v˙I(t)=21Ω(ω(t))GIqˉ(t),=Ga(t),b˙g(t)b˙a(t)=nwg(t)=nwa(t),p˙I(t)=GvI(t)
其中矩阵 Ω ( ω ) {\Omega}(\boldsymbol{\omega}) Ω(ω)
Ω ( ω ) = [ − ⌊ ω × ⌋ ω − ω T 0 ] , ⌊ ω × ⌋ = [ 0 − ω z ω y ω z 0 − ω x − ω y ω x 0 ] \boldsymbol{\Omega}(\boldsymbol{\omega})=\begin{bmatrix}-\lfloor\boldsymbol{\omega}\times\rfloor&\boldsymbol{\omega}\\-\boldsymbol{\omega}^T&0\end{bmatrix},\quad\lfloor\boldsymbol{\omega}\times\rfloor=\begin{bmatrix}0&-\omega_z&\omega_y\\\omega_z&0&-\omega_x\\-\omega_y&\omega_x&0\end{bmatrix} Ω(ω)=[−⌊ω×⌋−ωTω0],⌊ω×⌋= 0ωz−ωy−ωz0ωxωy−ωx0
角速度 ω m {\omega}_m ωm和加速度 a m {a}_m am的测量值:
ω m = ω + C ( G I q ˉ ) ω G + b g + n g a m = C ( G I q ˉ ) ( G a − G g + 2 ⌊ ω G × ⌋ G v I + ⌊ ω G × ⌋ 2 p I ) + b a + n a \begin{aligned}&\mathbf{\omega}_m=\mathbf{\omega}+\mathbf{C}(_G^I\bar{q})\mathbf{\omega}_G+\mathbf{b}_g+\mathbf{n}_g\\&\mathbf{a}_m=\mathbf{C}(_G^I\bar{q})(^G\mathbf{a}-^G\mathbf{g}+2\lfloor\omega_G\times\rfloor^G\mathbf{v}_I+\lfloor\omega_G\times\rfloor^2\mathbf{p}_I)+\mathbf{b}_a+\mathbf{n}_a\end{aligned} ωm=ω+C(GIqˉ)ωG+bg+ngam=C(GIqˉ)(Ga−Gg+2⌊ωG×⌋GvI+⌊ωG×⌋2pI)+ba+na
上面 ω G \mathbf{\omega}_G ωG论文中指the IMU measurements incorporate the effects of the planet’s rotation
受到行星自转的影响,但是大部分实现中都没有考虑这个!
一般来说,如果把IMU放在车体中央,可以省略其它元素对加速度干扰,即加速度 a m {a}_m am可以表示为下式
a m = C ( G I q ˉ ) ( G a − G g ) + b a + n a \begin{aligned}&\mathbf{a}_m=\mathbf{C}(_G^I\bar{q})(^G\mathbf{a}-^G\mathbf{g})+\mathbf{b}_a+\mathbf{n}_a\end{aligned} am=C(GIqˉ)(Ga−Gg)+ba+na
② 状态(测量值)
对上面公式取均值之后,就可以得到IMU状态测量值运动学公式,注意高斯过程和高斯噪声的均值皆为0,所以下面偏置导数和噪声均值皆可置零。下面 C q ^ = C ( G I q ⃗ ^ ) , a ^ = a m − b ^ a a n d ω ^ = ω m − b ^ g − C q ^ ω G . \mathbf{C}_{\hat{q}}=\mathbf{C}(_{G}^{I}\hat{\vec{q}}),\mathbf{\hat{a}}=\mathbf{a}_{m}-\hat{\mathbf{b}}_{a}\mathrm{and}\boldsymbol{\hat{\omega}}=\boldsymbol{\omega}_{m}-\hat{\mathbf{b}}_{g}-\mathbf{C}_{\hat{q}}\boldsymbol{\omega}_{G}. Cq^=C(GIq^),a^=am−b^aandω^=ωm−b^g−Cq^ωG.
G I q ˉ ^ ˙ = 1 2 Ω ( ω ^ ) G I q ˉ ^ , b ^ g = 0 3 × 1 , G v ^ ˙ I = C q ^ T a ^ − 2 ⌊ ω G × ⌋ G v ^ I − ⌊ ω G × ⌋ 2 G p ^ I + G g b ^ ˙ a = 0 3 × 1 , G p ^ ˙ I = G v ^ I \begin{gathered} {}_{G}^{I}\dot{\hat{\bar{q}}}=\frac{1}{2}\boldsymbol{\Omega}(\hat{\boldsymbol{\omega}})_{G}^{I}\hat{\bar{q}},\quad\hat{\mathbf{b}}_{g}=\mathbf{0}_{3\times1}, \\ {}^{G}\dot{\hat{\mathbf{v}}}_{I}=\mathbf{C}_{\hat{q}}^{T}\hat{\mathbf{a}}-2\lfloor\boldsymbol{\omega}_{G}\times\rfloor{}^{G}\hat{\mathbf{v}}_{I}-\lfloor\boldsymbol{\omega}_{G}\times\rfloor{}^{2G}\hat{\mathbf{p}}_{I}+{}^{G}\mathbf{g} \\ \dot{\hat{\mathbf{b}}}_{a}=\mathbf{0}_{3\times1},\quad G\dot{\hat{\mathbf{p}}}_{I}=G\hat{\mathbf{v}}_{I} \end{gathered} GIqˉ^˙=21Ω(ω^)GIqˉ^,b^g=03×1,Gv^˙I=Cq^Ta^−2⌊ωG×⌋Gv^I−⌊ωG×⌋2Gp^I+Ggb^˙a=03×1,Gp^˙I=Gv^I
代码实现并没有考虑行星自转以及加速度相关影响,本质上就是最简单的IMU运动模型,对应论文Robust Stereo Visual Inertial Odometry for Fast Autonomous Flight
公式(1)
3.2 离散时间下IMU状态运动学方程(差分方程)
从连续到离散,不论是对于状态方程,还是误差状态方程,都很简单(比如状态方程中,如果只是使用欧拉法去进行积分,那么速度平移等公式就像是高中物理一般)
这个过程也是卡尔曼滤波的第一步:预测均值(Propagation Equations)!
3.2.1 预测姿态 G I q T _G^Iq^T GIqT
论文Indirect Kalman Filter for 3D Attitude Estimation
1.6节给出了具体推导,0阶和1阶的区别就是在于在单位时间内角速度是否变化。0阶不变,一直是 ω ( t k ) {\omega}(t_k) ω(tk),1阶用两个时间点取了均值
ω ˉ = ω ( t k + 1 ) + ω ( t k ) 2 \bar{\boldsymbol{\omega}}=\frac{\boldsymbol{\omega}(t_{k+1})+\boldsymbol{\omega}(t_k)}2 ωˉ=2ω(tk+1)+ω(tk)
MSCKF
中使用的是**0
阶积分(假设角速度在单位时间内恒定不变)**,其中 ω ^ = ω m − b ^ g \hat{\omega}=\omega_m-\hat{b}_g ω^=ωm−b^g
∣ ω ^ ∣ > 1 0 − 5 时: G I q ^ ( t + Δ t ) = ( cos ( ∣ ω ^ ∣ 2 Δ t ) ⋅ I 4 × 4 + 1 ∣ ω ^ ∣ sin ( ∣ ω ^ ∣ 2 Δ t ) ⋅ Ω ( ω ^ ) ) G I q ^ ( t ) ∣ ω ^ ∣ ≤ 1 0 − 5 时: G I q ^ ( t + Δ t ) = ( I 4 × 4 − Δ t 2 Ω ( ω ^ ) ) G I q ^ ( t ) \begin{aligned}&|\hat{\omega}|>10^{-5}\text{ 时: }^I_G\hat{q}(t+\Delta t)=\left(\cos\left(\frac{|\hat{\omega}|}2\Delta t\right)\cdot I_{4\times4}+\frac1{|\hat{\omega}|}\sin\left(\frac{|\hat{\omega}|}2\Delta t\right)\cdot\Omega(\hat{\omega})\right) {^I_G\hat{q}}(t)\\&|\hat{\omega}|\leq10^{-5}\text{ 时: }^I_G\hat{q}(t+\Delta t)=\left(I_{4\times4}-\frac{\Delta t}2\Omega(\hat{\omega})\right){^I_G\hat{q}(t)}\end{aligned} ∣ω^∣>10−5 时: GIq^(t+Δt)=(cos(2∣ω^∣Δt)⋅I4×4+∣ω^∣1sin(2∣ω^∣Δt)⋅Ω(ω^))GIq^(t)∣ω^∣≤10−5 时: GIq^(t+Δt)=(I4×4−2ΔtΩ(ω^))GIq^(t)
姿态 G I q T _G^Iq^T GIqT的预测利用了角速度!其中 ω ^ = ω m − b ^ g \hat{\omega}=\omega_m-\hat{b}_g ω^=ωm−b^g。下标m表示测量值,测量值减去一个偏差表示理想值。(这里和高博新书表示略有不同,一般都是 ω m = ω ^ + b ^ g {\omega}_m=\hat\omega+\hat{b}_g ωm=ω^+b^g,即测量 = 理想值 + 偏差)。
3.2.2 预测速度 G v I T ^Gv_I^T GvIT和位置 G p I T ^Gp_I^T GpIT
要注意的是,一个点在不同坐标系下的速度矢量并不相同,不是一个矢量在不同坐标系中的表达(参考高博新书)。我们一般说的速度,都是指机器人本身在世界系下的速度,其相对于自身坐标系,速度一直都是0。
注意这里的速度和位置都是在世界系下的矢量,加速度是在IMU系下的量,所以要变换到世界系下,还有 g = ( 0 , 0 , − 9.8 ) g = (0,0,-9.8) g=(0,0,−9.8)。下标m值测量值。
p ^ ˙ ( t ) = v ^ ( t ) v ^ ˙ ( t ) = q ^ ( t ) a ^ + g a ^ = a m − b ^ a \begin{gathered}\dot{\hat{\mathrm{p}}}(\mathrm{t})=\hat{\mathrm{v}}(\mathrm{t})\\\dot{\hat{\mathrm{v}}}(\mathrm{t})=\hat{\mathrm{q}}(\mathrm{t})\hat{a}+\mathrm{g}\\\hat{a}=a_m-\hat{b}_a\end{gathered} p^˙(t)=v^(t)v^˙(t)=q^(t)a^+ga^=am−b^a
姿态的预测采用了比较简单的欧拉法,即认为角速度在单位时间内恒定不变。对于速度和位置的预测,采用了更加平滑的龙格库塔法!
v ^ ( t + Δ t ) = v ^ ( t ) + Δ t 6 ( k v 1 + 2 k v 2 + 2 k v 3 + k v 4 ) k v 1 = R ^ ( t ) a ^ + g k v 2 = R ^ ( t + Δ t / 2 ) a ^ + g k v 3 = R ^ ( t + Δ t / 2 ) a ^ + g k v 4 = R ^ ( t + Δ t ) a ^ + g p ^ ( t + Δ t ) = p ^ ( t ) + Δ t 6 ( k p 1 + 2 k p 2 + 2 k p 3 + k p 4 ) k p 1 = v ^ ( t ) k p 2 = v ^ ( t ) + k v 1 Δ t / 2 k p 3 = v ^ ( t ) + k v 2 Δ t / 2 k p 4 = v ^ ( t ) + k v 3 Δ t \begin{aligned} &\hat{v}(t+\Delta t)=\hat{v}(t)+\frac{\Delta t}6\left(k_{v_1}+2k_{v_2}+2k_{v_3}+k_{v_4}\right) \\ &k_{v_1}=\hat{R}(t)\hat{a}+g \\ &k_{v_2}=\hat{R}(t+\Delta t/2)\hat{a}+g \\ &k_{v_3}=\hat{R}(t+\Delta t/2)\hat{a}+g \\ &k_{v_4}=\hat{R}(t+\Delta t)\hat{a}+g \\ &\hat{p}(t+\Delta t)=\hat{p}(t)+\frac{\Delta t}6\left(k_{p_1}+2k_{p_2}+2k_{p_3}+k_{p_4}\right) \\ &k_{p_1}=\hat{v}(t) \\ &k_{p_2}=\hat{v}(t)+k_{v_1}\Delta t/2 \\ &k_{p_3}=\hat{v}(t)+k_{v_2}\Delta t/2 \\ &k_{p_4}=\hat{v}(t)+k_{v_3}\Delta t \end{aligned} v^(t+Δt)=v^(t)+6Δt(kv1+2kv2+2kv3+kv4)kv1=R^(t)a^+gkv2=R^(t+Δt/2)a^+gkv3=R^(t+Δt/2)a^+gkv4=R^(t+Δt)a^+gp^(t+Δt)=p^(t)+6Δt(kp1+2kp2+2kp3+kp4)kp1=v^(t)kp2=v^(t)+kv1Δt/2kp3=v^(t)+kv2Δt/2kp4=v^(t)+kv3Δt
速度 G v I T ^Gv_I^T GvIT和位置 G p I T ^Gp_I^T GpIT的预测利用了加速度!
4 IMU误差状态预测
IMU
更新时用龙格库塔法得到了新的IMU
状态,
我们现在还要递推什么?递推IMU
误差协方差矩阵。实际更新的算法使用了ESKF
,维护的是误差状态,因此要推出新一时刻的误差状态协方差与上⼀时刻误差状态协方差及传感器误差协方差的关系。
下面结论参考论文A Multi-State Constraint Kalman Filter for Vision-aided Inertial Navigation
。
误差怎么表示?
理想数值 = 估计数值 + 误差
4.1 连续时间下 误差状态
4.1.1 推导过程
① 旋转
四元数的推导比较麻烦,参考Indirect Kalman Filter for 3D Attitude Estimation 2.4节 Continuous Time Error State Equations
② 速度
区分清楚估计值就是利用测量值估计的一个数
③ 平移
平移的导数即速度
G δ p ˙ I = G δ v I ^G\delta\mathbf{\dot p}_I = ^G\delta\mathbf{v}_I Gδp˙I=GδvI
④ 偏置
IMU噪声模型中说的很清楚了,偏差的导数是高斯过程(0均值)。
δ b ˙ = n w \delta\dot{\mathbf{b}}=\mathbf{n_w} δb˙=nw
4.1.2 结论
写成矩阵形式
δ x ˙ = F c ⋅ δ x + G c ⋅ n \dot{\delta\mathbf{x}}=\mathbf{F}_c\cdot\delta\mathbf{x}+\mathbf{G}_c\cdot\mathbf{n} δx˙=Fc⋅δx+Gc⋅n
变量:
δ x = ( G I δ θ ⊤ δ b g ⊤ G δ v I ⊤ δ b a ⊤ G δ p I ⊤ C I δ θ ⊤ I δ p C ⊤ ) ⊤ \left.\delta\mathbf{x}=\left(\begin{array}{cccccc}^I_G\delta\boldsymbol{\theta}^\top&\delta\mathbf{b}_g^\top&^G\delta\mathbf{v}_I^\top&\delta\mathbf{b}_a^\top&^G\delta\mathbf{p}_I^\top&{}^I_C\delta\boldsymbol{\theta}^\top&{}^I\delta\mathbf{p}_C^\top\end{array}\right.\right)^\top δx=(GIδθ⊤δbg⊤GδvI⊤δba⊤GδpI⊤CIδθ⊤IδpC⊤)⊤
n = ( n g n w g n a n w a ) ⊤ \left.\mathbf{n}=\left(\begin{array}{ccc}\mathbf{n_g}&\mathbf{n_{wg}}&\mathbf{n_a}&\mathbf{n_{wa}}\end{array}\right.\right)^\top n=(ngnwgnanwa)⊤
矩阵F注意点:
① 速度:即第三行,忽略了相关因素影响,3.1中①中描述了
② 外参:相机与IMU的转换,这个是不变的,所以第6、7行都是0
③ 这里只是5个变量,S-MSCKF论文以及代码中都还有外参两个自变量,所以F实际是21*21矩阵。7个变量,每个都是3×3
④ 参见
Robust Stereo Visual Inertial Odometry for Fast Autonomous Flight
公式(2)
F = ( − ⌊ ω ^ × ⌋ − I 3 0 3 × 3 0 3 × 3 0 3 × 3 0 3 × 3 0 3 × 3 0 3 × 3 0 3 × 3 0 3 × 3 − C ( C I q ^ ) ⊤ ⌊ a ^ × ⌋ 0 3 × 3 0 3 × 3 − C ( G I q ^ ) ⊤ 0 3 × 3 0 3 × 3 0 3 × 3 0 3 × 3 0 3 × 3 0 3 × 3 0 3 × 3 0 3 × 3 I 3 0 3 × 3 0 3 × 3 0 3 × 3 0 3 × 3 0 3 × 3 0 3 × 3 0 3 × 3 0 3 × 3 0 3 × 3 0 3 × 3 0 3 × 3 0 3 × 3 ) \mathbf{F}=\begin{pmatrix}-\lfloor\hat{\boldsymbol{\omega}}_{\times}\rfloor&-\mathbf{I}_{3}&\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}\\\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}\\-C\left( ^{I}_{C}\hat{\mathbf{q}}\right)^\top\left\lfloor\hat{\mathbf{a}}_{\times}\right\rfloor&\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}&-C\left( ^{I}_{G}{\hat{\mathbf{q}}}\right)^\top&\mathbf{0}_{3\times3}\\\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}\\\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}&\mathbf{I}_{3}&\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}\\\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}\\\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3} \end{pmatrix} F= −⌊ω^×⌋03×3−C(CIq^)⊤⌊a^×⌋03×303×303×303×3−I303×303×303×303×303×303×303×303×303×303×3I303×303×303×303×3−C(GIq^)⊤03×303×303×303×303×303×303×303×303×303×303×3
G = ( − I 3 0 3 × 3 0 3 × 3 0 3 × 3 0 3 × 3 I 3 0 3 × 3 0 3 × 3 0 3 × 3 0 3 × 3 − C ( G I q ^ ) ⊤ 0 3 × 3 0 3 × 3 0 3 × 3 0 3 × 3 0 3 × 3 0 3 × 3 0 3 × 3 0 3 × 3 I 3 0 3 × 3 0 3 × 3 0 3 × 3 0 3 × 3 0 3 × 3 0 3 × 3 0 3 × 3 0 3 × 3 ) \left.\mathbf{G}=\left(\begin{array}{cccc}-\mathbf{I}_3&\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}\\\mathbf{0}_{3\times3}&\mathbf{I}_3&\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}\\\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}&-C\left(^{I}_{G}\hat{\mathbf{q}}\right)^\top&\mathbf{0}_{3\times3}\\\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}\\\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}&\mathbf{I}_3\\\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}\\\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}\end{array}\right.\right) G= −I303×303×303×303×303×303×303×3I303×303×303×303×303×303×303×3−C(GIq^)⊤03×303×303×303×303×303×303×303×3I303×303×3
补充:关于速度,考虑对于加速度a的各种影响,则F是下式,这里省略了6、7行的0矩阵,矩阵G是相同的。
A Multi-State Constraint Kalman Filterfor Vision-aided Inertial Navigation
公式(10)
F = [ − ⌊ ω ^ × ⌋ − I 3 0 3 × 3 0 3 × 3 0 3 × 3 0 3 × 3 0 3 × 3 0 3 × 3 0 3 × 3 0 3 × 3 − C q ^ T ⌊ a ^ × ⌋ 0 3 × 3 − 2 ⌊ ω G × ⌋ − C q ^ T − ⌊ ω G × ⌋ 2 0 3 × 3 0 3 × 3 0 3 × 3 0 3 × 3 0 3 × 3 0 3 × 3 0 3 × 3 I 3 0 3 × 3 0 3 × 3 ] \left.\mathbf{F}=\left[\begin{array}{ccccc}-\lfloor\hat{\boldsymbol{\omega}}\times\rfloor&-\mathbf{I}_3&\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}\\\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}\\-\mathbf{C}_{\hat{q}}^T\lfloor\hat{\mathbf{a}}\times\rfloor&\mathbf{0}_{3\times3}&-2\lfloor\omega_G\times\rfloor&-\mathbf{C}_{\hat{q}}^T&-\lfloor\omega_G\times\rfloor^2\\\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}\\\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}&\mathbf{I}_3&\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}\end{array}\right.\right] F= −⌊ω^×⌋03×3−Cq^T⌊a^×⌋03×303×3−I303×303×303×303×303×303×3−2⌊ωG×⌋03×3I303×303×3−Cq^T03×303×303×303×3−⌊ωG×⌋203×303×3
注意:我们并不会直接使用F和G去预测等等,而是在求解离散时间下协方差时利用。
4.2 离散时间下误差状态
参考Indirect Kalman Filter for 3D Attitude Estimation 2.5节 Discrete Time Error State Equations
对一个线性系统做离散化,是由固定的通解的(见线性系统理论笔记),如下
δ x ( t + Δ t ) = Φ ( t + Δ t , t ) δ x t + ∫ t t + Δ t Φ ( t + Δ t , τ ) G c ( τ ) n ( τ ) d τ \delta\mathbf{x}(t+\Delta t)=\boldsymbol{\Phi}\left(t+\Delta t,t\right)\delta\mathbf{x}_t+\int_t^{t+\Delta t}\boldsymbol{\Phi}(t+\Delta t,\tau)\mathbf{G}_\mathbf{c}(\tau)\mathbf{n}(\tau)d\tau δx(t+Δt)=Φ(t+Δt,t)δxt+∫tt+ΔtΦ(t+Δt,τ)Gc(τ)n(τ)dτ
把一个连续系统离散化,在线性系统理论中讲过,系统矩阵 F F F变为了 状态转移矩阵$ \Phi(t+\Delta t,t)= exp(Ft)$
Φ ( t + Δ t , t ) = exp ( F c Δ t ) = I 6 × 6 + F c Δ t + 1 2 ! F c 2 Δ t 2 + … \begin{aligned} \Phi(t+\Delta t,t)& =\exp\left(\mathbf{F}_{c}\Delta t\right) \\ &=\mathbf{I}_{6\times6}+\mathbf{F}_{c}\Delta t+\frac{1}{2!}\mathbf{F}_{c}^{2}\Delta t^{2}+\ldots \end{aligned} Φ(t+Δt,t)=exp(FcΔt)=I6×6+FcΔt+2!1Fc2Δt2+…
其中幂指数(对应代码):
F c = [ − ⌊ ω ^ × ⌋ − I 3 × 3 0 3 × 3 0 3 × 3 ] , F c 2 = [ ⌊ ω ^ × ⌋ 2 ⌊ ω ^ × ⌋ 0 3 × 3 0 3 × 3 ] F c 3 = [ − ⌊ ω ^ × ⌋ 3 − ⌊ ω ^ × ⌋ 2 0 3 × 3 0 3 × 3 ] , F c 4 = [ ⌊ ω ^ × ⌋ 4 ⌊ ω ^ × ⌋ 3 0 3 × 3 0 3 × 3 ] \begin{aligned}&\mathbf{F}_c=\begin{bmatrix}-\lfloor\hat{\boldsymbol{\omega}}\times\rfloor&-\mathbf{I}_{3\times3}\\\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}\end{bmatrix}\quad,\quad\mathbf{F}_c^2=\begin{bmatrix}\lfloor\hat{\boldsymbol{\omega}}\times\rfloor^2&\lfloor\hat{\boldsymbol{\omega}}\times\rfloor\\\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}\end{bmatrix}\\&\mathbf{F}_c^3=\begin{bmatrix}-\lfloor\hat{\boldsymbol{\omega}}\times\rfloor^3&-\lfloor\hat{\boldsymbol{\omega}}\times\rfloor^2\\\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}\end{bmatrix}\quad,\quad\mathbf{F}_c^4=\begin{bmatrix}\lfloor\hat{\boldsymbol{\omega}}\times\rfloor^4&\lfloor\hat{\boldsymbol{\omega}}\times\rfloor^3\\\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}\end{bmatrix}\end{aligned} Fc=[−⌊ω^×⌋03×3−I3×303×3],Fc2=[⌊ω^×⌋203×3⌊ω^×⌋03×3]Fc3=[−⌊ω^×⌋303×3−⌊ω^×⌋203×3],Fc4=[⌊ω^×⌋403×3⌊ω^×⌋303×3]
代入通解,可得到:
δ x t + Δ t = ( I 6 × 6 + F c Δ t + 1 2 ! F c 2 Δ t 2 + … ) δ x t + ∫ t t + Δ t Φ ( t + Δ t , τ ) G c ( τ ) n ( τ ) d τ \delta\mathbf{x}_{t+\Delta t}=(\mathbf{I}_{6\times6}+\mathbf{F}_c\Delta t+\frac1{2!}\mathbf{F}_c^2\Delta t^2+\ldots)\delta\mathbf{x}_t+\int_t^{t+\Delta t}\mathbf{\Phi}(t+\Delta t,\tau)\mathbf{G}_\mathbf{c}(\tau)\mathbf{n}(\tau)d\tau δxt+Δt=(I6×6+FcΔt+2!1Fc2Δt2+…)δxt+∫tt+ΔtΦ(t+Δt,τ)Gc(τ)n(τ)dτ
4.2.1 均值
在MSCKF
中,误差状态的均值实际上没有被使用,所以相关的论文里面也没有给出均值的推导,不过,把连续变为离散是一件较为容易的事情,参考状态,类似于下面形式(高博新书给出的,但具体肯定是有所差别的,看是否利用高阶的积分来推导,如龙格库塔法 )
δ p ( t + Δ t ) = δ p + δ v Δ t , δ υ ( t + Δ t ) = δ v + ( − R ( a ~ − b a ) ∧ δ θ − R δ b a + δ g ) Δ t − η v , δ θ ( t + Δ t ) = E x p ( − ( ω ~ − b g ) Δ t ) δ θ − δ b g Δ t − η θ , δ b g ( t + Δ t ) = δ b g + η b g , δ b a ( t + Δ t ) = δ b a + η b a , \begin{aligned} \delta\boldsymbol{p}(t+\Delta t)& =\delta\boldsymbol{p}+\delta\boldsymbol{v}\Delta t, \\ \delta\boldsymbol{\upsilon}(t+\Delta t)& =\delta\boldsymbol{v}+(-\boldsymbol{R}(\tilde{\boldsymbol{a}}-\boldsymbol{b}_a)^{\wedge}\delta\boldsymbol{\theta}-\boldsymbol{R}\delta\boldsymbol{b}_a+\delta\boldsymbol{g})\Delta t-\boldsymbol{\eta}_v, \\ \delta\boldsymbol{\theta}(t+\Delta t)& =\mathrm{Exp}\left(-(\tilde{\boldsymbol{\omega}}-\boldsymbol{b}_g)\Delta t\right)\delta\boldsymbol{\theta}-\delta\boldsymbol{b}_g\Delta t-\boldsymbol{\eta}_\theta, \\ \delta\boldsymbol{b}_{g}(t+\Delta t)& =\delta\boldsymbol{b}_g+\boldsymbol{\eta}_{bg}, \\ \begin{aligned}\delta\boldsymbol{b}_{a}(t+\Delta t)\end{aligned}& =\delta\boldsymbol{b}_{a}+\boldsymbol{\eta}_{ba}, \end{aligned} δp(t+Δt)δυ(t+Δt)δθ(t+Δt)δbg(t+Δt)δba(t+Δt)=δp+δvΔt,=δv+(−R(a~−ba)∧δθ−Rδba+δg)Δt−ηv,=Exp(−(ω~−bg)Δt)δθ−δbgΔt−ηθ,=δbg+ηbg,=δba+ηba,
4.2.2 协方差矩阵
写在前面,其实这里的状态转移矩阵会经过可观测性约束进行一定的修改!.
实际上是对离散化后的方程分两步计算,一个是前面状态转移矩阵线性协方差计算,再加上后面高斯噪声的协方差。(两个都符合高斯分布,所以协方差计算也符合)。-----这里也说明,虽然我们不用连续时间下的误差状态,但是会利用这个F
和G
矩阵,这也是为什么前面会求解。
P k + 1 ∣ k = Φ k P k ∣ k Φ k T + Q d , k Φ k = Φ ( t k + 1 , t k ) = exp ( ∫ t k t k + 1 F ( τ ) d τ ) Q d , k = ∫ t k t k + 1 Φ ( t k + 1 , τ ) G c ( τ ) Q c G c T ( τ ) Φ T ( t k + 1 , τ ) d τ \begin{gathered}\mathbf{P}_{k+1|k}=\Phi_k\mathbf{P}_{k|k}\Phi_k^T+\mathbf{Q}_{d,k} \\\Phi_k=\Phi(t_{k+1},t_k)=\exp\left(\int_{t_k}^{t_{k+1}}\mathbf{F}(\tau)d\tau\right)\\ \mathbf{Q}_{d,k}=\int_{t_k}^{t_{k+1}}\boldsymbol{\Phi}\left(t_{k+1},\tau\right)\mathbf{G}_c(\tau)\mathbf{Q}_c\mathbf{G}_c^\mathrm{T}(\tau)\boldsymbol{\Phi}^\mathrm{T}\left(t_{k+1},\tau\right)\mathrm{d}\tau\end{gathered}\\ Pk+1∣k=ΦkPk∣kΦkT+Qd,kΦk=Φ(tk+1,tk)=exp(∫tktk+1F(τ)dτ)Qd,k=∫tktk+1Φ(tk+1,τ)Gc(τ)QcGcT(τ)ΦT(tk+1,τ)dτ
Q c Q_c Qc是噪声带来的协方差。噪声是⾼斯白噪声,且不同时刻是独立的(所以每个变量至只与自身相关,与其它无关,也就是协方差矩阵非对角线元素全是0),因此连续时间系统噪声协方差矩阵由
Q c = E [ n ( t + τ ) n T ( t ) ] = [ N r 0 3 × 3 0 3 × 3 0 3 × 3 0 3 × 3 N w r 0 3 × 3 0 3 × 3 0 3 × 3 0 3 × 3 N a 0 3 × 3 0 3 × 3 0 3 × 3 0 3 × 3 N w a ] = [ σ r c 2 ⋅ I 3 × 3 0 3 × 3 0 3 × 3 0 3 × 3 0 3 × 3 σ w c 2 ⋅ I 3 × 3 0 3 × 3 0 3 × 3 0 3 × 3 0 3 × 3 σ a c 2 ⋅ I 3 × 3 0 3 × 3 0 3 × 3 0 3 × 3 0 3 × 3 σ w a c 2 ⋅ I 3 × 3 ] \begin{gathered} \mathbf{Q}_c \left.=E\left[\mathbf{n}(t+\tau)\mathbf{n}^\mathrm{T}(t)\right]=\left[\begin{array}{cccc}\mathbf{N}_\mathrm{r}&\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}\\\mathbf{0}_{3\times3}&\mathbf{N}_\mathrm{wr}&\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}\\\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}&\mathbf{N}_\mathrm{a}&\mathbf{0}_{3\times3}\\\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}&\mathbf{N}_\mathrm{wa}\end{array}\right.\right]= \\ \left.\left[\begin{array}{cccc}\sigma_{r_c}^2\cdot\mathbf{I}_{3\times3}&\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}\\\mathbf{0}_{3\times3}&\sigma_{w_c}^2\cdot\mathbf{I}_{3\times3}&\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}\\\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}&\sigma_{a_c}^2\cdot\mathbf{I}_{3\times3}&\mathbf{0}_{3\times3}\\\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}&\sigma_{w_{ac}}^2\cdot\mathbf{I}_{3\times3}\end{array}\right.\right] \end{gathered} Qc=E[n(t+τ)nT(t)]= Nr03×303×303×303×3Nwr03×303×303×303×3Na03×303×303×303×3Nwa = σrc2⋅I3×303×303×303×303×3σwc2⋅I3×303×303×303×303×3σac2⋅I3×303×303×303×303×3σwac2⋅I3×3
- 实际上的协方差矩阵还有相机的影响
当下一个 IMU,即第 k+1 个 IMU 来到后,此时 k+1 时刻的整体协方差矩阵可写为
P k + 1 ∣ k = ( P I I k + 1 ∣ k Φ k P I C k ∣ k P I C k ∣ k ⊤ Φ k ⊤ P C C k ∣ k ) \left.\mathbf{P}_{k+1|k}=\left(\begin{matrix}\mathbf{P}_{II_{k+1|k}}&\mathbf{\Phi}_{k}\mathbf{P}_{IC_{k|k}}\\\mathbf{P}_{IC_{k|k}}^\top\mathbf{\Phi}_{k}^\top&\mathbf{P}_{CC_{k|k}}\end{matrix}\right.\right) Pk+1∣k=(PIIk+1∣kPICk∣k⊤Φk⊤ΦkPICk∣kPCCk∣k)
递推阶段关于相机的加持都是0,也就是这个阶段关于相机状态部分是“不动”。但是公共部分是需要改变的,因为IMU部分变了
P k + 1 ∣ k = ( P I I k + 1 ∣ k Φ k P I C k ∣ k P I C k ∣ k ⊤ Φ k ⊤ P C C k ∣ k ) \left.\mathbf{P}_{k+1|k}=\left(\begin{matrix}\mathbf{P}_{II_{k+1|k}}&\mathbf{\Phi}_{k}\mathbf{P}_{IC_{k|k}}\\\mathbf{P}_{IC_{k|k}}^{\top}\mathbf{\Phi}_{k}^{\top}&\mathbf{P}_{CC_{k|k}}\end{matrix}\right.\right) Pk+1∣k=(PIIk+1∣kPICk∣k⊤Φk⊤ΦkPICk∣kPCCk∣k)
4.3 状态增广
4.3.1 什么是状态增广?
其次,搞明白什么是状态增广
状态增广:cam
新来了⼀帧,状态跟协方差矩阵会有哪些变化
在没有图像进来时,对IMU状态进行预测,并计算系统误差状态协方差矩阵;在有图像进来时,根据相机与IMU的相对外参计算当前相机的位姿。然后将最新的相机状态加入到系统状态向量中去,然后扩增误差状态协方差矩阵。
① 利用最新imu状态和外参计算当前相机位姿
G C q ^ = I C q ^ ⊗ G I q ^ , G p ^ C = G p ^ C + C ( G I q ^ ) ⊤ I p ^ C \left._G^C\hat{\mathbf{q}}={}_I^C\hat{\mathbf{q}}\otimes{}_G^I\hat{\mathbf{q}},\quad{}^G\hat{\mathbf{p}}_C={}^G\hat{\mathbf{p}}_C+C\left(\begin{matrix}^I_G\hat{\mathbf{q}}\end{matrix}\right.\right)^\top{}^I\hat{\mathbf{p}}_C GCq^=ICq^⊗GIq^,Gp^C=Gp^C+C(GIq^)⊤Ip^C
② 相机位姿分别对imu
状态和外参的雅可比,扩展误差状态协方差
P ( 21 + 6 ( N + 1 ) ) × ( 21 + 6 ( N + 1 ) ) = [ I 21 + 6 N J 6 × ( 21 + 6 N ) ] P ( 21 + 6 N ) × ( 21 + 6 N ) [ I 21 + 6 N J 6 × ( 21 + 6 N ) ] T = [ P P J T J P J P J T ] \begin{gathered} P^{(21+6(N+1))\times(21+6(N+1))} \left.=\left[\begin{array}{c}I_{21+6N}\\J_{6\times(21+6N)}\end{array}\right.\right]P^{(21+6N)\times(21+6N)}\left[\begin{array}{c}I_{21+6N}\\J_{6\times(21+6N)}\end{array}\right]^T \\ \left.=\left[\begin{array}{cc}P&PJ^T\\JP&JPJ^T\end{array}\right.\right] \end{gathered} P(21+6(N+1))×(21+6(N+1))=[I21+6NJ6×(21+6N)]P(21+6N)×(21+6N)[I21+6NJ6×(21+6N)]T=[PJPPJTJPJT]
<1> 雅可比推导
关于雅可比,维度6*(21+6N)
,6N
是指对之前的外参的雅可比,全为0.行维表示 R c w R_{cw} Rcw和 t w c t_{wc} twc分别对 x ~ I = ( G I θ ~ ⊤ b ~ g ⊤ G v ~ I ⊤ b ~ a ⊤ G p ~ I ⊤ I θ ~ C ⊤ I p ~ C ⊤ ) ⊤ \tilde{\mathbf{x}}_{I}=\begin{pmatrix}^I_{G}\tilde{\boldsymbol{\theta}}^{\top}&&\tilde{\mathbf{b}}_{g}^{\top}&&^{G}\tilde{\mathbf{v}}_{I}^{\top}&&\tilde{\mathbf{b}}_{a}^{\top}&&^{G}\tilde{\mathbf{p}}_{I}^{\top}&&^{I}\tilde{\boldsymbol{\theta}}_{C}^{\top}&^{I}\tilde{\mathbf{p}}_{C}^{\top}\end{pmatrix}^{\top} x~I=(GIθ~⊤b~g⊤Gv~I⊤b~a⊤Gp~I⊤Iθ~C⊤Ip~C⊤)⊤的雅可比,故此共21列。可以分为两部分,如下公式所示
J = ( J I 0 6 × 6 N ) \mathbf{J}=\begin{pmatrix}\mathbf{J}_I&\mathbf{0}_{6\times6N}\end{pmatrix} J=(JI06×6N)
原论文给出的公式如下,但是和代码对不上?
J I = ( C ( I G q ^ ) 0 3 × 9 0 3 × 3 I 3 0 3 × 3 − C ( I G q ^ ) ⊤ ⌊ I p ^ C × ⌋ 0 3 × 9 I 3 0 3 × 3 I 3 ) \mathbf{J}_I=\begin{pmatrix}C\left(\frac{I}{G}\hat{\mathbf{q}}\right)&\mathbf{0}_{3\times9}&\mathbf{0}_{3\times3}&\mathbf{I}_{3}&\mathbf{0}_{3\times3}\\-C\left(\frac{I}{G}\hat{\mathbf{q}}\right)^\top\lfloor{}^{I}\hat{\mathbf{p}}_{C\times}\rfloor&\mathbf{0}_{3\times9}&\mathbf{I}_{3}&\mathbf{0}_{3\times3}&\mathbf{I}_{3}\end{pmatrix} JI=(C(GIq^)−C(GIq^)⊤⌊Ip^C×⌋03×903×903×3I3I303×303×3I3)
代码中应该是下面这样的
J = [ R c b 0 0 0 0 I 0 ( R w b t b c ) ∧ 0 0 0 I 0 R w b ] \left.J=\left[\begin{array}{cccccccc}R_{cb}&\mathbf{0}&\mathbf{0}&\mathbf{0}&\mathbf{0}&\mathbf{I}&\mathbf{0}\\(R_{wb}t_{bc})^{\wedge}&\mathbf{0}&\mathbf{0}&\mathbf{0}&\mathbf{I}&\mathbf{0}&R_{wb}\end{array}\right.\right] J=[Rcb(Rwbtbc)∧0000000II00Rwb]
下面求下具体的雅可比
<2> 扩展误差状态协方差
直接把雅可比乘进去就好
4.3.2 为什么要状态增广
IMU Propagation
只改变IMU状态向量和其对应的协方差,与相机无关;而Measurement Updata
的观测模型是残差相对于相机状态的观测模型,与IMU状态没有直接关联。状态扩增就相当于相机和IMU状态之间的桥梁,通过关联协方差 P I C P_{IC} PIC描述相机和IMU状态之间的关系,每一个相机状态都与IMU状态形成关联,这样在观测更新相机状态的同时,会间接更新IMU状态。
5 状态更新
5.1 理论分析
理想数值 = 估计数值(预测的状态) + 误差 (误差状态协方差矩阵)。
预测过程包括对名义状态的预测(IMU 积分)以及对误差状态的预测
δ x p r e d = F δ x , P p r e d = F P F ⊤ + Q . \begin{aligned}\delta x_{\mathrm{pred}}&=F\delta x,\\P_{\mathrm{pred}}&=FPF^\top+Q.\end{aligned} δxpredPpred=Fδx,=FPF⊤+Q.
考虑更新过程。假设一个抽象的传感器能够对状态变量产生观测,其观测方程为抽象的 h
,那么可以写为
z = h ( x ) + v , v ∼ N ( 0 , V ) , z=h(x)+v,v\sim\mathcal{N}(0,V), z=h(x)+v,v∼N(0,V),
在 ESKF
中,我们当前拥有名义状态 x
的估计以及误差状态 δx
的估计,且希望更新的是误差状态,因此要计算投影误差相对于误差状态的雅可比矩阵
H = ∂ h ∂ δ x ∣ x p r e d = ∂ δ z ∂ z ^ ∂ z ^ ∂ x ^ ∂ x ^ ∂ δ x = ∂ z ^ ∂ x ^ ∂ x ^ ∂ δ x = ∂ z ^ ∂ x ^ H=\left.\frac{\partial h}{\partial\delta\boldsymbol{x}}\right|_{x_{\mathrm{pred}}} \\ =\frac{\partial\delta\mathbf{z}}{\partial\hat{\mathbf{z}}}\mathrm{~\frac{\partial\hat{\mathbf{z}}}{\partial\hat{\mathbf{x}}}~\frac{\partial\hat{\mathbf{x}}}{\partial\delta x}} \\ =\mathrm{~\frac{\partial\hat{\mathbf{z}}}{\partial\hat{\mathbf{x}}}~\frac{\partial\hat{\mathbf{x}}}{\partial\delta x}}\\ =\mathrm{~\frac{\partial\hat{\mathbf{z}}}{\partial\hat{\mathbf{x}}}} H=∂δx∂h xpred=∂z^∂δz ∂x^∂z^ ∂δx∂x^= ∂x^∂z^ ∂δx∂x^= ∂x^∂z^
δ z = z − z ^ \delta\mathbf{z}=\mathbf{z}-\hat{\mathbf{z}} δz=z−z^, δ z \delta\mathbf{z} δz对z求导就是单位阵(观测都是正常加减法,不存在旋转矩阵那种乘法),同理, δ x = x − x ^ \delta\mathbf{x}=\mathbf{x}-\hat{\mathbf{x}} δx=x−x^在处理旋转矩阵这种状态量是扰动乘法以外,求导也是单位阵!出于严谨,可以得到(对应状态p、v、R、b_g、b_a、g)
∂ x ∂ δ x = diag ( I 3 , I 3 , ∂ Log ( R ( Exp ( δ θ ) ) ) ∂ δ θ , I 3 , I 3 , I 3 ) . \begin{aligned}\frac{\partial x}{\partial\delta x}=\operatorname{diag}(I_3,I_3,\frac{\partial\operatorname{Log}(\boldsymbol{R}(\operatorname{Exp}(\delta\boldsymbol{\theta})))}{\partial\delta\boldsymbol{\theta}},I_3,I_3,I_3).\end{aligned} ∂δx∂x=diag(I3,I3,∂δθ∂Log(R(Exp(δθ))),I3,I3,I3).
相当于连乘旋转矩阵,需要用BCH近似计算,实际不应该直接作为单位阵,还有一点,这里如果是JPL
四元数,那么应该是左扰动,与下面有区别。
∂ L o g ( R ( E x p ( δ θ ) ) ) ∂ δ θ = J r − 1 ( R ) . \frac{\partial\mathrm{Log}(\boldsymbol{R}(\mathrm{Exp}(\delta\boldsymbol{\theta})))}{\partial\delta\boldsymbol{\theta}}=\boldsymbol{J}_r^{-1}(\boldsymbol{R}). ∂δθ∂Log(R(Exp(δθ)))=Jr−1(R).
代码中貌似认为是小量,直接作为单位阵,即 H = ∂ z ^ ∂ x ^ H = \mathrm{~\frac{\partial\hat{\mathbf{z}}}{\partial\hat{\mathbf{x}}}} H= ∂x^∂z^
再计算卡尔曼增益,进而计算误差状态的更新过程
K = P pred H ⊤ ( H P pred H ⊤ + V ) − 1 , δ x = K ( z − h ( x p r e d ) ) , x = x p r e d + δ x , P = ( I − K H ) P p r e d . \begin{aligned} &\boldsymbol{K}&& =P_\text{pred}H^\top(HP_\text{pred}H^\top+V)^{-1}, \\ &\delta x&& =K(z-h(\boldsymbol{x_\mathrm{pred}})), \\ &\boldsymbol{x}&& =x_{\mathrm{pred}}+\delta\boldsymbol{x}, \\ &\text{P}&& =(\boldsymbol{I}-\boldsymbol{K}\boldsymbol{H})\boldsymbol{P}_{\mathrm{pred}}. \end{aligned} KδxxP=PpredH⊤(HPpredH⊤+V)−1,=K(z−h(xpred)),=xpred+δx,=(I−KH)Ppred.
说白了,ESKF就是预测的时候对状态和误差状态都预测了,但实际上只用了状态的预测值,对于误差状态,主要是利用了协方差和更新后的误差Δx。在更新这一块没有使用原始状态对整个方程进行更新!针对不同的观测模型,就有不同的雅可比矩阵H!这个是最重要的!
5.2 视觉观测雅可比矩阵H推导
前面已经知道,H是计算投影误差相对于误差状态的雅可比矩阵
滑动窗口内状态——IMU状态、左相机状态(旋转、平移)
x ~ = ( x ~ I ⊤ x ~ C 1 ⊤ … x ~ C N ⊤ ) ⊤ \tilde{\mathbf{x}}=\begin{pmatrix}\tilde{\mathbf{x}}_I^\top&\tilde{\mathbf{x}}_{C_1}^\top&\dots&\tilde{\mathbf{x}}_{C_N}^\top\end{pmatrix}^\top x~=(x~I⊤x~C1⊤…x~CN⊤)⊤
MSCKF的很大的优势就是没有把特征点放到状态向量里面,降低了计算量。当特征点丢失的时候,才拿来进行更新。特征点丢失有两种情况:
- 一种是跟踪丢失,也就是当前帧跟踪不到的那些特征点;
- 另一种是边缘化的时候,也就是把最后一帧滑出窗口的时候,把在这一帧里面新建的特征点都丢弃,也就是都拿来做更新。
由于MSCKF更新使用的是不在跟踪上的点,所以这个点必然在IMU状态前⾯,因此关于IMU状态的雅可比就是0,我们只需要计算关于相机状态的雅可比!(注意上面讲的是当前帧追踪不到的点,并不意味着整个滑动窗口内的其它帧也追踪不到!)
单个路标点雅可比,论文公式(5)
r i j = z i j − z ^ i j = H C i j x ~ C i + H f i j G p ~ j + n i j \mathbf{r}_i^j=\mathbf{z}_i^j-\hat{\mathbf{z}}_i^j=\mathbf{H}_{C_i}^j\tilde{\mathbf{x}}_{C_i}+\mathbf{H}_{f_i}^j{}^G\tilde{\mathbf{p}}_j+\mathbf{n}_i^j rij=zij−z^ij=HCijx~Ci+HfijGp~j+nij
下面推导本质就是纯视觉雅可比计算,可参考十四讲
当一个路标点看不见时,雅可比矩阵,论文公式(5)
r i j = z i j − z ^ i j = H C i j x ~ C i + H f i j G p ~ j + n i j \mathbf{r}_i^j=\mathbf{z}_i^j-\hat{\mathbf{z}}_i^j=\mathbf{H}_{C_i}^j\tilde{\mathbf{x}}_{C_i}+\mathbf{H}_{f_i}^j{}^G\tilde{\mathbf{p}}_j+\mathbf{n}_i^j rij=zij−z^ij=HCijx~Ci+HfijGp~j+nij
如果是双目,观测会翻倍,但下面M指观测到路标点的次数
当最新帧有多个路标点看不见时,论文公式(这里没有了路标下标i)
r j = H x j x ~ + H f j G p ~ j + n j \mathbf{r}^{j}=\mathbf{H}_{\mathrm{x}}^{j}\tilde{\mathbf{x}}+\mathbf{H}_{f}^{jG}\tilde{\mathbf{p}}_{j}+\mathbf{n}^{j} rj=Hxjx~+HfjGp~j+nj
5.3 视觉观测雅可比的后续处理
5.3.1 左零空间投影
参考论文
A Multi-State Constraint Kalman Filterfor Vision-aided Inertial Navigation
公式(24)~(26)
对于 EKF
,残差线性化需要满足如下形式,即残差仅与一组状态向量的误差项成线性化关系 r ≅ H δ x + n r\cong H\delta x+n r≅Hδx+n,且噪声项为与状态向量无关的零均值的高斯分布
而 MSCKF
的的残差与两个状态向量的误差项相关,不满足上式的线性化形式,因此不能直接应用 EKF
的测量更新流程
为了解决这个问题,并让这对路标点的雅可比隐式地参与到计算,进行左零空间投影!(具体参考后面的零空间实现,实际也是利用QR分解)
r 0 ( 2 M − 3 M L ) × 1 = A T r 2 M × 1 ≅ A T H X 2 M × ( 15 + 6 N ) ⏟ H 0 X ~ ( 15 + 6 N ) × 1 + A T n 2 M × 1 ⏟ n 0 = H 0 ( 2 M − 3 ) × ( 15 + 6 N ) X ~ ( 15 + 6 N ) × 1 + n 0 ( 2 M − 3 ) × 1 \begin{aligned}r_0^{(2M-3M_L)\times1}&=\mathrm{A}^Tr^{2M\times1}\cong\underbrace{\mathrm{A}^TH_X^{2M\times(15+6N)}}_{H_0}\tilde{X}^{(15+6N)\times1}+\underbrace{\mathrm{A}^Tn^{2M\times1}}_{n_0}\\&={H_0}^{(2M-3)\times(15+6N)}\tilde{X}^{(15+6N)\times1}+{n_0}^{(2M-3)\times1}\end{aligned} r0(2M−3ML)×1=ATr2M×1≅H0 ATHX2M×(15+6N)X~(15+6N)×1+n0 ATn2M×1=H0(2M−3)×(15+6N)X~(15+6N)×1+n0(2M−3)×1
5.3.2 QR分解降低计算量
参考论文
A Multi-State Constraint Kalman Filterfor Vision-aided Inertial Navigation
公式(27)~(30)
投影完之后,我们就可以得到新的残差和相应的雅可比矩阵 H 0 H_{0} H0。但是 H 0 H_{0} H0矩阵通常维度很大,为了降低计算量,对 H 0 H_{0} H0进行QR
分解:
QR分解会得到一个正交矩阵和一个上三角矩阵!正交矩阵的转置和其本身的乘积是单位矩阵,且该矩阵的所有列向量彼此正交(内积为0)
H 0 ( 2 M − 3 ) × ( 15 + 6 N ) = [ Q 1 Q 2 ] [ T H 0 ] {H_0}^{(2M-3)\times(15+6N)}=[Q_1\quad Q_2]\begin{bmatrix}T_H\\0\end{bmatrix} H0(2M−3)×(15+6N)=[Q1Q2][TH0]
对上面新的残差左边乘以 [ Q 1 T Q 2 T ] \left.\left[\begin{array}{cc}\mathbf{Q}_1^T\\\mathbf{Q}_2^T\end{array}\right.\right] [Q1TQ2T],得到
[ Q 1 T r 0 Q 2 T r 0 ] = [ T H 0 ] X ~ + [ Q 1 T n 0 Q 2 T n 0 ] \begin{bmatrix}Q_1^Tr_0\\Q_2^Tr_0\end{bmatrix}=\begin{bmatrix}T_H\\0\end{bmatrix}\tilde{X}+\begin{bmatrix}Q_1^Tn_0\\Q_2^Tn_0\end{bmatrix} [Q1Tr0Q2Tr0]=[TH0]X~+[Q1Tn0Q2Tn0]
这个过程和左零空间投影很像,这里相当于取第一行对应的矩阵块,左零空间则是取第二行对应的矩阵块。总之,都是利用了QR分解!
5.4 更新
参考论文
A Multi-State Constraint Kalman Filterfor Vision-aided Inertial Navigation
公式(31)~(33)
6 左零空间投影
6.1 为什么要进行左零空间投影
要符合EKF的残差线性化形式
视觉slam中,得到重投影误差r
之后,做更新前需要计算重投影误差相对于位姿与三维点的雅可比,利用雅可比来更新位姿以及三维点。
有⼀种模式只优化位姿,那是认为三维点精度很高,没有误差,即使这样,点还是会在后端优化。所以重投影误差中是包含着三维点的误差信息的,msckf
的思想就是做不带三维点坐标的状态更新,但是并没有完全不考虑三维点的影响,这个思想是与边缘化⼀样,通过“移动”的手段。
在上面描述中出现了两个雅可比矩阵,⼀个是重投影误差相对于状态量的雅可比(位姿,速度,bias等⼀切参与重投影误差的量),它的行数等于误差维度,也就是2n个,n为点数,例如我们的双目msckf
就是4n
,因为⼀个点在左右目都有观测,列数等于状态量维度。重投影误差相对于三维点的雅可比同理。
现在为了将这部分不参与计算,并让这部分隐式地参与到计算,如何做?要注意这里并不能直接向上面⼀样把三维点固定死,因为三维点的误差是不能忽略的。
残差
r i j = z i j − z ^ i j = H C i j x ~ C i + H f i j p ~ j + n i j \mathbf{r}_{i}^{j}=\mathbf{z}_{i}^{j}-\hat{\mathbf{z}}_{i}^{j}=\mathbf{H}_{C_{i}}^{j}\tilde{\mathbf{x}}_{C_{i}}+\mathbf{H}_{f_{i}}^{j}\tilde{\mathbf{p}}_{j}+\mathbf{n}_{i}^{j} rij=zij−z^ij=HCijx~Ci+Hfijp~j+nij
我们找到关于对特征雅可比 H f i j {H}_{f_{i}}^{j} Hfij的左零空间 V V V,ensure the uncertainty of
p ~ j \tilde{\mathbf{p}}_{j} p~jdoes not affect the residual
,确保哪些只计算一次保持不变的三维点(误差很大)影响到残差的计算!
r o j = V ⊤ r j = V ⊤ H x j x ~ + V ⊤ n j = H x , o j x ~ + n o j \mathbf{r}_o^j=\mathbf{V}^\top\mathbf{r}^j=\mathbf{V}^\top\mathbf{H}_\mathbf{x}^j\tilde{\mathbf{x}}+\mathbf{V}^\top\mathbf{n}^j=\mathbf{H}_{\mathbf{x},o}^j\tilde{\mathbf{x}}+\mathbf{n}_o^j roj=V⊤rj=V⊤Hxjx~+V⊤nj=Hx,ojx~+noj
找到⼀个矩阵V乘在等式左右,将三维点的那项变成0矩阵,那么只需要更新状态即可,同时点也通过V矩阵融入到状态中,数学上讲通过A矩阵将前两项投影到了第三项的零空间上,概率上讲这种操作使得与三维点无关。
左零空间与零空间区别
- 零空间(Null Space):
- 零空间,也称为核(kernel),是一个线性变换(或矩阵)中所有映射到零向量的向量组成的空间。
- 对于矩阵 A,其零空间是 A x = 0 Ax=0 Ax=0所有解的向量组成的空间
- 左零空间(Left Null Space):
- 左零空间是一个矩阵的转置的零空间。
- 对于矩阵 A,其左零空间是 y T A = 0 y^TA=0 yTA=0所有解的向量组成的空间
零空间维度 + 矩阵A的秩 = 矩阵维度n
6.2 如何计算零空间矩阵V
对于上面两个雅可比,维度分别如下,4是因为双目,单目观测为2,所以双目是4.n
表示了当前观测z
被观测的帧数
H C i j = ( J 1 H 1 J 2 R ⊤ H 1 ) 4 n ∗ 6 , H f i j = ( J 1 H 2 J 2 R ⊤ H 2 ) 4 n ∗ 3 \left.\mathbf{H}_{C_i}^j=\left(\begin{array}{c}\mathbf{J}_1\mathbf{H}_1\\\mathbf{J}_2\mathbf{R}^\top\mathbf{H}_1\end{array}\right.\right)_{4n*6},\quad\mathbf{H}_{f_i}^j=\left(\begin{array}{c}\mathbf{J}_1\mathbf{H}_2\\\mathbf{J}_2\mathbf{R}^\top\mathbf{H}_2\end{array}\right)_{4n*3} HCij=(J1H1J2R⊤H1)4n∗6,Hfij=(J1H2J2R⊤H2)4n∗3
把这个雅可比通过QR分解分出两个矩阵,正交矩阵 Q 和一个上三角矩阵 R 的乘积,然后对两个矩阵分块处理,可以得到类似下图矩阵块:
因为Q是正交矩阵,所以Q2中任意一列乘以Q1中一列为0!所以Q2的转置实际上就是我们要找的左零空间矩阵(注意到一个正交矩阵Q乘以正交矩阵的转置就是单位阵!)
δ r = J x δ X + J p δ P δ r = J x δ X + [ Q 1 Q 2 ] [ R 1 0 ] δ P [ Q 1 T Q 2 T ] δ r = [ Q 1 T Q 2 T ] J x δ X + [ R 1 0 ] δ P \begin{gathered} \delta\mathbf{r}=\mathbf{J_x}\delta\mathbf{X}+\mathbf{J_p}\delta\mathbf{P} \\ \left.\delta\mathbf{r}=\mathbf{J}_\mathbf{x}\delta\mathbf{X}+\left[\begin{array}{ll}\mathbf{Q}_1&&\mathbf{Q}_2\end{array}\right.\right]\left[\begin{array}{ll}\mathbf{R}_1\\\mathbf{0}\end{array}\right]\delta\mathbf{P} \\ \left.\left[\begin{array}{l}\mathbf{Q_1}^T\\\mathbf{Q_2}^T\end{array}\right.\right]\delta\mathbf{r}=\left[\begin{array}{ll}\mathbf{Q_1}^T\\\mathbf{Q_2}^T\end{array}\right]\mathbf{J_x}\delta\mathbf{X}+\left[\begin{array}{ll}\mathbf{R_1}\\\mathbf{0}\end{array}\right]\delta\mathbf{P} \end{gathered} δr=JxδX+JpδPδr=JxδX+[Q1Q2][R10]δP[Q1TQ2T]δr=[Q1TQ2T]JxδX+[R10]δP
在说下为什么Q2
就是左零空间矩阵呢?看下面矩阵,实际上可以分为两行,如果单独拿出Q2
对应的哪一行,关于路标点的那一部分对应是0!