笔者最近在总结整个MSCKF的相关知识的时候,算是比较仔细的推导了与零空间相关的部分,放在之前笔者会认为这部分知识确实是比较难理解的部分,但是花了很多时间总结发现其实都还是有很强的相关性的,所以这里笔者算是总结一下这部分的内容,算是对近来知识的一个总结。
本文主要会涉及4种零空间的维护方法,分别是:
Notation:
- 在以下推导中,所有的旋转均使用JPL表示法;
- 在以下推导中,变量均选择为旋转,位置和速度,即 x = [ G ℓ q G p ℓ G v ℓ ] T \mathrm{x}=\begin{bmatrix}{}^{\ell}_{G}q & {}^{G}p_{\ell} & {}^{G}v_{\ell}\end{bmatrix}^{T} x=[GℓqGpℓGvℓ]T;
从前有两位年轻人都致力于EKF-Base(本文更多的是针对MSCKF方法)方法中能观性的分析,但是都遇到了很大的问题。于是两人约定一起到山上去请教一位德高望重的老师。
老师:你二人既然都是研究能观性的分析,那么一定知道能观性分析的评价标准是能观性矩阵吧?
O = [ H 0 H 1 Φ 0 ⋮ H t Φ t − 1 … Φ 0 ] (1) \mathcal{O}= \begin{bmatrix} \mathrm{H}_0 \\ \mathrm{H}_{1}\Phi_{0} \\ \vdots \\ \mathrm{H}_{t}\Phi_{t-1} \dots\Phi_{0} \end{bmatrix} \tag{1} O=⎣⎢⎢⎢⎡H0H1Φ0⋮HtΦt−1…Φ0⎦⎥⎥⎥⎤(1)
两位年轻人:自然是知道的,对于线性系统而言,系统的能观性主要由能观性矩阵反应。
老师:嗯,很好,既然如此,我就给二位一人三个锦囊,希望你二人能在各自的研究方向上都能悟道。
两位年轻人接过锦囊,开心的下山了。
第一位年轻人下山之后便回到了家,继续开始对于能观性的分析,他迫不及待的打开第一个锦囊,上面写着一行字和如下的公式:
{ G I t + 1 R = I t I t + 1 R G I t R G I t R = ( I − [ I t θ ~ ] × ) G I t R ^ { G v I t + 1 = G v I t + ( G I t R ) T ∫ t l t l + 1 ( I l I τ R ) T a m d τ + g Δ t G v I t = G v ^ I t + G v ~ I t G I t R = ( I − [ I t θ ~ ] × ) G I t R ^ { G p I t + 1 = G p I t + G v I t Δ t + ( G I t R ) T ∫ t l t l + 1 ∫ t l s ( I t I τ R ) T a m d τ d s + 1 2 g Δ t 2 G p I t = G p ^ I t + G p ~ I t G v I t = G v ^ I t + G v ~ I t G I t R = ( I − [ I t θ ~ ] × ) G I t R ^ (2) \begin{aligned} &\begin{cases} {}^{I_{t+1}}_{G}R&={}^{I_{t+1}}_{I_{t}}R \quad{}^{I_{t}}_{G}R \\ {}^{I_{t}}_{G}R&=(\mathbf{I}-\left[ {}^{I_{t}}\tilde{\theta} \right]_{\times}){}^{I_{t}}_{G}\hat{R} \end{cases}\\ &\begin{cases} {}^{G}v_{I_{t+1}} &= {}^{G}v_{I_t} + ({}^{I_{t}}_{G}R)^{T} \int_{t_{l}}^{t_{l+1}} ({}^{I_{\tau}}_{I_{l}}R)^{T} \mathbf{a_m} d \tau + g \Delta{t} \\ {}^{G}v_{I_{t}}&={}^{G}\hat{v}_{I_{t}}+{}^{G}\tilde{v}_{I_{t}} \\ {}^{I_{t}}_{G}R&=(\mathbf{I}-\left[ {}^{I_{t}}\tilde{\theta} \right]_{\times}){}^{I_{t}}_{G}\hat{R} \end{cases} \\ &\begin{cases} {}^{G}p_{I_{t+1}} &= {}^{G}p_{I_t} + {}^{G}v_{I_t}\Delta{t}+ ({}^{I_{t}}_{G}R)^{T} \int_{t_{l}}^{t_{l+1}} \int_{t_{l}}^{s} ({}^{I_{\tau}}_{I_{t}}R)^{T} \mathbf{a_m} d \tau d s + \frac{1}{2} g \Delta{t}^2 \\ {}^{G}p_{I_{t}}&={}^{G}\hat{p}_{I_{t}}+{}^{G}\tilde{p}_{I_{t}} \\ {}^{G}v_{I_{t}}&={}^{G}\hat{v}_{I_{t}}+{}^{G}\tilde{v}_{I_{t}} \\ {}^{I_{t}}_{G}R&=(\mathbf{I}-\left[ {}^{I_{t}}\tilde{\theta} \right]_{\times}){}^{I_{t}}_{G}\hat{R} \end{cases} \end{aligned} \tag{2} ⎩⎨⎧GIt+1RGItR=ItIt+1RGItR=(I−[Itθ~]×)GItR^⎩⎪⎪⎨⎪⎪⎧GvIt+1GvItGItR=GvIt+(GItR)T∫tltl+1(IlIτR)Tamdτ+gΔt=Gv^It+Gv~It=(I−[Itθ~]×)GItR^⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧GpIt+1GpItGvItGItR=GpIt+GvItΔt+(GItR)T∫tltl+1∫tls(ItIτR)Tamdτds+21gΔt2=Gp^It+Gp~It=Gv^It+Gv~It=(I−[Itθ~]×)GItR^(2)
年轻人反复看了多遍老师的建议,于是经过一段时日,年轻人终于按照提示推出了新的状态传递方程:
[ G I t + 1 θ ~ G p ~ I t + 1 G v ~ I t + 1 ] = [ I t I t + 1 R 0 0 − ⌊ y t ⌋ × ( G I t R ) T I I Δ t − ⌊ s t ⌋ × ( G I t R ) T 0 I ] [ G I t θ ~ G p ~ I t G v ~ I t ] + [ I t I t + 1 θ ~ ( G I t R ) T [ y ~ l ] ( G I t R ) T [ s ~ l ] ] (3) \begin{bmatrix} {}^{I_{t+1}}_{G}\tilde{\theta} \\ {}^{G}\tilde{p}_{I_{t+1}} \\ {}^{G}\tilde{v}_{I_{t+1}} \end{bmatrix} = \begin{bmatrix} {}^{I_{t+1}}_{I_{t}}R & \mathbf{0} & \mathbf{0} \\ -\lfloor{\mathrm{y}}_{t}\rfloor_{\times}({}^{I_t}_{G}R)^{T} & \mathbf{I} & \mathbf{I}\Delta{t} \\ -\lfloor{\mathrm{s}}_{t}\rfloor_{\times}({}^{I_t}_{G}R)^{T} & \mathbf{0} & \mathbf{I} \end{bmatrix} \begin{bmatrix} {}^{I_{t}}_{G}\tilde{\theta} \\ {}^{G}\tilde{p}_{I_{t}} \\ {}^{G}\tilde{v}_{I_{t}} \end{bmatrix} + \begin{bmatrix} {}^{I_{t+1}}_{I_{t}}\tilde{\theta} \\ ({}^{I_t}_{G}R)^{T}\left[\tilde{\mathrm{y}}_{l}\right] \\ ({}^{I_t}_{G}R)^{T}\left[\tilde{\mathrm{s}}_{l}\right] \end{bmatrix} \tag{3} ⎣⎡GIt+1θ~Gp~It+1Gv~It+1⎦⎤=⎣⎡ItIt+1R−⌊yt⌋×(GItR)T−⌊st⌋×(GItR)T0I00IΔtI⎦⎤⎣⎡GItθ~Gp~ItGv~It⎦⎤+⎣⎡ItIt+1θ~(GItR)T[y~l](GItR)T[s~l]⎦⎤(3)
其中
年轻人觉得很开心,觉得新的状态传递方程一定可以帮助他解开心中的迷惑。但是研究良久,年轻人还是一无所获,于是他又拿出第二个锦囊,想看看老师又给了他怎样的启示,只见上面写道:
年轻人很聪明,他马上把注意力集中在理想情况下的过程,首先他写出了理想情况下的观测矩阵:
H ( I l ∣ l ) = J ( f j ∣ l ) I C R G I l R [ [ G p f j − G p I i ] × ( G I l R ) T ⏟ ∂ e / ∂ θ − I 3 × 3 ⏟ ∂ e / ∂ p 0 3 × 3 ⏟ ∂ e / ∂ v ] H ( f j ∣ l ) = J ( f j ∣ l ) I C R G I l R (4) \begin{aligned} H_{(I_l|l)}&=J_{(f_j|l)} \quad {}^{C}_{I}R \quad {}_{G}^{I_l}R\begin{bmatrix} \underbrace{\left[{}^{G}\mathrm{p}_{f_j}-{}^{G}\mathrm{p}_{I_i}\right]_{\times}({}_{G}^{I_l}R)^{T}}_{ {\partial e}/{\partial \theta}} & \underbrace{ -\mathbf{I}_{3\times3}}_{ {\partial e}/{\partial \mathrm{p}}} & \underbrace{ \mathbf{0}_{3\times3}}_{ {\partial e}/{\partial \mathrm{v}}}\end{bmatrix} \\ H_{(f_j|l)}&=J_{(f_j|l)} \quad {}^{C}_{I}R \quad {}_{G}^{I_l}R \end{aligned} \tag{4} H(Il∣l)H(fj∣l)=J(fj∣l)ICRGIlR[∂e/∂θ [Gpfj−GpIi]×(GIlR)T∂e/∂p −I3×3∂e/∂v 03×3]=J(fj∣l)ICRGIlR(4)
将公式(4)中的两部分和在一起可得:
H f j ∣ t = J ( f j ∣ t ) I C R G I t R [ ⌊ G p f j − G p I i ⌋ × ( G I l R ) T − I 3 × 3 0 3 × 3 I 3 × 3 ] (5) \mathbf{H}_{f_j|t}=J_{(f_j|t)} \quad {}^{C}_{I}R \quad {}_{G}^{I_t}R \begin{bmatrix}\begin{array}{ccc|c} \lfloor{}^{G}\mathrm{p}_{f_j}-{}^{G}\mathrm{p}_{I_i}\rfloor_{\times}({}_{G}^{I_l}R)^{T} & -\mathbf{I}_{3\times3} & \mathbf{0}_{3\times3} & \mathbf{I}_{3\times3} \end{array}\end{bmatrix} \tag{5} Hfj∣t=J(fj∣t)ICRGItR[⌊Gpfj−GpIi⌋×(GIlR)T−I3×303×3I3×3](5)
于是年轻人按照老师的建议,取出其中一行进行推导,如下:
O t = H t Φ ( t , t − 1 ) … Φ ( t 1 , t 0 ) (6) \mathcal{O}_{t}=\mathbf{H}_t\Phi(t,t-1)\dots\Phi(t_1,t_0) \tag{6} Ot=HtΦ(t,t−1)…Φ(t1,t0)(6)
将公式(3)和公式(5)带入到公式(6)中可得:
O t ∣ 3 × 3 = [ ⌊ G p f j − G p I t ⌋ × ( G I l R ) T − I 3 × 3 0 3 × 3 ] [ G I t R ( G I t − 1 R ) T 0 0 − ⌊ y t − 1 ⌋ × ( G I t − 1 R ) T I I Δ t − ⌊ s t − 1 ⌋ × ( G I t − 1 R ) T 0 I ] [ G I t − 1 R ( G I t − 2 R ) T 0 0 − ⌊ y t − 2 ⌋ × ( G I t − 2 R ) T I I Δ t − ⌊ s t − 2 ⌋ × ( G I t − 2 R ) T 0 I ] … [ G I t 1 R ( I G I t 0 R ) T 0 0 − ⌊ y t 0 ⌋ × ( G I t 0 R ) T I I Δ t − ⌊ s t 0 ⌋ × ( G I t 0 R ) T 0 I ] (7) \mathcal{O}_{t|3\times3}= \begin{bmatrix} \lfloor{}^{G}\mathrm{p}_{f_j}-{}^{G}\mathrm{p}_{I_t}\rfloor_{\times}({}_{G}^{I_l}R)^{T} & -\mathbf{I}_{3\times3} & \mathbf{0}_{3\times3} \end{bmatrix} \begin{bmatrix} {}^{I_{t}}_{G}R({}^{I_{t-1}}_{G}R)^{T} & \mathbf{0} & \mathbf{0} \\ -\lfloor{\mathrm{y}}_{t-1}\rfloor_{\times}({}^{I_{t-1}}_{G}R)^{T} & \mathbf{I} & \mathbf{I}\Delta{t} \\ -\lfloor{\mathrm{s}}_{t-1}\rfloor_{\times}({}^{I_{t-1}}_{G}R)^{T} & \mathbf{0} & \mathbf{I} \end{bmatrix} \\ \begin{bmatrix} {}^{I_{t-1}}_{G}R({}^{I_{t-2}}_{G}R)^{T} & \mathbf{0} & \mathbf{0} \\ -\lfloor{\mathrm{y}}_{t-2}\rfloor_{\times}({}^{I_{t-2}}_{G}R)^{T} & \mathbf{I} & \mathbf{I}\Delta{t} \\ -\lfloor{\mathrm{s}}_{t-2}\rfloor_{\times}({}^{I_{t-2}}_{G}R)^{T} & \mathbf{0} & \mathbf{I} \end{bmatrix} \dots \begin{bmatrix} {}^{I_{t_1}}_{G}R({}^{I_{t_0}}_{I_{G}}R)^{T} & \mathbf{0} & \mathbf{0} \\ -\lfloor{\mathrm{y}}_{t_0}\rfloor_{\times}({}^{I_{t_0}}_{G}R)^{T} & \mathbf{I} & \mathbf{I}\Delta{t} \\ -\lfloor{\mathrm{s}}_{t_0}\rfloor_{\times}({}^{I_{t_0}}_{G}R)^{T} & \mathbf{0} & \mathbf{I} \end{bmatrix} \tag{7} Ot∣3×3=[⌊Gpfj−GpIt⌋×(GIlR)T−I3×303×3]⎣⎡GItR(GIt−1R)T−⌊yt−1⌋×(GIt−1R)T−⌊st−1⌋×(GIt−1R)T0I00IΔtI⎦⎤⎣⎡GIt−1R(GIt−2R)T−⌊yt−2⌋×(GIt−2R)T−⌊st−2⌋×(GIt−2R)T0I00IΔtI⎦⎤…⎣⎢⎡GIt1R(IGIt0R)T−⌊yt0⌋×(GIt0R)T−⌊st0⌋×(GIt0R)T0I00IΔtI⎦⎥⎤(7)
公式(7)中因为该部分仅涉及到IMU状态部分的分析,因此省去了观测的部分,同时省去了观测矩阵前面的公共部分。
在推导过程中,年轻人发现按照这样乘法下去,在每一次乘法之后都能得到一个很相似的形式,以前面两次乘积为例可以得到:
[ ⌊ G p f j − G p I t ⌋ × ( G I l R ) T − I 3 × 3 0 3 × 3 ] [ G I t R ( G I t − 1 R ) T 0 0 − ⌊ y t − 1 ⌋ × ( G I t − 1 R ) T I I Δ t t − 1 − ⌊ s t − 1 ⌋ × ( G I t − 1 R ) T 0 I ] [ G I t − 1 R ( G I t − 2 R ) T 0 0 − ⌊ y t − 2 ⌋ × ( G I t − 2 R ) T I I Δ t t − 1 − ⌊ s t − 2 ⌋ × ( G I t − 2 R ) T 0 I ] = [ ⌊ G p f j − G p I t − y t − 1 − s t − 1 Δ t ⌋ × ( G I t − 1 R ) T − I − I Δ t t − 1 ] T [ G I t − 1 R ( G I t − 2 R ) T 0 0 − ⌊ y t − 2 ⌋ × ( G I t − 2 R ) T I I Δ t t − 2 − ⌊ s t − 2 ⌋ × ( G I t − 2 R ) T 0 I ] = [ ⌊ G p f j − G p I t − 1 − G v t − 1 Δ t t − 1 − 1 2 g Δ t t − 1 2 ⌋ × ( G I t − 1 R ) T − I − I Δ t t − 1 ] T [ G I t − 1 R ( G I t − 2 R ) T 0 0 − ⌊ y t − 2 ⌋ × ( G I t − 2 R ) T I I Δ t t − 2 − ⌊ s t − 2 ⌋ × ( G I t − 2 R ) T 0 I ] = [ ⌊ G p f j − G p I t − 2 − G v t − 2 Δ t t − 2 t − 1 − 1 2 g ( Δ t t − 2 t − 1 ) 2 ⌋ × ( G I t − 2 R ) T − I − I Δ t t − 2 t − 1 ] T (8) \begin{aligned} &\begin{bmatrix} \lfloor{}^{G}\mathrm{p}_{f_j}-{}^{G}\mathrm{p}_{I_t}\rfloor_{\times}({}_{G}^{I_l}R)^{T} & -\mathbf{I}_{3\times3} & \mathbf{0}_{3\times3} \end{bmatrix} \begin{bmatrix} {}^{I_{t}}_{G}R({}^{I_{t-1}}_{G}R)^{T} & \mathbf{0} & \mathbf{0} \\ -\lfloor{\mathrm{y}}_{t-1}\rfloor_{\times}({}^{I_{t-1}}_{G}R)^{T} & \mathbf{I} & \mathbf{I}\Delta{t}_{t-1} \\ -\lfloor{\mathrm{s}}_{t-1}\rfloor_{\times}({}^{I_{t-1}}_{G}R)^{T} & \mathbf{0} & \mathbf{I} \end{bmatrix} \begin{bmatrix} {}^{I_{t-1}}_{G}R({}^{I_{t-2}}_{G}R)^{T} & \mathbf{0} & \mathbf{0} \\ -\lfloor{\mathrm{y}}_{t-2}\rfloor_{\times}({}^{I_{t-2}}_{G}R)^{T} & \mathbf{I} & \mathbf{I}\Delta{t}_{t-1} \\ -\lfloor{\mathrm{s}}_{t-2}\rfloor_{\times}({}^{I_{t-2}}_{G}R)^{T} & \mathbf{0} & \mathbf{I} \end{bmatrix} \\ &= \begin{bmatrix} \lfloor {}^{G}\mathrm{p}_{f_j}-{}^{G}\mathrm{p}_{I_t}-\mathrm{y}_{t-1}-\mathrm{s}_{t-1}\Delta{t} \rfloor_{\times}({}^{I_{t-1}}_{G}R)^{T} \\ -\mathbf{I} \\ -\mathbf{I}\Delta{t}_{t-1} \end{bmatrix}^{T}\begin{bmatrix} {}^{I_{t-1}}_{G}R({}^{I_{t-2}}_{G}R)^{T} & \mathbf{0} & \mathbf{0} \\ -\lfloor{\mathrm{y}}_{t-2}\rfloor_{\times}({}^{I_{t-2}}_{G}R)^{T} & \mathbf{I} & \mathbf{I}\Delta{t}_{t-2} \\ -\lfloor{\mathrm{s}}_{t-2}\rfloor_{\times}({}^{I_{t-2}}_{G}R)^{T} & \mathbf{0} & \mathbf{I} \end{bmatrix} \\ &= \begin{bmatrix} \lfloor {}^{G}\mathrm{p}_{f_j}-{}^{G}\mathrm{p}_{I_{t-1}}-{}^{G}\mathrm{v}_{t-1}\Delta{t}_{t-1}-\frac{1}{2}g\Delta{t}_{t-1}^{2} \rfloor_{\times}({}^{I_{t-1}}_{G}R)^{T} \\ -\mathbf{I} \\ -\mathbf{I}\Delta{t}_{t-1} \end{bmatrix}^{T} \begin{bmatrix} {}^{I_{t-1}}_{G}R({}^{I_{t-2}}_{G}R)^{T} & \mathbf{0} & \mathbf{0} \\ -\lfloor{\mathrm{y}}_{t-2}\rfloor_{\times}({}^{I_{t-2}}_{G}R)^{T} & \mathbf{I} & \mathbf{I}\Delta{t}_{t-2} \\ -\lfloor{\mathrm{s}}_{t-2}\rfloor_{\times}({}^{I_{t-2}}_{G}R)^{T} & \mathbf{0} & \mathbf{I} \end{bmatrix} \\ &= \begin{bmatrix} \lfloor {}^{G}\mathrm{p}_{f_j}-{}^{G}\mathrm{p}_{I_{t-2}}-{}^{G}\mathrm{v}_{t-2}\Delta{t}^{t-1}_{t-2}-\frac{1}{2}g(\Delta{t}^{t-1}_{t-2})^{2} \rfloor_{\times}({}^{I_{t-2}}_{G}R)^{T} \\ -\mathbf{I} \\ -\mathbf{I}\Delta{t}^{t-1}_{t-2} \end{bmatrix}^{T} \end{aligned} \tag{8} [⌊Gpfj−GpIt⌋×(GIlR)T−I3×303×3]⎣⎡GItR(GIt−1R)T−⌊yt−1⌋×(GIt−1R)T−⌊st−1⌋×(GIt−1R)T0I00IΔtt−1I⎦⎤⎣⎡GIt−1R(GIt−2R)T−⌊yt−2⌋×(GIt−2R)T−⌊st−2⌋×(GIt−2R)T0I00IΔtt−1I⎦⎤=⎣⎡⌊Gpfj−GpIt−yt−1−st−1Δt⌋×(GIt−1R)T−I−IΔtt−1⎦⎤T⎣⎡GIt−1R(GIt−2R)T−⌊yt−2⌋×(GIt−2R)T−⌊st−2⌋×(GIt−2R)T0I00IΔtt−2I⎦⎤=⎣⎡⌊Gpfj−GpIt−1−Gvt−1Δtt−1−21gΔtt−12⌋×(GIt−1R)T−I−IΔtt−1⎦⎤T⎣⎡GIt−1R(GIt−2R)T−⌊yt−2⌋×(GIt−2R)T−⌊st−2⌋×(GIt−2R)T0I00IΔtt−2I⎦⎤=⎣⎡⌊Gpfj−GpIt−2−Gvt−2Δtt−2t−1−21g(Δtt−2t−1)2⌋×(GIt−2R)T−I−IΔtt−2t−1⎦⎤T(8)
年轻人很快便总结出了规律,于是在 t0 时刻,整个乘积变作(这里把特征部分的元素给添加回来了):
O t = [ ⌊ G p f j − G p I t 0 − G v t 0 Δ t t 0 t − 1 − 1 2 g ( Δ t t 0 t − 1 ) 2 ⌋ × ( G I t 0 R ) T − I − I Δ t t 0 t − 1 I ] T (9) \mathcal{O}_{t}=\begin{bmatrix} \lfloor {}^{G}\mathrm{p}_{f_j}-{}^{G}\mathrm{p}_{I_{t_0}}-{}^{G}\mathrm{v}_{t_0}\Delta{t}^{t-1}_{t_0}-\frac{1}{2}g(\Delta{t}^{t-1}_{t_0})^{2} \rfloor_{\times}({}^{I_{t_0}}_{G}R)^{T} \\ -\mathbf{I} \\ -\mathbf{I}\Delta{t}^{t-1}_{t_0} \\ \hline \mathbf{I} \end{bmatrix}^{T} \tag{9} Ot=⎣⎢⎢⎡⌊Gpfj−GpIt0−Gvt0Δtt0t−1−21g(Δtt0t−1)2⌋×(GIt0R)T−I−IΔtt0t−1I⎦⎥⎥⎤T(9)
所以对应的零空间其实就是:
N t = [ 0 3 G I t 0 R g I 3 − [ G p t 0 ] × g 0 3 − [ G v t 0 ] × g I 3 − [ G p f j ] × g ] (10) \mathbf{N}_{t}= \begin{bmatrix} \mathbf{0}_{3} & {}^{I_{t_0}}_{G}\mathbf{R} \mathbf{g} \\ \mathbf{I}_{3} & -\left[^{G} \mathbf{p}_{t_0}\right]_\times{\mathbf{g}} \\ \mathbf{0}_{3} & -\left[^{G} \mathbf{v}_{t_0}\right]_\times{\mathbf{g}} \\ \hline \mathbf{I}_{3} & -\left[^{G} \mathbf{p}_{f_j}\right]_\times{\mathbf{g}} \\ \end{bmatrix} \tag{10} Nt=⎣⎢⎢⎢⎡03I303I3GIt0Rg−[Gpt0]×g−[Gvt0]×g−[Gpfj]×g⎦⎥⎥⎥⎤(10)
除此之外,年轻人也在推导过程中总结出了一个很重要的规律:之所以乘积最后能满足公式(10)所示的零空间,其比较重要的原因在于在乘积过程中,所有的位姿和速度都用的是一个值(在理想情况下,都使用的是理想值),这保证了相同项之间可以互相抵消。
例如在 Φ ( t , t − 1 ) 11 = G I t R ( G I t − 1 R ) T \Phi(t,t-1)_{11}={}^{I_{t}}_{G}R({}^{I_{t-1}}_{G}R)^{T} Φ(t,t−1)11=GItR(GIt−1R)T和 Φ ( t − 1 , t − 2 ) 11 = G I t − 1 R ( G I t − 2 R ) T \Phi(t-1,t-2)_{11}={}^{I_{t-1}}_{G}R({}^{I_{t-2}}_{G}R)^{T} Φ(t−1,t−2)11=GIt−1R(GIt−2R)T,其中当 G I t − 1 R {}^{I_{t-1}}_{G}R GIt−1R使用同样的值时才可以抵消,不至于引入其他项。
于是年轻人回想自己的推导过程,因为在自己的系统中,整个系统维护了一个滑动窗口,该窗口内记录了一段时间内的位姿数据,该数据会因为新观测而被更新,导致后续在构建观测矩阵时一直使用的是最新的值,也就是同样的位姿和速度,使用了两个时刻的值,这样的方法使得推导过程中增加好很多因为使用不同时刻值的扰动项!例如在时刻 α i + 1 \alpha_{i+1} αi+1 ,则对于第 ℓ \ell ℓ 个节点(假设该节点的预测时刻也为 ℓ \ell ℓ 时刻)来说形式如下:
O ℓ ( α i + 1 ) = M ℓ ( t ) [ Γ ℓ ( α i + 1 ) + Δ Γ ℓ ( α i + 1 ) − I 3 − Δ t ℓ I 3 I 3 ] (11) \mathcal{O}_{\ell}^{(\alpha_{i+1})}=\mathbf{M}_{\ell}^{(t)} \begin{bmatrix}\begin{array}{ccc|c} \mathbf{\Gamma}_{\ell}^{(\alpha_{i+1})}+\Delta \mathbf{\Gamma}_{\ell}^{(\alpha_{i+1})} &-\mathbf{I}_{3} & -\Delta t_{\ell} \mathbf{I}_{3} & \mathbf{I}_{3} \end{array}\end{bmatrix} \tag{11} Oℓ(αi+1)=Mℓ(t)[Γℓ(αi+1)+ΔΓℓ(αi+1)−I3−ΔtℓI3I3](11)
其中:
Γ \Gamma Γ 的形式应与公式(9)中的理想情况相似:
Γ ℓ ( α i + 1 ) = ⌊ G p ^ f i − G p ^ t 0 ( t 0 ) − G v ^ t 0 ( t 0 ) Δ t ℓ − 1 2 G g Δ t ℓ 2 × ⌋ ( G t 0 R ^ ( t 0 ) ) T \boldsymbol{\Gamma}_{\ell}^{(\alpha_{i+1})}=\left\lfloor^{G} \hat{\mathbf{p}}_{f_{i}}-{ }^{G} \hat{\mathbf{p}}_{t_0}^{(t_0)}-{ }^{G} \hat{\mathbf{v}}_{t_0}^{(t_0)} \Delta t_{\ell}-\frac{1}{2}{ }^{G} \mathbf{g} \Delta t_{\ell}^{2} \times\right\rfloor ({}^{t_0}_{G}\hat{\mathbf{R}}^{(t_0)})^{T} Γℓ(αi+1)=⌊Gp^fi−Gp^t0(t0)−Gv^t0(t0)Δtℓ−21GgΔtℓ2×⌋(Gt0R^(t0))T
Δ Γ \Delta{\Gamma} ΔΓ 是由于不同时刻线性化造成的扰动项,形式如下:
Δ Γ ℓ ( α i + 1 ) = ( ⌊ G p ^ f j − G p ^ ℓ ( α i ) ⌋ × E ‾ q + E ‾ p + ∑ j = t 1 ℓ − 1 ( ∑ s = t 1 j E v s Δ t + E p j + ∑ s = t 1 Φ v q ( x ^ I s + 1 ( s ) , x ^ I s ( s ) ) G s R ^ ( s ) E q s Δ t + Φ p q ( x ^ I j + 1 ( j ) , x ^ I j ( j ) ) G j R ^ ( j ) E q j ) ) ( G k R ^ ( k ) ) T \begin{aligned} \Delta \boldsymbol{\Gamma}_{\ell}^{(\alpha_{i+1})}=&\left(\left\lfloor^{G} \hat{\mathbf{p}}_{f_{j}}-{ }^{G} \hat{\mathbf{p}}_{\ell}^{(\alpha_{i})} \right\rfloor_{\times} \overline{\mathbf{E}}_{\mathbf{q}}+\overline{\mathbf{E}}_{\mathbf{p}}+\sum_{j=t_1}^{\ell-1}\left(\sum_{s=t_1}^{j} \mathbf{E}_{\mathbf{v}}^{s} \Delta t+\mathbf{E}_{\mathbf{p}}^{j}+\right.\right.\\ &\left.\left.\sum_{s=t_1} \boldsymbol{\Phi}_{\mathbf{v q}}\left(\hat{\mathbf{x}}_{I_{s+1}}^{(s)}, \hat{\mathbf{x}}_{I_{s}}^{(s)}\right) {}_{G}^{s}\hat{\mathbf{R}}^{(s)} \mathbf{E}_{\mathbf{q}}^{s} \Delta t+\Phi_{\mathbf{p q}}\left(\hat{\mathbf{x}}_{I_{j+1}}^{(j)}, \hat{\mathbf{x}}_{I_{j}}^{(j)}\right) {}^{j}_{G}\hat{\mathbf{R}}^{(j)} \mathbf{E}_{\mathbf{q}}^{j}\right)\right) ({}^{k}_{G}\hat{\mathbf{R}}^{(k)})^{T} \end{aligned} ΔΓℓ(αi+1)=(⌊Gp^fj−Gp^ℓ(αi)⌋×Eq+Ep+j=t1∑ℓ−1(s=t1∑jEvsΔt+Epj+s=t1∑Φvq(x^Is+1(s),x^Is(s))GsR^(s)EqsΔt+Φpq(x^Ij+1(j),x^Ij(j))GjR^(j)Eqj))(GkR^(k))T
其中形如 X ^ s ( s ) \mathrm{\hat{X}}_{s}^{(s)} X^s(s)就是在 s 时刻第 s 个节点的值,可以看到其中有较多的同一节点在不同时刻的值,这些值导致了扰动项的产生,具体形式可以参考参考【5】中的公式。
M \mathbf{M} M矩阵是一些公共项,这里不多做分析;
年轻人从推导理想情况的步骤中得到启发,于是他尝试将同一变量使用同一时刻的值进行实际情况的推导,选择怎样的时刻呢?年轻人有三个选择,以 t 时刻产生的节点为例:
最后年轻人选择了第一个,因为在能观性矩阵中涉及到状态转移矩阵 Φ ( x ^ t , x ^ t − 1 ) \Phi(\hat{\mathrm{x}}_{t},\hat{\mathrm{x}}_{t-1}) Φ(x^t,x^t−1),此时对于 t t t 节点,仅有刚刚预测出来的值。
于是年轻人对公式做了如下的改动:
将所有的状态转移矩阵做如下变换:
Φ ^ ( t , t − 1 ) = [ G I t R ^ ( t − 1 ) ( G I t − 1 R ^ ( t − 1 ) ) T 0 0 − ⌊ y ^ t ( t − 1 ) ⌋ × ( G I t − 1 R ^ ( t − 1 ) ) T I I Δ t − ⌊ s ^ t ( t − 1 ) ⌋ × ( G I t − 1 R ^ ( t − 1 ) ) T 0 I ] ⇒ Φ ^ ( t , t − 1 ) = [ G I t R ^ ( t − 1 ) ( G I t − 1 R ^ ( t − 2 ) ) T 0 0 − ⌊ y ^ t ( t − 1 ) ⌋ × ( G I t − 1 R ^ ( t − 2 ) ) T I I Δ t − ⌊ s ^ t ( t − 1 ) ⌋ × ( G I t − 1 R ^ ( t − 2 ) ) T 0 I ] (12) \begin{aligned} \hat{\Phi}(t, t-1) &= \begin{bmatrix} {}^{I_{t}}_{G}\hat{R}^{(t-1)}({}^{I_{t-1}}_{G}\hat{R}^{(t-1)})^{T} & \mathbf{0} & \mathbf{0} \\ -\lfloor{\mathrm{\hat{y}}}_{t}^{(t-1)}\rfloor_{\times}({}^{I_{t-1}}_{G}\hat{R}^{(t-1)})^{T} & \mathbf{I} & \mathbf{I}\Delta{t} \\ -\lfloor{\mathrm{\hat{s}}}_{t}^{(t-1)}\rfloor_{\times}({}^{I_{t-1}}_{G}\hat{R}^{(t-1)})^{T} & \mathbf{0} & \mathbf{I} \end{bmatrix} \\ \Rightarrow \hat{\Phi}(t, t-1) &= \begin{bmatrix} {}^{I_{t}}_{G}\hat{R}^{(t-1)}({}^{I_{t-1}}_{G}\hat{R}^{(t-2)})^{T} & \mathbf{0} & \mathbf{0} \\ -\lfloor{\mathrm{\hat{y}}}_{t}^{(t-1)}\rfloor_{\times}({}^{I_{t-1}}_{G}\hat{R}^{(t-2)})^{T} & \mathbf{I} & \mathbf{I}\Delta{t} \\ -\lfloor{\mathrm{\hat{s}}}_{t}^{(t-1)}\rfloor_{\times}({}^{I_{t-1}}_{G}\hat{R}^{(t-2)})^{T} & \mathbf{0} & \mathbf{I} \end{bmatrix} \end{aligned} \tag{12} Φ^(t,t−1)⇒Φ^(t,t−1)=⎣⎢⎡GItR^(t−1)(GIt−1R^(t−1))T−⌊y^t(t−1)⌋×(GIt−1R^(t−1))T−⌊s^t(t−1)⌋×(GIt−1R^(t−1))T0I00IΔtI⎦⎥⎤=⎣⎢⎡GItR^(t−1)(GIt−1R^(t−2))T−⌊y^t(t−1)⌋×(GIt−1R^(t−2))T−⌊s^t(t−1)⌋×(GIt−1R^(t−2))T0I00IΔtI⎦⎥⎤(12)
里面的 y ^ \hat{\mathrm{y}} y^ 和 s ^ \hat{\mathrm{s}} s^ 中的相应项也要变为FEJ的形式;
将所有的观测矩阵做如下变换:
H f j ∣ t = J ( f j ∣ t ) I C R G I t R ^ ( α i ) [ ⌊ G p f j − G p I t ( α i ) ⌋ × ( G I l R ^ ( α i ) ) T − I 3 × 3 0 3 × 3 I 3 × 3 ] ⇒ H f j ∣ t = J ( f j ∣ t ) I C R G I t R ^ ( t − 1 ) [ ⌊ G p f j − G p I t ( t − 1 ) ⌋ × ( G I l R ^ ( t − 1 ) ) T − I 3 × 3 0 3 × 3 I 3 × 3 ] (13) \begin{aligned} \mathbf{H}_{f_j|t}&=J_{(f_j|t)} \quad {}^{C}_{I}R \quad {}_{G}^{I_t}\hat{R}^{(\alpha_i)} \begin{bmatrix}\begin{array}{ccc|c} \lfloor{}^{G}\mathrm{p}_{f_j}-{}^{G}\mathrm{p}_{I_t}^{(\alpha_i)}\rfloor_{\times}({}_{G}^{I_l}\hat{R}^{(\alpha_i)})^{T} & -\mathbf{I}_{3\times3} & \mathbf{0}_{3\times3} & \mathbf{I}_{3\times3} \end{array}\end{bmatrix} \\ \Rightarrow \mathbf{H}_{f_j|t}&=J_{(f_j|t)} \quad {}^{C}_{I}R \quad {}_{G}^{I_t}\hat{R}^{(t-1)} \begin{bmatrix}\begin{array}{ccc|c} \lfloor{}^{G}\mathrm{p}_{f_j}-{}^{G}\mathrm{p}_{I_t}^{(t-1)}\rfloor_{\times}({}_{G}^{I_l}\hat{R}^{(t-1)})^{T} & -\mathbf{I}_{3\times3} & \mathbf{0}_{3\times3} & \mathbf{I}_{3\times3} \end{array}\end{bmatrix} \end{aligned} \tag{13} Hfj∣t⇒Hfj∣t=J(fj∣t)ICRGItR^(αi)[⌊Gpfj−GpIt(αi)⌋×(GIlR^(αi))T−I3×303×3I3×3]=J(fj∣t)ICRGItR^(t−1)[⌊Gpfj−GpIt(t−1)⌋×(GIlR^(t−1))T−I3×303×3I3×3](13)
将上述的改动带入到能观性矩阵中之后,果然消掉了所有的扰动项,得到了形如公式(10)的零空间:
N t ( α i ) = [ 0 3 G I t 0 R ^ ( t 0 ) g I 3 − [ G p t 0 ( t 0 ) ] × g 0 3 − [ G v t 0 ( t 0 ) ] × g I 3 − [ G p f j ] × g ] (14) \mathbf{N}_{t}^{(\alpha_i)}= \begin{bmatrix} \mathbf{0}_{3} & {}^{I_{t_0}}_{G}\mathbf{\hat{R}}^{(t_0)} \mathbf{g} \\ \mathbf{I}_{3} & -\left[^{G} \mathbf{p}_{t_0}^{(t_0)}\right]_\times{\mathbf{g}} \\ \mathbf{0}_{3} & -\left[^{G} \mathbf{v}_{t_0}^{(t_0)}\right]_\times{\mathbf{g}} \\ \hline \mathbf{I}_{3} & -\left[^{G} \mathbf{p}_{f_j}\right]_\times{\mathbf{g}} \\ \end{bmatrix} \tag{14} Nt(αi)=⎣⎢⎢⎢⎢⎢⎡03I303I3GIt0R^(t0)g−[Gpt0(t0)]×g−[Gvt0(t0)]×g−[Gpfj]×g⎦⎥⎥⎥⎥⎥⎤(14)
年轻人很开心,他连忙打开老师给予的第三个锦囊,果然老师的提示与自己的想法是一致的。
以上的详细推导可以看参考【1】
时间回到第二个年轻人那里,他下了山只有,并没有直接回家,而是去参加了一个朋友主办的研讨会,会议上他了解到如何求解带约束的最优化问题,这个研讨会在后面帮助了他很多。第二个年轻人也从老师的建议中获取了很多;
根据年轻人之前的研究,根据IMU的运动方程推导得到的误差状态微分方程为:
X ~ ˙ I M U = F X ~ I M U + G n I M U (15) \dot{\tilde{\mathbf{X}}}_{\mathrm{IMU}}=\mathbf{F} \tilde{\mathbf{X}}_{\mathrm{IMU}}+\mathbf{G} \mathbf{n}_{\mathrm{IMU}} \tag{15} X~˙IMU=FX~IMU+GnIMU(15)
其中:
F = [ − ⌊ ω ^ × ⌋ 0 3 × 3 0 3 × 3 0 3 × 3 0 3 I 3 × 3 − ( G I l R ) T ⌊ a m ^ × ⌋ 0 3 × 3 0 3 × 3 ] \mathbf{F}=\left[\begin{array}{ccc} -\lfloor\hat{\boldsymbol{\omega}} \times\rfloor & \mathbf{0}_{3 \times 3} & \mathbf{0}_{3 \times 3} \\ \mathbf{0}_{3 \times 3} & \mathbf{0}_{3} & \mathbf{I}_{3 \times 3} \\ -({}_{G}^{I_l}R)^{T}\lfloor\hat{\mathbf{a_m}} \times\rfloor & \mathbf{0}_{3 \times 3} & \mathbf{0}_{3 \times 3} \\ \end{array}\right] F=⎣⎡−⌊ω^×⌋03×3−(GIlR)T⌊am^×⌋03×30303×303×3I3×303×3⎦⎤
这里误差驱动矩阵 G \mathbf{G} G不对零空间的分析有贡献,所以暂时就不分析了;
那么根据微分方程,可以得到状态转移方程为:
X ~ ( t l + 1 ) = Φ ( t l + 1 , t l ) X ~ ( t l ) + ∫ t l t l + 1 Φ ( t l + 1 , τ ) G ( τ ) n ( τ ) d τ (16) \boldsymbol{\tilde{\mathrm{X}}}\left(t_{l+1}\right)=\boldsymbol{\Phi}\left(t_{l+1}, t_{l}\right) \boldsymbol{\tilde{\mathrm{X}}}\left(t_{l}\right)+\int_{t_{l}}^{t_{l+1}} \boldsymbol{\Phi}\left(t_{l+1}, \tau\right) \boldsymbol{G}(\tau) \boldsymbol{n}(\tau) \mathrm{d} \tau \tag{16} X~(tl+1)=Φ(tl+1,tl)X~(tl)+∫tltl+1Φ(tl+1,τ)G(τ)n(τ)dτ(16)
其中:
{ Φ ˙ ( t l + 1 , t l ) = F ( t ) Φ ( t l + 1 , t l ) Φ ( t l + 1 , t l ) = exp ( ∫ t l t l + 1 F ( t ) d t ) (17) \begin{cases} \dot{\boldsymbol{\Phi}}\left(t_{l+1}, t_{l}\right) = \boldsymbol{F}(t)\boldsymbol{\Phi}\left(t_{l+1}, t_{l}\right) \\ \boldsymbol{\Phi}\left(t_{l+1}, t_{l}\right)=\exp(\int_{t_{l}}^{t_{l+1}} \boldsymbol{F}(t) \mathrm{d} t) \end{cases} \tag{17} { Φ˙(tl+1,tl)=F(t)Φ(tl+1,tl)Φ(tl+1,tl)=exp(∫tltl+1F(t)dt)(17)
根据公式(17)可以列出如下公式:
[ Φ ˙ 11 ( t ) Φ ˙ 12 ( t ) Φ ˙ 13 ( t ) Φ ˙ 21 ( t ) Φ ˙ 22 ( t ) Φ ˙ 23 ( t ) Φ ˙ 31 ( t ) Φ ˙ 32 ( t ) Φ ˙ 33 ( t ) ] = [ − ⌊ ω ( t ) ⌋ × 0 3 × 3 0 3 × 3 0 3 × 3 0 3 I 3 × 3 − ( t G R ) T ⌊ a m ( t ) ⌋ × 0 3 × 3 0 3 × 3 ] [ Φ 11 ( t ) Φ 12 ( t ) Φ 13 ( t ) Φ 21 ( t ) Φ 22 ( t ) Φ 23 ( t ) Φ 31 ( t ) Φ 32 ( t ) Φ 33 ( t ) ] [ Φ 11 ( t 0 ) Φ 12 ( t 0 ) Φ 13 ( t 0 ) Φ 21 ( t 0 ) Φ 22 ( t 0 ) Φ 23 ( t 0 ) Φ 31 ( t 0 ) Φ 32 ( t 0 ) Φ 33 ( t 0 ) ] = [ I 0 0 0 I 0 0 0 I ] (18) \begin{aligned} \begin{bmatrix} \dot{\Phi}_{11}(t) & \dot{\Phi}_{12}(t) & \dot{\Phi}_{13}(t) \\ \dot{\Phi}_{21}(t) & \dot{\Phi}_{22}(t) & \dot{\Phi}_{23}(t) \\ \dot{\Phi}_{31}(t) & \dot{\Phi}_{32}(t) & \dot{\Phi}_{33}(t) \\ \end{bmatrix} &=\left[\begin{array}{ccc} -\lfloor{\boldsymbol{\omega}(t)}\rfloor_{\times} & \mathbf{0}_{3 \times 3} & \mathbf{0}_{3 \times 3} \\ \mathbf{0}_{3 \times 3} & \mathbf{0}_{3} & \mathbf{I}_{3 \times 3} \\ -({}^{G}_{t}R)^{T}\lfloor{\mathbf{a_m}(t)}\rfloor_{\times} & \mathbf{0}_{3 \times 3} & \mathbf{0}_{3 \times 3} \\ \end{array}\right] \begin{bmatrix} {\Phi}_{11}(t) & {\Phi}_{12}(t) & {\Phi}_{13}(t) \\ {\Phi}_{21}(t) & {\Phi}_{22}(t) & {\Phi}_{23}(t) \\ {\Phi}_{31}(t) & {\Phi}_{32}(t) & {\Phi}_{33}(t) \\ \end{bmatrix} \\ \begin{bmatrix} {\Phi}_{11}(t_0) & {\Phi}_{12}(t_0) & {\Phi}_{13}(t_0) \\ {\Phi}_{21}(t_0) & {\Phi}_{22}(t_0) & {\Phi}_{23}(t_0) \\ {\Phi}_{31}(t_0) & {\Phi}_{32}(t_0) & {\Phi}_{33}(t_0) \\ \end{bmatrix} &= \begin{bmatrix} \mathbf{I} & \mathbf{0} & \mathbf{0} \\ \mathbf{0} & \mathbf{I} & \mathbf{0} \\ \mathbf{0} & \mathbf{0} & \mathbf{I} \\ \end{bmatrix} \end{aligned} \tag{18} ⎣⎡Φ˙11(t)Φ˙21(t)Φ˙31(t)Φ˙12(t)Φ˙22(t)Φ˙32(t)Φ˙13(t)Φ˙23(t)Φ˙33(t)⎦⎤⎣⎡Φ11(t0)Φ21(t0)Φ31(t0)Φ12(t0)Φ22(t0)Φ32(t0)Φ13(t0)Φ23(t0)Φ33(t0)⎦⎤=⎣⎡−⌊ω(t)⌋×03×3−(tGR)T⌊am(t)⌋×03×30303×303×3I3×303×3⎦⎤⎣⎡Φ11(t)Φ21(t)Φ31(t)Φ12(t)Φ22(t)Φ32(t)Φ13(t)Φ23(t)Φ33(t)⎦⎤=⎣⎡I000I000I⎦⎤(18)
求解上述的微分方程,易得:
Φ ( t