Unleashing Robotics: Mastering Quaternion Kinematics with Python - Chapter8(原创系列教程)
本系列教程禁止转载,主要是为了有不同见解的同学可以方便联系我,我的邮箱 fanzexuan135@163.com
随机噪声和扰动的积分
我们现在的目标是给出适当的方法来积分动态系统中的随机变量。当然,我们不能积分未知的随机值,但我们可以积分它们的方差和协方差,以便进行不确定性传播。这对于建立连续性质(并以连续时间指定)但以离散方式估计的系统的估计器的协方差矩阵是必需的。
考虑连续时间动态系统:
x ˙ = f ( x , u , w ) \dot{x} = f(x, u, w) x˙=f(x,u,w)
其中 x x x是状态向量, u u u是包含噪声 u ~ \tilde{u} u~的控制信号向量,因此控制测量值为 u m = u + u ~ u_m=u+\tilde{u} um=u+u~, w w w是随机扰动向量。噪声和扰动都假设为白高斯过程,具体如下:
u ~ ∼ N ( 0 , U c ) , w c ∼ N ( 0 , W c ) \tilde{u} \sim N(0, U_c), \quad w_c \sim N(0, W_c) u~∼N(0,Uc),wc∼N(0,Wc)
其中上标 ∙ c \bullet_c ∙c表示连续时间不确定性规范,我们要对其进行积分。
控制信号中的噪声水平 u ~ \tilde{u} u~和随机扰动 w w w之间存在一个重要区别:
- 在离散化时,控制信号在时刻 n Δ t n\Delta t nΔt被采样,得到 u m , n ≡ u m ( n Δ t ) = u ( n Δ t ) + u ~ ( n Δ t ) u_{m,n} \equiv u_m(n\Delta t)=u(n\Delta t)+\tilde{u}(n\Delta t) um,n≡um(nΔt)=u(nΔt)+u~(nΔt)。测量值的部分显然在整个积分区间内被认为是常数,即 u m ( t ) = u m , n u_m(t)=u_{m,n} um(t)=um,n,因此在采样时刻 n Δ t n\Delta t nΔt的噪声水平也保持不变,
u ~ ( t ) = u ~ ( n Δ t ) = u ~ n , n Δ t < t < ( n + 1 ) Δ t \tilde{u}(t) = \tilde{u}(n\Delta t) = \tilde{u}_n, \quad n\Delta t < t < (n+1)\Delta t u~(t)=u~(nΔt)=u~n,nΔt<t<(n+1)Δt
- 扰动 w w w从不被采样。
因此,这两个随机过程在 Δ t \Delta t Δt上的积分是不同的。让我们来研究一下。
连续时间误差状态动力学可以线性化为:
δ x ˙ = A δ x + B u ~ + C w \delta\dot{x} = A\delta x + B\tilde{u} + Cw δx˙=Aδx+Bu~+Cw
其中
A ≡ ∂ f ∂ δ x ∣ x , u m , B ≡ ∂ f ∂ u ~ ∣ x , u m , C ≡ ∂ f ∂ w ∣ x , u m A \equiv \frac{\partial f}{\partial \delta x}\bigg|_{x,u_m}, \quad B \equiv \frac{\partial f}{\partial \tilde{u}}\bigg|_{x,u_m}, \quad C \equiv \frac{\partial f}{\partial w}\bigg|_{x,u_m} A≡∂δx∂f x,um,B≡∂u~∂f x,um,C≡∂w∂f x,um
并在采样周期 Δ t \Delta t Δt上积分,得到:
δ x n + 1 = δ x n + ∫ n Δ t ( n + 1 ) Δ t ( A δ x ( τ ) + B u ~ ( τ ) + C w c ( τ ) ) d τ = δ x n + ∫ n Δ t ( n + 1 ) Δ t A δ x ( τ ) d τ + ∫ n Δ t ( n + 1 ) Δ t B u ~ ( τ ) d τ + ∫ n Δ t ( n + 1 ) Δ t C w c ( τ ) d τ \begin{aligned} \delta x_{n+1} &= \delta x_n + \int_{n\Delta t}^{(n+1)\Delta t}(A\delta x(\tau) + B\tilde{u}(\tau) + Cw_c(\tau))d\tau \\ &= \delta x_n + \int_{n\Delta t}^{(n+1)\Delta t}A\delta x(\tau)d\tau + \int_{n\Delta t}^{(n+1)\Delta t}B\tilde{u}(\tau)d\tau + \int_{n\Delta t}^{(n+1)\Delta t}Cw_c(\tau)d\tau \end{aligned} δxn+1=δxn+∫nΔt(n+1)Δt(Aδx(τ)+Bu~(τ)+Cwc(τ))dτ=δxn+∫nΔt(n+1)ΔtAδx(τ)dτ+∫nΔt(n+1)ΔtBu~(τ)dτ+∫nΔt(n+1)ΔtCwc(τ)dτ
这有三个性质非常不同的项。可以按如下方式进行积分:
- 从前面的章节我们知道动态部分的积分给出了转移矩阵,
δ x n + ∫ n Δ t ( n + 1 ) Δ t A δ x ( τ ) d τ = Φ ⋅ δ x n \delta x_n + \int_{n\Delta t}^{(n+1)\Delta t}A\delta x(\tau)d\tau = \Phi \cdot \delta x_n δxn+∫nΔt(n+1)ΔtAδx(τ)dτ=Φ⋅δxn
其中 Φ = e A Δ t \Phi=e^{A\Delta t} Φ=eAΔt可以用闭式计算或以不同的精度级别近似。
- 我们有
∫ n Δ t ( n + 1 ) Δ t B u ~ ( τ ) d τ = B Δ t u ~ n \int_{n\Delta t}^{(n+1)\Delta t}B\tilde{u}(\tau)d\tau = B\Delta t \tilde{u}_n ∫nΔt(n+1)ΔtBu~(τ)dτ=BΔtu~n
这意味着一旦被采样,测量噪声就以确定的方式被积分,因为它在积分区间内的行为是已知的。
- 从概率论我们知道,在周期 Δ t \Delta t Δt上积分连续白高斯噪声会产生一个离散白高斯脉冲 w n w_n wn,表示为:
w n ≡ ∫ n Δ t ( n + 1 ) Δ t w ( τ ) d τ , w n ∼ N ( 0 , W ) , with W = W c Δ t w_n \equiv \int_{n\Delta t}^{(n+1)\Delta t}w(\tau)d\tau, \quad w_n \sim N(0, W), \quad \text{with } W = W_c \Delta t wn≡∫nΔt(n+1)Δtw(τ)dτ,wn∼N(0,W),with W=WcΔt
我们注意到,与上面的测量噪声相反,扰动在积分区间内没有确定的行为,因此必须以随机方式积分。
因此,离散时间误差状态动态系统可以写成:
δ x n + 1 = F x δ x n + F u u ~ n + F w w n \delta x_{n+1} = F_x \delta x_n + F_u \tilde{u}_n + F_w w_n δxn+1=Fxδxn+Fuu~n+Fwwn
其中转移矩阵、控制矩阵和扰动矩阵分别为:
F x = Φ = e A Δ t , F u = B Δ t , F w = C F_x = \Phi = e^{A\Delta t}, \quad F_u = B\Delta t, \quad F_w = C Fx=Φ=eAΔt,Fu=BΔt,Fw=C
噪声和扰动水平定义为:
u ~ n ∼ N ( 0 , U ) , w n ∼ N ( 0 , W ) \tilde{u}_n \sim N(0, U), \quad w_n \sim N(0, W) u~n∼N(0,U),wn∼N(0,W)
其中
U = U c , W = W c Δ t U = U_c, \quad W = W_c \Delta t U=Uc,W=WcΔt
EKF的预测阶段将根据以下方式传播误差状态的均值和协方差矩阵:
δ x ^ n + 1 = F x δ x ^ n P n + 1 = F x P n F x ⊤ + F u U F u ⊤ + F w W F w ⊤ = e A Δ t P n ( e A Δ t ) ⊤ + Δ t 2 B U c B ⊤ + Δ t C W c C ⊤ \begin{aligned} \hat{\delta x}_{n+1} &= F_x \hat{\delta x}_n \\ P_{n+1} &= F_x P_n F_x^\top + F_u U F_u^\top + F_w W F_w^\top \\ &= e^{A\Delta t}P_n(e^{A\Delta t})^\top + \Delta t^2 B U_c B^\top + \Delta t C W_c C^\top \end{aligned} δx^n+1Pn+1=Fxδx^n=FxPnFx⊤+FuUFu⊤+FwWFw⊤=eAΔtPn(eAΔt)⊤+Δt2BUcB⊤+ΔtCWcC⊤
在这里观察积分区间 Δ t \Delta t Δt对协方差更新(440)的三项的不同影响是很重要和有启发性的:动态误差项是指数的,测量误差项是二次的,扰动误差项是线性的。
噪声和扰动脉冲
人们经常遇到(例如在重用现有代码或解释其他作者的文档时)EKF预测方程的一个更简单的形式,即:
P n + 1 = F x P n F x ⊤ + Q P_{n+1} = F_x P_n F_x^\top + Q Pn+1=FxPnFx⊤+Q
这对应于一般的离散时间动态系统:
δ x n + 1 = F x δ x n + i \delta x_{n+1} = F_x \delta x_n + i δxn+1=Fxδxn+i
其中
i ∼ N ( 0 , Q ) i \sim N(0, Q) i∼N(0,Q)
是直接添加到时刻 t n + 1 t_{n+1} tn+1的状态向量中的随机(白噪声,高斯)脉冲向量。矩阵 Q Q Q被简单地视为脉冲协方差矩阵。从我们所看到的,我们应该如下计算这个协方差矩阵:
Q = Δ t 2 B U c B ⊤ + Δ t C W c C ⊤ Q = \Delta t^2 B U_c B^\top + \Delta t C W_c C^\top Q=Δt2BUcB⊤+ΔtCWcC⊤
在脉冲不影响整个状态的情况下,这种情况经常发生,矩阵 Q Q Q不是全对角的,并且可能包含大量的零。然后可以写出等价形式:
δ x n + 1 = F x δ x n + F i i \delta x_{n+1} = F_x \delta x_n + F_i i δxn+1=Fxδxn+Fii
其中
i ∼ N ( 0 , Q i ) i \sim N(0, Q_i) i∼N(0,Qi)
矩阵 F i F_i Fi只是将每个单独的脉冲映射到它所影响的状态向量的部分。相关的协方差 Q i Q_i Qi则更小,并且是全对角的。请参考下一节的示例。在这种情况下,ESKF时间更新变为:
δ x ^ n + 1 = F x δ x ^ n P n + 1 = F x P n F x ⊤ + F i Q i F i ⊤ \begin{aligned} \hat{\delta x}_{n+1} &= F_x \hat{\delta x}_n \\ P_{n+1} &= F_x P_n F_x^\top + F_i Q_i F_i^\top \end{aligned} δx^n+1Pn+1=Fxδx^n=FxPnFx⊤+FiQiFi⊤
显然,所有这些形式都是等价的,这可以从一般扰动 Q Q Q的以下双重等式中看出:
F i Q i F i ⊤ = Q = Δ t 2 B U c B ⊤ + Δ t C W c C ⊤ F_i Q_i F_i^\top = Q = \Delta t^2 B U_c B^\top + \Delta t C W_c C^\top FiQiFi⊤=Q=Δt2BUcB⊤+ΔtCWcC⊤
完整IMU示例
我们研究为IMU构建误差状态卡尔曼滤波器。误差状态系统在下列方程中定义,涉及标称状态 x \mathbf{x} x,误差状态 δ x \delta\mathbf{x} δx,有噪声的控制信号 u m = u + u ~ \mathbf{u}_m=\mathbf{u}+\tilde{\mathbf{u}} um=u+u~和扰动 w \mathbf{w} w,具体定义为:
x = [ p v q a b ω b g ] , δ x = [ δ p δ v δ θ δ a b δ ω b δ g ] , u m = [ a m ω m ] , u ~ = [ a ~ ω ~ ] , w = [ a w ω w ] \mathbf{x} = \begin{bmatrix} \mathbf{p} \\ \mathbf{v} \\ \mathbf{q} \\ \mathbf{a}_b \\ \boldsymbol{\omega}_b \\ \mathbf{g} \end{bmatrix}, \quad \delta\mathbf{x} = \begin{bmatrix} \delta\mathbf{p} \\ \delta\mathbf{v} \\ \delta\boldsymbol{\theta} \\ \delta\mathbf{a}_b \\ \delta\boldsymbol{\omega}_b \\ \delta\mathbf{g} \end{bmatrix}, \quad \mathbf{u}_m = \begin{bmatrix} \mathbf{a}_m \\ \boldsymbol{\omega}_m \end{bmatrix}, \quad \tilde{\mathbf{u}} = \begin{bmatrix} \tilde{\mathbf{a}} \\ \tilde{\boldsymbol{\omega}} \end{bmatrix}, \quad \mathbf{w} = \begin{bmatrix} \mathbf{a}_w \\ \boldsymbol{\omega}_w \end{bmatrix} x= pvqabωbg ,δx= δpδvδθδabδωbδg ,um=[amωm],u~=[a~ω~],w=[awωw]
在这里:
- p \mathbf{p} p, v \mathbf{v} v, q \mathbf{q} q 分别是位置、速度和姿态(四元数)的标称状态。
- a b \mathbf{a}_b ab, ω b \boldsymbol{\omega}_b ωb 是加速度计和陀螺仪偏差的标称状态。
- g \mathbf{g} g 是重力向量的标称状态。
- δ p \delta\mathbf{p} δp, δ v \delta\mathbf{v} δv, δ θ \delta\boldsymbol{\theta} δθ 分别是位置、速度和姿态(欧拉角)误差状态。
- δ a b \delta\mathbf{a}_b δab, δ ω b \delta\boldsymbol{\omega}_b δωb, δ g \delta\mathbf{g} δg 分别是加速度计偏差、陀螺仪偏差和重力向量的误差状态。
- a m \mathbf{a}_m am, ω m \boldsymbol{\omega}_m ωm 是加速度计和陀螺仪的测量值。
- a ~ \tilde{\mathbf{a}} a~, ω ~ \tilde{\boldsymbol{\omega}} ω~ 是加速度计和陀螺仪的测量噪声。
- a w \mathbf{a}_w aw, ω w \boldsymbol{\omega}_w ωw 是加速度计和陀螺仪偏差的过程噪声。
- a n = a ~ \mathbf{a}_n = \tilde{\mathbf{a}} an=a~, ω n = ω ~ \boldsymbol{\omega}_n = \tilde{\boldsymbol{\omega}} ωn=ω~ 是加速度计和陀螺仪的(重新定义的)测量噪声。
注意,这里我们使用了不同的符号来区分标称状态、误差状态、测量值和噪声。另外,加速度计和陀螺仪的测量噪声最初被定义为 a ~ \tilde{\mathbf{a}} a~和 ω ~ \tilde{\boldsymbol{\omega}} ω~,但在后面的推导中被重新定义为 a n \mathbf{a}_n an和 ω n \boldsymbol{\omega}_n ωn,以简化公式。
x = [ p ⊤ , v ⊤ , q ⊤ , a b ⊤ , ω b ⊤ , g ⊤ ] ⊤ δ x = [ δ p ⊤ , δ v ⊤ , δ θ ⊤ , δ a b ⊤ , δ ω b ⊤ , δ g ⊤ ] ⊤ u m = [ a m ⊤ , ω m ⊤ ] ⊤ u ~ = [ a ~ ⊤ , ω ~ ⊤ ] ⊤ w = [ a w ⊤ , ω w ⊤ ] ⊤ \begin{aligned} x &= [p^\top, v^\top, q^\top, a_b^\top, \omega_b^\top, g^\top]^\top \\ \delta x &= [\delta p^\top, \delta v^\top, \delta \theta^\top, \delta a_b^\top, \delta \omega_b^\top, \delta g^\top]^\top \\ u_m &= [a_m^\top, \omega_m^\top]^\top \\ \tilde{u} &= [\tilde{a}^\top, \tilde{\omega}^\top]^\top \\ w &= [a_w^\top, \omega_w^\top]^\top \end{aligned} xδxumu~w=[p⊤,v⊤,q⊤,ab⊤,ωb⊤,g⊤]⊤=[δp⊤,δv⊤,δθ⊤,δab⊤,δωb⊤,δg⊤]⊤=[am⊤,ωm⊤]⊤=[a~⊤,ω~⊤]⊤=[aw⊤,ωw⊤]⊤
在我们正在考虑的IMU模型中,控制噪声对应于IMU测量中的附加噪声。扰动影响偏差,从而产生它们的随机游走行为。动态矩阵、控制矩阵和扰动矩阵为(见(428)、(378)和(238)):
A = [ 0 P v 0 0 0 0 0 0 V θ V a 0 V g 0 0 Θ θ 0 Θ ω 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ] , B = [ 0 0 − R 0 0 − I 0 0 0 0 0 0 ] , C = [ 0 0 0 0 0 0 I 0 0 I 0 0 ] A = \begin{bmatrix} 0 & P_v & 0 & 0 & 0 & 0\\ 0 & 0 & V_\theta & V_a & 0 & V_g\\ 0 & 0 & \Theta_\theta & 0 & \Theta_\omega & 0\\ 0 & 0 & 0 & 0 & 0 & 0\\ 0 & 0 & 0 & 0 & 0 & 0\\ 0 & 0 & 0 & 0 & 0 & 0 \end{bmatrix}, \quad B = \begin{bmatrix} 0 & 0\\ -R & 0\\ 0 & -I\\ 0 & 0\\ 0 & 0\\ 0 & 0 \end{bmatrix}, \quad C = \begin{bmatrix} 0 & 0\\ 0 & 0\\ 0 & 0\\ I & 0\\ 0 & I\\ 0 & 0 \end{bmatrix} A= 000000Pv000000VθΘθ0000Va000000Θω0000Vg0000 ,B= 0−R000000−I000 ,C= 000I000000I0
在IMU的三个轴上具有相同类型的加速度计和陀螺仪三元组的常规情况下,噪声和扰动是各向同性的。它们的标准差指定为标量,如下所示:
σ a ~ [ m/s 2 ] , σ ω ~ [ rad/s ] , σ a w [ m/s 2 s ] , σ ω w [ rad/s s ] \sigma_{\tilde{a}} [\text{m/s}^2], \quad \sigma_{\tilde{\omega}} [\text{rad/s}], \quad \sigma_{a_w} [\text{m/s}^2\sqrt{\text{s}}], \quad \sigma_{\omega_w} [\text{rad/s}\sqrt{\text{s}}] σa~[m/s2],σω~[rad/s],σaw[m/s2s],σωw[rad/ss]
它们的协方差矩阵是纯对角的,得到:
U c = [ σ a ~ 2 I 0 0 σ ω ~ 2 I ] , W c = [ σ a w 2 I 0 0 σ ω w 2 I ] U_c = \begin{bmatrix} \sigma_{\tilde{a}}^2 I & 0\\ 0 & \sigma_{\tilde{\omega}}^2 I \end{bmatrix}, \quad W_c = \begin{bmatrix} \sigma_{a_w}^2 I & 0\\ 0 & \sigma_{\omega_w}^2 I \end{bmatrix} Uc=[σa~2I00σω~2I],Wc=[σaw2I00σωw2I]
系统以 Δ t \Delta t Δt的采样度量随时间演化,遵循以下离散时间动力学方程:
δ x n + 1 = F x δ x n + F u u ~ n + F w w n (435) \delta \mathbf{x}_{n+1} = \mathbf{F}_x \delta \mathbf{x}_n + \mathbf{F}_u \tilde{\mathbf{u}}_n + \mathbf{F}_w \mathbf{w}_n \tag{435} δxn+1=Fxδxn+Fuu~n+Fwwn(435)
其中,转移矩阵 F x \mathbf{F}_x Fx,控制矩阵 F u \mathbf{F}_u Fu和扰动矩阵 F w \mathbf{F}_w Fw分别为:
F x = Φ = e A Δ t , F u = B Δ t , F w = C (436) \mathbf{F}_x = \boldsymbol{\Phi} = e^{\mathbf{A}\Delta t}, \quad \mathbf{F}_u = \mathbf{B}\Delta t, \quad \mathbf{F}_w = \mathbf{C} \tag{436} Fx=Φ=eAΔt,Fu=BΔt,Fw=C(436)
噪声和扰动水平定义为:
u ~ n ∼ N ( 0 , U ) , w n ∼ N ( 0 , W ) (437) \tilde{\mathbf{u}}_n \sim \mathcal{N}(\mathbf{0}, \mathbf{U}), \quad \mathbf{w}_n \sim \mathcal{N}(\mathbf{0}, \mathbf{W}) \tag{437} u~n∼N(0,U),wn∼N(0,W)(437)
其中:
U = U c , W = W c Δ t (438) \mathbf{U} = \mathbf{U}_c, \quad \mathbf{W} = \mathbf{W}_c \Delta t \tag{438} U=Uc,W=WcΔt(438)
转移矩阵 F x = Φ \mathbf{F}_x=\boldsymbol{\Phi} Fx=Φ可以通过多种方式计算,例如:
- 使用矩阵指数的定义直接计算:
Φ = e A Δ t = I + A Δ t + 1 2 ! A 2 Δ t 2 + 1 3 ! A 3 Δ t 3 + ⋯ \boldsymbol{\Phi} = e^{\mathbf{A}\Delta t} = \mathbf{I} + \mathbf{A}\Delta t + \frac{1}{2!}\mathbf{A}^2\Delta t^2 + \frac{1}{3!}\mathbf{A}^3\Delta t^3 + \cdots Φ=eAΔt=I+AΔt+2!1A2Δt2+3!1A3Δt3+⋯
- 对于某些特殊形式的 A \mathbf{A} A(例如,当它是对角或块对角矩阵时),矩阵指数可能有封闭形式的解。例如,如果 A = d i a g ( λ 1 , λ 2 , … , λ n ) \mathbf{A} = \mathrm{diag}(\lambda_1, \lambda_2, \dots, \lambda_n) A=diag(λ1,λ2,…,λn),那么
e A Δ t = d i a g ( e λ 1 Δ t , e λ 2 Δ t , … , e λ n Δ t ) e^{\mathbf{A}\Delta t} = \mathrm{diag}(e^{\lambda_1 \Delta t}, e^{\lambda_2 \Delta t}, \dots, e^{\lambda_n \Delta t}) eAΔt=diag(eλ1Δt,eλ2Δt,…,eλnΔt)
-
使用数值方法,如帕德近似(Padé approximation)或缩放和求幂(scaling and squaring)方法。这些方法对于一般形式的 A \mathbf{A} A很有用,并且可以在许多数值计算库中找到,如scipy.linalg.expm。
-
对于一些特定问题,转移矩阵 Φ \boldsymbol{\Phi} Φ可能有封闭形式的解。这通常是通过求解微分方程 x ˙ = A x \dot{\mathbf{x}} = \mathbf{A}\mathbf{x} x˙=Ax来获得的。例如,对于前面讨论的简化IMU模型,旋转部分的转移矩阵有封闭解:
Φ θ θ = exp ( A θ θ Δ t ) = I − [ ω ] × sin ∥ ω ∥ Δ t + [ ω ] × 2 ( 1 − cos ∥ ω ∥ Δ t ) \boldsymbol{\Phi}_{\theta\theta} = \exp(\mathbf{A}_{\theta\theta}\Delta t) = \mathbf{I} - [\boldsymbol{\omega}]_\times \sin\|\boldsymbol{\omega}\|\Delta t + [\boldsymbol{\omega}]_\times^2(1-\cos\|\boldsymbol{\omega}\|\Delta t) Φθθ=exp(AθθΔt)=I−[ω]×sin∥ω∥Δt+[ω]×2(1−cos∥ω∥Δt)
其中 ω \boldsymbol{\omega} ω是角速度向量。
在实际应用中,应根据问题的具体特征和计算效率的要求选择合适的方法来计算转移矩阵。封闭解通常是最可取的,因为它们精确且计算效率高,但它们并不总是可用的。当封闭解不存在时,数值方法提供了一个很好的折衷方案。。
噪声和扰动脉冲
在以脉冲 i i i的形式指定扰动的情况下,我们可以重新定义我们的系统如下:
δ x n + 1 = F x ( x n , u m ) ⋅ δ x n + F i ⋅ i \delta x_{n+1} = F_x(x_n, u_m) \cdot \delta x_n + F_i \cdot i δxn+1=Fx(xn,um)⋅δxn+Fi⋅i
其中标称状态、误差状态、控制和脉冲向量定义为:
x = [ p ⊤ , v ⊤ , q ⊤ , a b ⊤ , ω b ⊤ , g ⊤ ] ⊤ δ x = [ δ p ⊤ , δ v ⊤ , δ θ ⊤ , δ a b ⊤ , δ ω b ⊤ , δ g ⊤ ] ⊤ u m = [ a m ⊤ , ω m ⊤ ] ⊤ i = [ v i ⊤ , θ i ⊤ , a i ⊤ , ω i ⊤ ] ⊤ \begin{aligned} x &= [p^\top, v^\top, q^\top, a_b^\top, \omega_b^\top, g^\top]^\top \\ \delta x &= [\delta p^\top, \delta v^\top, \delta \theta^\top, \delta a_b^\top, \delta \omega_b^\top, \delta g^\top]^\top \\ u_m &= [a_m^\top, \omega_m^\top]^\top \\ i &= [v_i^\top, \theta_i^\top, a_i^\top, \omega_i^\top]^\top \end{aligned} xδxumi=[p⊤,v⊤,q⊤,ab⊤,ωb⊤,g⊤]⊤=[δp⊤,δv⊤,δθ⊤,δab⊤,δωb⊤,δg⊤]⊤=[am⊤,ωm⊤]⊤=[vi⊤,θi⊤,ai⊤,ωi⊤]⊤
转移矩阵和扰动矩阵定义为:
F x = Φ = e A Δ t , F i = [ 0 0 0 0 I 0 0 0 0 I 0 0 0 0 I 0 0 0 0 I 0 0 0 0 ] F_x = \Phi = e^{A\Delta t}, \quad F_i = \begin{bmatrix} 0 & 0 & 0 & 0\\ I & 0 & 0 & 0\\ 0 & I & 0 & 0\\ 0 & 0 & I & 0\\ 0 & 0 & 0 & I\\ 0 & 0 & 0 & 0 \end{bmatrix} Fx=Φ=eAΔt,Fi= 0I000000I000000I000000I0
脉冲方差指定为:
i ∼ N ( 0 , Q i ) , Q i = [ σ a ~ 2 Δ t 2 I σ ω ~ 2 Δ t 2 I σ a w 2 Δ t I σ ω w 2 Δ t I ] i \sim N(0, Q_i), \quad Q_i = \begin{bmatrix} \sigma_{\tilde{a}}^2\Delta t^2 I & & & \\ & \sigma_{\tilde{\omega}}^2\Delta t^2 I & & \\ & & \sigma_{a_w}^2\Delta t I & \\ & & & \sigma_{\omega_w}^2\Delta t I \end{bmatrix} i∼N(0,Qi),Qi= σa~2Δt2Iσω~2Δt2Iσaw2ΔtIσωw2ΔtI
我们当然可以使用全状态扰动脉冲:
δ x n + 1 = F x ( x n , u m ) ⋅ δ x n + i \delta x_{n+1} = F_x(x_n, u_m) \cdot \delta x_n + i δxn+1=Fx(xn,um)⋅δxn+i
其中
i = [ 0 v i θ i a i ω i 0 ] , i ∼ N ( 0 , Q ) , Q = [ 0 σ a ~ 2 Δ t 2 I σ ω ~ 2 Δ t 2 I σ a w 2 Δ t I σ ω w 2 Δ t I 0 ] i = \begin{bmatrix} 0\\ v_i\\ \theta_i\\ a_i\\ \omega_i\\ 0 \end{bmatrix}, \quad i \sim N(0, Q), \quad Q = \begin{bmatrix} 0\\ \sigma_{\tilde{a}}^2\Delta t^2 I & & & \\ & \sigma_{\tilde{\omega}}^2\Delta t^2 I & & \\ & & \sigma_{a_w}^2\Delta t I & \\ & & & \sigma_{\omega_w}^2\Delta t I\\ & & & & 0 \end{bmatrix} i= 0viθiaiωi0 ,i∼N(0,Q),Q= 0σa~2Δt2Iσω~2Δt2Iσaw2ΔtIσωw2ΔtI0
【代码示例】
下面是一个使用Python的示例代码,说明如何在IMU积分中应用上述噪声和扰动脉冲的概念:
import numpy as np
def imu_predict(x_prev, P_prev, a_m, w_m, dt, Q_i):
"""使用噪声和扰动脉冲进行IMU预测步骤。
Args:
x_prev: 上一时刻的状态估计值,形状为(16,)。
P_prev: 上一时刻的状态协方差矩阵,形状为(15, 15)。
a_m: 当前加速度计测量值,形状为(3,)。
w_m: 当前陀螺仪测量值,形状为(3,)。
dt: 采样时间。
Q_i: 脉冲噪声协方差矩阵,形状为(12, 12)。
Returns:
x_pred: 当前时刻的状态预测值,形状为(16,)。
P_pred: 当前时刻的状态协方差预测值,形状为(15, 15)。
"""
# 提取状态变量
p, v, q, a_b, w_b, g = np.split(x_prev, [3, 6, 10, 13, 16])
# 标称状态积分
R = quat_to_rot(q)
a = R.dot(a_m - a_b) + g
w = w_m - w_b
p_pred = p + v*dt + 0.5*a*dt**2
v_pred = v + a*dt
q_pred = quat_multiply(q, vec_to_quat(w*dt))
# 误差状态转移矩阵
F_x = np.eye(15)
F_x[0:3, 3:6] = np.eye(3) * dt
F_x[3:6, 6:9] = -skew(a_m - a_b) * dt
F_x[3:6, 9:12] = -R * dt
F_x[3:6, 12:15] = np.eye(3) * dt
F_x[6:9, 6:9] = np.eye(3) - skew(w*dt)
# 脉冲噪声矩阵
F_i = np.zeros((15, 12))
F_i[3:6, 0:3] = np.eye(3)
F_i[6:9, 3:6] = np.eye(3)
F_i[9:12, 6:9] = np.eye(3)
F_i[12:15, 9:12] = np.eye(3)
# 误差状态协方差预测
P_pred = F_x.dot(P_prev).dot(F_x.T) + F_i.dot(Q_i).dot(F_i.T) * dt
# 组装预测状态向量
x_pred = np.concatenate([p_pred, v_pred, q_pred, a_b, w_b, g])
return x_pred, P_pred
这个函数实现了IMU误差状态系统的离散时间预测步骤。它接受上一时刻的状态估计值和协方差矩阵,当前IMU测量值,采样时间以及脉冲噪声协方差矩阵作为输入。
函数首先提取各个状态变量,并使用它们进行标称状态的积分。这里使用了简单的欧拉积分公式:
p k = p k − 1 + v k − 1 Δ t + 1 2 a k − 1 Δ t 2 v k = v k − 1 + a k − 1 Δ t q k = q k − 1 ⊗ [ cos ( 1 2 ∥ w k − 1 ∥ Δ t ) w k − 1 ∥ w k − 1 ∥ sin ( 1 2 ∥ w k − 1 ∥ Δ t ) ] \begin{aligned} \mathbf{p}_k &= \mathbf{p}_{k-1} + \mathbf{v}_{k-1} \Delta t + \frac{1}{2}\mathbf{a}_{k-1} \Delta t^2 \\ \mathbf{v}_k &= \mathbf{v}_{k-1} + \mathbf{a}_{k-1} \Delta t \\ \mathbf{q}_k &= \mathbf{q}_{k-1} \otimes \begin{bmatrix} \cos(\frac{1}{2}\|\mathbf{w}_{k-1}\|\Delta t) \\ \frac{\mathbf{w}_{k-1}}{\|\mathbf{w}_{k-1}\|} \sin(\frac{1}{2}\|\mathbf{w}_{k-1}\|\Delta t) \end{bmatrix} \end{aligned} pkvkqk=pk−1+vk−1Δt+21ak−1Δt2=vk−1+ak−1Δt=qk−1⊗[cos(21∥wk−1∥Δt)∥wk−1∥wk−1sin(21∥wk−1∥Δt)]
其中 a k − 1 = R k − 1 ( a m − a b ) + g \mathbf{a}_{k-1} = \mathbf{R}_{k-1}(\mathbf{a}_m - \mathbf{a}_b) + \mathbf{g} ak−1=Rk−1(am−ab)+g, w k − 1 = w m − w b \mathbf{w}_{k-1} = \mathbf{w}_m - \mathbf{w}_b wk−1=wm−wb,而 R k − 1 \mathbf{R}_{k-1} Rk−1是由四元数 q k − 1 \mathbf{q}_{k-1} qk−1表示的旋转矩阵。
然后,它计算误差状态转移矩阵 F x \mathbf{F}_x Fx:
F x = [ I 3 I 3 Δ t 0 0 0 0 0 I 3 − [ a m − a b ] × Δ t − R Δ t 0 I 3 Δ t 0 0 I 3 − [ w ] × Δ t 0 − I 3 Δ t 0 0 0 0 I 3 0 0 0 0 0 0 I 3 0 0 0 0 0 0 I 3 ] \mathbf{F}_x = \begin{bmatrix} \mathbf{I}_3 & \mathbf{I}_3\Delta t & \mathbf{0} & \mathbf{0} & \mathbf{0} & \mathbf{0} \\ \mathbf{0} & \mathbf{I}_3 & -[\mathbf{a}_m-\mathbf{a}_b]_\times\Delta t & -\mathbf{R}\Delta t & \mathbf{0} & \mathbf{I}_3\Delta t \\ \mathbf{0} & \mathbf{0} & \mathbf{I}_3-[\mathbf{w}]_\times\Delta t & \mathbf{0} & -\mathbf{I}_3\Delta t & \mathbf{0} \\ \mathbf{0} & \mathbf{0} & \mathbf{0} & \mathbf{I}_3 & \mathbf{0} & \mathbf{0} \\ \mathbf{0} & \mathbf{0} & \mathbf{0} & \mathbf{0} & \mathbf{I}_3 & \mathbf{0} \\ \mathbf{0} & \mathbf{0} & \mathbf{0} & \mathbf{0} & \mathbf{0} & \mathbf{I}_3 \end{bmatrix} Fx= I300000I3ΔtI300000−[am−ab]×ΔtI3−[w]×Δt0000−RΔt0I30000−I3Δt0I300I3Δt000I3
和脉冲噪声矩阵 F i \mathbf{F}_i Fi:
F i = [ 0 0 0 0 I 3 0 0 0 0 I 3 0 0 0 0 I 3 0 0 0 0 I 3 0 0 0 0 ] \mathbf{F}_i = \begin{bmatrix} \mathbf{0} & \mathbf{0} & \mathbf{0} & \mathbf{0}\\ \mathbf{I}_3 & \mathbf{0} & \mathbf{0} & \mathbf{0}\\ \mathbf{0} & \mathbf{I}_3 & \mathbf{0} & \mathbf{0}\\ \mathbf{0} & \mathbf{0} & \mathbf{I}_3 & \mathbf{0}\\ \mathbf{0} & \mathbf{0} & \mathbf{0} & \mathbf{I}_3\\ \mathbf{0} & \mathbf{0} & \mathbf{0} & \mathbf{0} \end{bmatrix} Fi= 0I3000000I3000000I3000000I30
最后,根据以下公式,使用 F x \mathbf{F}_x Fx, F i \mathbf{F}_i Fi和 Q i \mathbf{Q}_i Qi计算新的误差状态协方差矩阵:
P k = F x P k − 1 F x ⊤ + F i Q i F i ⊤ Δ t \mathbf{P}_k = \mathbf{F}_x \mathbf{P}_{k-1} \mathbf{F}_x^\top + \mathbf{F}_i \mathbf{Q}_i \mathbf{F}_i^\top \Delta t Pk=FxPk−1Fx⊤+FiQiFi⊤Δt
预测的状态向量通过组装标称状态积分和先前的偏差估计值来构建:
x ^ k = [ p k v k q k a b w b g ] \hat{\mathbf{x}}_k = \begin{bmatrix} \mathbf{p}_k \\ \mathbf{v}_k \\ \mathbf{q}_k \\ \mathbf{a}_b \\ \mathbf{w}_b \\ \mathbf{g} \end{bmatrix} x^k= pkvkqkabwbg
这个函数可以作为基于EKF的IMU积分器的一部分被调用。在每个IMU测量值到达时,它执行预测步骤,然后可以使用其他传感器数据(如GPS或视觉测量值)进行校正步骤。通过适当地建模IMU噪声和扰动的影响,这种方法可以提供准确和稳健的状态估计。
这里使用的是脉冲噪声模型,其中噪声被假设为离散时间脉冲。这通常是IMU噪声的一个很好的近似,因为IMU测量本身是在离散时间点上进行的。然而,对于其他类型的连续时间噪声,可能需要使用不同的积分方法。
总之,将随机噪声和扰动正确整合到状态估计框架中,对于获得准确和可靠的结果至关重要。通过仔细分析噪声的性质,并使用适当的数学工具对其进行建模,我们可以开发出强大的算法,即使在存在不确定性的情况下也能很好地工作。
Q&A 如何在离散时间状态估计框架(如卡尔曼滤波)中正确地处理连续时间噪声和扰动的问题
在许多实际系统中,状态的动力学是以连续时间的形式给出的,例如微分方程:
x ˙ = f ( x , u , w ) \dot{\mathbf{x}} = \mathbf{f}(\mathbf{x}, \mathbf{u}, \mathbf{w}) x˙=f(x,u,w)
其中 x \mathbf{x} x是状态向量, u \mathbf{u} u是控制输入, w \mathbf{w} w是过程噪声。然而,状态估计通常是在离散时间点上进行的,因为测量值只在特定的时刻可用。这就要求我们将连续时间的动力学方程转换为离散时间的形式:
x k + 1 = x k + ∫ t k t k + 1 f ( x ( τ ) , u ( τ ) , w ( τ ) ) d τ \mathbf{x}_{k+1} = \mathbf{x}_k + \int_{t_k}^{t_{k+1}} \mathbf{f}(\mathbf{x}(\tau), \mathbf{u}(\tau), \mathbf{w}(\tau)) d\tau xk+1=xk+∫tktk+1f(x(τ),u(τ),w(τ))dτ
问题在于,上述积分涉及随机过程 w ( τ ) \mathbf{w}(\tau) w(τ),它在不同时刻的值是相关的。因此,我们不能简单地将 w ( τ ) \mathbf{w}(\tau) w(τ)在积分区间内的均值作为离散时间噪声 w k \mathbf{w}_k wk。
这一部分的主要数学结论是:
-
对于控制输入 u \mathbf{u} u中的噪声 u ~ \tilde{\mathbf{u}} u~,由于它在每个采样时刻都被采样并在整个积分区间内保持不变,因此它可以像确定性输入一样被处理:
∫ t k t k + 1 B u ~ ( τ ) d τ = B Δ t ⋅ u ~ k \int_{t_k}^{t_{k+1}} \mathbf{B} \tilde{\mathbf{u}}(\tau) d\tau = \mathbf{B} \Delta t \cdot \tilde{\mathbf{u}}_k ∫tktk+1Bu~(τ)dτ=BΔt⋅u~k
其中 B \mathbf{B} B是控制矩阵, Δ t = t k + 1 − t k \Delta t = t_{k+1} - t_k Δt=tk+1−tk是采样间隔。
-
对于过程噪声 w \mathbf{w} w,由于它在整个积分区间内都是随机变化的,因此它必须在积分意义上进行处理。积分一个连续时间白噪声过程在时间间隔 Δ t \Delta t Δt上得到一个离散时间高斯随机变量:
w k = ∫ t k t k + 1 w ( τ ) d τ , w k ∼ N ( 0 , Q k ) , Q k = ∫ t k t k + 1 Q c ( τ ) d τ ≈ Q c Δ t \mathbf{w}_k = \int_{t_k}^{t_{k+1}} \mathbf{w}(\tau) d\tau, \quad \mathbf{w}_k \sim \mathcal{N}(\mathbf{0}, \mathbf{Q}_k), \quad \mathbf{Q}_k = \int_{t_k}^{t_{k+1}} \mathbf{Q}_c(\tau) d\tau \approx \mathbf{Q}_c \Delta t wk=∫tktk+1w(τ)dτ,wk∼N(0,Qk),Qk=∫tktk+1Qc(τ)dτ≈QcΔt
其中 Q c \mathbf{Q}_c Qc是连续时间噪声的功率谱密度矩阵。
基于这些结论,我们可以将含有噪声和扰动的连续时间状态方程:
δ x ˙ = A δ x + B u ~ + C w \delta\dot{\mathbf{x}} = \mathbf{A} \delta\mathbf{x} + \mathbf{B} \tilde{\mathbf{u}} + \mathbf{C} \mathbf{w} δx˙=Aδx+Bu~+Cw
转换为等价的离散时间方程:
δ x k + 1 = F x δ x k + F u u ~ k + F w w k \delta\mathbf{x}_{k+1} = \mathbf{F}_x \delta\mathbf{x}_k + \mathbf{F}_u \tilde{\mathbf{u}}_k + \mathbf{F}_w \mathbf{w}_k δxk+1=Fxδxk+Fuu~k+Fwwk
其中:
F x = e A Δ t , F u = B Δ t , F w = C \mathbf{F}_x = e^{\mathbf{A} \Delta t}, \quad \mathbf{F}_u = \mathbf{B} \Delta t, \quad \mathbf{F}_w = \mathbf{C} Fx=eAΔt,Fu=BΔt,Fw=C
这就是我们在IMU误差状态动力学推导中看到的形式。
让我们考虑一个简单的例子。假设我们有一个标量状态 x x x,它的动力学由下式给出:
x ˙ = a x + b u + w \dot{x} = ax + bu + w x˙=ax+bu+w
其中 a a a和 b b b是常数, u u u是控制输入, w w w是白噪声过程,其功率谱密度为 q c q_c qc。
根据上述结论,我们可以得到等价的离散时间状态方程:
x k + 1 = e a Δ t x k + b a ( e a Δ t − 1 ) u k + w k x_{k+1} = e^{a\Delta t} x_k + \frac{b}{a}(e^{a\Delta t}-1) u_k + w_k xk+1=eaΔtxk+ab(eaΔt−1)uk+wk
其中离散时间噪声 w k ∼ N ( 0 , q c Δ t ) w_k \sim \mathcal{N}(0, q_c\Delta t) wk∼N(0,qcΔt)。
在卡尔曼滤波的预测步骤中,我们需要计算状态的先验估计及其协方差:
x ^ k + 1 ∣ k = e a Δ t x ^ k ∣ k + b a ( e a Δ t − 1 ) u k \hat{x}_{k+1|k} = e^{a\Delta t} \hat{x}_{k|k} + \frac{b}{a}(e^{a\Delta t}-1) u_k x^k+1∣k=eaΔtx^k∣k+ab(eaΔt−1)uk
P k + 1 ∣ k = e a Δ t P k ∣ k e a Δ t + q c Δ t P_{k+1|k} = e^{a\Delta t} P_{k|k} e^{a\Delta t} + q_c\Delta t Pk+1∣k=eaΔtPk∣keaΔt+qcΔt
可以看到,离散时间噪声的协方差 q c Δ t q_c\Delta t qcΔt直接加到了状态协方差的更新公式中。这正是由于我们正确地处理了连续时间噪声的积分。
总之,"随机噪声和扰动的积分"这一部分提供了一个理论基础,让我们能够在离散时间状态估计器中正确地处理连续时间噪声。这对于许多实际系统来说是非常重要的,因为忽略或错误处理噪声的积分会导致次优的估计性能。IMU误差状态卡尔曼滤波就是一个典型的例子,它需要在离散时间框架内处理陀螺仪和加速度计的连续时间噪声。