控制原理 | 详细总结卡尔曼滤波原理+具体案例分析

本文详细介绍了卡尔曼滤波的原理,包括状态观测器、状态滤波器和卡尔曼滤波器。通过船舶GPS定位的具体案例,展示了卡尔曼滤波在实际问题中的应用。文章还探讨了噪声对滤波效果的影响,并提供了相关工程代码。
摘要由CSDN通过智能技术生成

0 专栏介绍

🔥附C++/Python/Matlab全套代码🔥课程设计、毕业设计、创新竞赛必备!详细介绍全局规划(图搜索、采样法、智能算法等);局部规划(DWA、APF等);曲线优化(贝塞尔曲线、B样条曲线等)。

🚀详情:图解自动驾驶中的运动规划(Motion Planning),附几十种规划算法


1 状态观测器

在工程上,部分状态参数测量的成本过高,或是用现有仪器无法测得,此时需要引入状态观测器。状态观测器以原系统输入、输出为输入,输出估计的状态变量。

原系统状态描述:
{ x k = A x k − 1 + B u k − 1 y k = C x k \begin{cases} x_k=Ax_{k-1}+Bu_{k-1}\\ y_k=Cx_k\\\end{cases} {xk=Axk1+Buk1yk=Cxk

状态观测器状态描述:
{ x ~ k = A x ~ k − 1 + B u k − 1 + f [ y k − 1 − y ~ k − 1 ] y ~ k = C x ~ k \begin{cases} \tilde{x}_k=A\tilde{x}_{k-1}+Bu_{k-1}+f\left[ y_{k-1}-\tilde{y}_{k-1} \right]\\ \tilde{y}_k=C\tilde{x}_k\\\end{cases} {x~k=Ax~k1+Buk1+f[yk1y~k1]y~k=Cx~k

定义误差向量 e k = x k − x ~ k e_k=x_k-\tilde{x}_k ek=xkx~k,则两系统状态方程相减得

系统误差传递方程 e k = ( A − f C ) e k − 1 系统误差传递方程e_k=\left( A-fC \right) e_{k-1} 系统误差传递方程ek=(AfC)ek1

其通解为矩阵指数函数,所以当 A − f C A-fC AfC特征值小于0时,误差向量 e k e_k ek各分量均趋于0,即状态观测器能直接估计原系统状态。

本质上,状态观测器是针对状态空间方程描述的确定系统,从错误的系统状态估计值不断收敛到正确的系统状态估计值的数学模型

2 状态滤波器

实际的系统往往是随机过程,状态描述为:

{ x k = A x k − 1 + B u k − 1 + w k − 1 y k = C x k + v k \begin{cases} x_k=Ax_{k-1}+Bu_{k-1}+w_{k-1}\\ y_k=Cx_k+v_k\\\end{cases} {xk=Axk1+Buk1+wk1yk=Cxk+vk

其中 w k w_k wk称为过程噪声,主要由系统运行过程中的外力导致,如旋翼飞行器运动过程中受到的阵风; v k v_k vk称为测量噪声,主要由系统测量过程中测量仪器误差、精度不足导致。

本质上,状态滤波器是针对随机状态空间方程描述的随机系统,从不确定观测中提取信息,得到系统状态最优估计的数学模型。当 w k w_k wk v k v_k vk为高斯白噪声且相互独立时,状态滤波器为卡尔曼滤波器

状态滤波器的核心是通过贝叶斯原理不断调整滤波器增益矩阵,以减小随机干扰,使估计的系统状态趋近于真实状态;而状态观测器的核心是通过极点配置确定观测器增益矩阵,使估计的状态跟踪当前系统的状态。

一般地,状态滤波器性能优于状态观测器,但在实际系统中,若随机噪声非高斯噪声,或有若干非线性环节,按常规噪声模型建立的状态滤波器可能发散,此时则更需要状态观测器的稳定性。

3 卡尔曼滤波器

考虑一个随机系统:

{ x k = A x k − 1 + B u k − 1 + w k − 1 z k = C x k + v k \begin{cases} x_k=Ax_{k-1}+Bu_{k-1}+w_{k-1}\\ z_k=Cx_k+v_k\\\end{cases} {xk=Axk1+Buk1+wk1zk=Cxk+vk

其中 w k   N ( 0 , Q ) w_k~N\left( 0, Q \right) wk N(0,Q) v k   N ( 0 , R ) v_k~N\left( 0, R \right) vk N(0,R),且 w k w_k wk v k v_k vk相互独立。

忽略噪声可建立该系统的先验数学模型(噪声仅满足随机分布,无法建模):

状态预测方程 { x ^ k − = A x ^ k − 1 + B u k − 1 z ^ k − = C x ^ k {\text{状态预测方程}\begin{cases} \hat{x}_{k}^{-}=A\hat{x}_{k-1}+Bu_{k-1}\\ \hat{z}_{k}^{-}=C\hat{x}_k\\\end{cases}} 状态预测方程{x^k=Ax^k1+Buk1z^k=Cx^k

基于上述系统,从贝叶斯方法引出卡尔曼滤波器状态更新方程:

状态更新方程 : x ^ k = x ^ k − + K k ( z k − z ^ k − ) {\text{状态更新方程}: \hat{x}_k=\hat{x}_{k}^{-}+K_k\left( z_k-\hat{z}_{k}^{-} \right) } 状态更新方程:x^k=x^k+Kk(zkz^k)

其中 x ^ k \hat{x}_k x^k是后验状态估计,即经过一次修正后,当前系统状态的最优估计值; x ^ k − \hat{x}_{k}^{-} x^k为系统状态的先验估计; z k z_k zk为当前状态的测量样本值; z ^ k − \hat{z}_{k}^{-} z^k为当前状态的先验测量值; z k − z ^ k − z_k-\hat{z}_{k}^{-} zkz^k代表实际系统与估计系统间随机误差的影响; K k K_k Kk权衡先验模型与实测数据间对后验分布的关系,称为卡尔曼增益,显然, z k − z ^ k − z_k-\hat{z}_{k}^{-} zkz^k越小表明实际与预测越接近,则后验分布越趋近于先验分布, z k − z ^ k − z_k-\hat{z}_{k}^{-} zkz^k越大表明预测越不可信,需要通过实测来大幅修正先验分布。

下面要确定 K k K_k Kk使后验模型的修正效果最佳,即 x ^ k \hat{x}_k x^k越接近真实值 x k {x}_k xk。定义误差向量

{ 后验误差向量 e k = x k − x ^ k 先验误差向量 e k − = x k − x ^ k − \begin{cases} \text{后验误差向量}e_k=x_k-\hat{x}_k\\ \text{先验误差向量}e_{k}^{-}=x_k-\hat{x}_{k}^{-}\\\end{cases} {后验误差向量ek=xkx^k先验误差向量ek=xkx^k

定义后验误差协方差矩阵为:

P k = E ( e k e k T ) = [ σ e 1 2 σ e 1 σ e 2 ⋯ σ e 1 σ e n σ e 2 σ e 1 σ e 2 2 ⋯ σ e 2 σ e n ⋮ ⋮ ⋱ ⋮ σ e n σ e 1 σ e n σ e 2 ⋯ σ e n 2 ] P_k=E\left( e_ke_{k}^{T} \right) =\left[ \begin{matrix} \sigma _{e1}^{2}& \sigma _{e1}\sigma _{e2}& \cdots& \sigma _{e1}\sigma _{en}\\ \sigma _{e2}\sigma _{e1}& \sigma _{e2}^{2}& \cdots& \sigma _{e2}\sigma _{en}\\ \vdots& \vdots& \ddots& \vdots\\ \sigma _{en}\sigma _{e1}& \sigma _{en}\sigma _{e2}& \cdots& \sigma _{en}^{2}\\\end{matrix} \right] Pk=E(ekekT)= σe12σe2σe1σenσe1σe1σe2σe22σenσe2σe1σenσe2σenσen2

同理也有先验误差协方差矩阵 P k − P_{k}^{-} Pk。根据最小方差估计原理,设损失函数为 t r ( P k ) \mathrm{tr}\left( P_k \right) tr(Pk),即要求

K k = a r g min ⁡ [ t r ( P k ) ] K_k=\mathrm{arg}\min \left[ \mathrm{tr}\left( P_k \right) \right] Kk=argmin[tr(Pk)]

P k P_k Pk展开为:
在这里插入图片描述
上面运用了状态更新方程与状态预测方程,考虑到 e k − e_{k}^{-} ek v k v_k vk相互独立,则进一步:

P k = ( I − K k C ) E ( e k − e k − T ) ( I − K k C ) T + K k E ( v k v k T ) K k T = ( I − K k C ) P k − ( I − K k C ) T + K k R K k T \begin{aligned}P_k&=\left( I-K_kC \right) E\left( e_{k}^{-}{e_{k}^{-}}^T \right) \left( I-K_kC \right) ^T+K_kE\left( v_kv_{k}^{T} \right) K_{k}^{T}\\&=\left( I-K_kC \right) P_{k}^{-}\left( I-K_kC \right) ^T+K_kRK_{k}^{T}\end{aligned} Pk=(IKkC)E(ekekT)(IKkC)T+KkE(vkvkT)KkT=(IKkC)Pk(IKkC)T+KkRKkT

∂ t r ( P k ) ∂ K k = 0 \frac{\partial \mathrm{tr}\left( P_k \right)}{\partial K_k}=0 Kktr(Pk)=0,即

卡尔曼增益调整方程 K k = P k − C T C P k − C T + R {\text{卡尔曼增益调整方程}K_k=\frac{P_{k}^{-}C^T}{CP_{k}^{-}C^T+R}} 卡尔曼增益调整方程Kk=CPkCT+RPkCT

K k K_k Kk代入后验误差协方差矩阵表达式,即得

协方差更新方程 P k = ( I − K k H ) P k − {\text{协方差更新方程}P_k=\left( I-K_kH \right) P_{k}^{-}} 协方差更新方程Pk=(IKkH)Pk

要更新 K k K_k Kk,则只需要确定先验误差协方差矩阵 P k − P_{k}^{-} Pk。同样地,将 P k − P_{k}^{-} Pk展开为

P k − = E ( e k − e k − T ) = E [ ( x k − x ^ k − ) ( x k − x ^ k − ) T ] = E [ ( A e k − 1 + w k − 1 ) ( A e k − 1 + w k − 1 ) T ] = A E ( e k − 1 e k − 1 T ) A T + E ( w k − 1 w k − 1 T ) \begin{aligned}P_{k}^{-}&=E\left( e_{k}^{-}e_{k}^{-T} \right) \\&=E\left[ \left( x_k-\hat{x}_{k}^{-} \right) \left( x_k-\hat{x}_{k}^{-} \right) ^T \right] \\&=E\left[ \left( Ae_{k-1}+w_{k-1} \right) \left( Ae_{k-1}+w_{k-1} \right) ^T \right] \\&=AE\left( e_{k-1}e_{k-1}^{T} \right) A^T+E\left( w_{k-1}w_{k-1}^{T} \right)\end{aligned} Pk=E(ekekT)=E[(xkx^k)(xkx^k)T]=E[(Aek1+wk1)(Aek1+wk1)T]=AE(ek1ek1T)AT+E(wk1wk1T)

考虑到 e k e_k ek w k w_k wk相互独立,进一步得到

协方差预测方程 P k − = A P k − 1 A T + Q {\text{协方差预测方程}P_{k}^{-}=AP_{k-1}A^T+Q} 协方差预测方程Pk=APk1AT+Q

至此,得到卡尔曼滤波的五大基本公式,其中核心方程为基于最小方差估计的卡尔曼增益调整方程,具体工作流程如图所示。

在这里插入图片描述

4 具体案例:船舶GPS定位

有一船舶出港沿某直线方向航行,辅助北斗卫星进行定位和测速。假设
① 船舶加速度 a ( t ) a\left( t \right) a(t)=机动加速度 u ( t ) u\left( t \right) u(t)+随机加速度 w ( t ) w\left( t \right) w(t),其中 w ( t ) w\left( t \right) w(t)符合高斯分布;
② GPS观测噪声 v ( t ) v\left( t \right) v(t)符合高斯分布。
要求用卡尔曼滤波器估计真实运动轨迹。

解决方案

首先建立随机系统的真实模型。以码头出发点为原点,采样周期(雷达扫描周期)为 T T T,用 s ( k ) s(k) s(k)表示船舶在采样时刻 k T kT kT处的真实位置,用 z ( k ) z\left( k \right) z(k)表示在时刻 k T kT kT处的GPS定位观测值,则真实系统输出方程为 z ( k ) = s ( k ) + v ( k ) z(k)=s(k)+v(k) z(k)=s(k)+v(k)

记在 k T kT kT时刻处船舶速 s ˙ ( k ) \dot{s}\left( k \right) s˙(k),加速度为 a ( k ) a\left( k \right) a(k),由匀加速公式有:

s ( k + 1 ) = s ( k ) + s ˙ ( k ) T + 1 2 a ( k ) T 2 ⇒ s ˙ ( k + 1 ) = s ˙ ( k ) + T a ( k ) s\left( k+1 \right) =s\left( k \right) +ṡ\left( k \right) T+\frac{1}{2}a\left( k \right) T^2\\\Rightarrow \dot{s}\left( k+1 \right) =ṡ\left( k \right) +Ta\left( k \right) s(k+1)=s(k)+s˙(k)T+21a(k)T2s˙(k+1)=s˙(k)+Ta(k)

其中 a ( k ) = u ( k ) + w ( k ) a(k)=u(k)+w(k) a(k)=u(k)+w(k)

定义在采样时刻 k T kT kT系统状态 x ( k ) x\left( k \right) x(k)为船舶的位置和速度,即 x ( k ) = [ s ( k ) s ˙ ( k ) ] T x(k)=\left[ \begin{matrix} s(k)& \dot{s}(k)\\\end{matrix} \right] ^T x(k)=[s(k)s˙(k)]T可得到船舶运动的状态空间模型

{ [ s ( k + 1 ) s ˙ ( k + 1 ) ] = [ 1 T 0 1 ] [ s ( k ) s ˙ ( k ) ] + [ 0.5 T T ] u ( k ) + [ 0.5 T T ] w ( k ) z ( k ) = [ 1 0 ] [ s ( k ) s ˙ ( k ) ] + v ( k ) \begin{cases} \left[ \begin{array}{c} s(k+1)\\ \dot{s}(k+1)\\\end{array} \right] =\left[ \begin{matrix} 1& T\\ 0& 1\\\end{matrix} \right] \left[ \begin{array}{c} s(k)\\ \dot{s}(k)\\\end{array} \right] +\left[ \begin{array}{c} 0.5T\\ T\\\end{array} \right] u(k)+\left[ \begin{array}{c} 0.5T\\ T\\\end{array} \right] w(k)\\ z(k)=\left[ \begin{matrix} 1& 0\\\end{matrix} \right] \left[ \begin{array}{c} s(k)\\ \dot{s}(k)\\\end{array} \right] +v(k)\\\end{cases} [s(k+1)s˙(k+1)]=[10T1][s(k)s˙(k)]+[0.5TT]u(k)+[0.5TT]w(k)z(k)=[10][s(k)s˙(k)]+v(k)

在不考虑机动目标的动力因素即 u ( k ) = 0 u(k)=0 u(k)=0时,将匀速直线运动的船舶系统扩展到四维,状态包含水平和纵向的位置和速度,则系统方程可化为

[ x ( k ) x ˙ ( k ) y ( k ) y ˙ ( k ) ] = [ 1 T 0 0 0 1 0 0 0 0 1 T 0 0 0 1 ] [ x ( k − 1 ) x ˙ ( k − 1 ) y ( k − 1 ) y ˙ ( k − 1 ) ] + [ 0.5 T 2 T 0.5 T 2 T ] [ w 1 ( k ) w 2 ( k ) w 3 ( k ) w 4 ( k ) ] z ( k ) = [ 1 0 0 0 0 0 1 0 ] [ x ( k ) x ˙ ( k ) y ( k ) y ˙ ( k ) ] + [ v 1 ( k ) v 2 ( k ) ] \left[ \begin{array}{c} x(k)\\ \dot{x}(k)\\ y(k)\\ \dot{y}(k)\\\end{array} \right] =\left[ \begin{matrix} 1& T& 0& 0\\ 0& 1& 0& 0\\ 0& 0& 1& T\\ 0& 0& 0& 1\\\end{matrix} \right] \left[ \begin{array}{c} x(k-1)\\ \dot{x}(k-1)\\ y(k-1)\\ \dot{y}(k-1)\\\end{array} \right] +\left[ \begin{matrix} 0.5T^2& & & \\ & T& & \\ & & 0.5T^2& \\ & & & T\\\end{matrix} \right] \left[ \begin{array}{c} w_1\left( k \right)\\ w_2\left( k \right)\\ w_3\left( k \right)\\ w_4\left( k \right)\\\end{array} \right] \\z(k)=\left[ \begin{matrix} 1& 0& 0& 0\\ 0& 0& 1& 0\\\end{matrix} \right] \left[ \begin{array}{c} x(k)\\ \dot{x}(k)\\ y(k)\\ \dot{y}(k)\\\end{array} \right] +\left[ \begin{array}{c} v_1\left( k \right)\\ v_2\left( k \right)\\\end{array} \right] x(k)x˙(k)y(k)y˙(k) = 1000T100001000T1 x(k1)x˙(k1)y(k1)y˙(k1) + 0.5T2T0.5T2T w1(k)w2(k)w3(k)w4(k) z(k)=[10000100] x(k)x˙(k)y(k)y˙(k) +[v1(k)v2(k)]

现假设初始位置为(-100m,200m),水平运动初速度为2m/s,垂直运动初速度为20m/s,雷达扫描周期 T = 1 s T=1s T=1s,则系统状态空间进一步化为

{ x ( k + 1 ) = A x ( k ) + B u ( k ) + Γ w ( k ) z ( k ) = H x ( k ) + v ( k ) \begin{cases} x(k+1)=Ax(k)+Bu(k)+\varGamma w(k)\\ z(k)=Hx(k)+v(k)\\\end{cases} {x(k+1)=Ax(k)+Bu(k)+Γw(k)z(k)=Hx(k)+v(k)

其中 A = [ 1 1 0 0 0 1 0 0 0 0 1 1 0 0 0 1 ] A=\left[ \begin{matrix} 1& 1& 0& 0\\ 0& 1& 0& 0\\ 0& 0& 1& 1\\ 0& 0& 0& 1\\\end{matrix} \right] A= 1000110000100011 B = Γ = [ 0.5 1 0.5 1 ] B=\varGamma =\left[ \begin{matrix} 0.5& & & \\ & 1& & \\ & & 0.5& \\ & & & 1\\\end{matrix} \right] B=Γ= 0.510.51 , H = [ 1 0 0 0 0 0 1 0 ] H=\left[ \begin{matrix} 1& 0& 0& 0\\ 0& 0& 1& 0\\\end{matrix} \right] H=[10000100]

设过程噪声 w ∼ N ( 0 , 0. 1 2 ) w\sim N(0,0.1^2) wN(0,0.12),其四个分量独立同分布,则

Q ∗ = E ( w 4 × 1 w 4 × 1 T ) = σ w 2 [ 1 1 1 1 ] Q^*=E(w_{4\times 1}w_{4\times 1}^{T})=\sigma _{w}^{2}\left[ \begin{matrix} 1& & & \\ & 1& & \\ & & 1& \\ & & & 1\\\end{matrix} \right] Q=E(w4×1w4×1T)=σw2 1111

考虑噪声矩阵 Γ \varGamma Γ的加权得到过程噪声协方差矩阵

Q = Q ∗ ⋅ Γ = σ w 2 [ 0.5 1 0.5 1 ] Q=Q^*\cdot \varGamma =\sigma _{w}^{2}\left[ \begin{matrix} 0.5& & & \\ & 1& & \\ & & 0.5& \\ & & & 1\\\end{matrix} \right] Q=QΓ=σw2 0.510.51

观测噪声 v ∼ N ( 0 , 1 0 2 ) v\sim N(0,10^2) vN(0,102),其两个分量独立同分布,则观测噪声协方差矩阵

R = σ v 2 [ 1 1 ] R=\sigma _{v}^{2}\left[ \begin{matrix} 1& \\ & 1\\\end{matrix} \right] R=σv2[11]

依此建立卡尔曼滤波器模型。

设置最优估计初值 x ^ ( 1 ) = [ − 100 2 − 200 20 ] T \hat{x}(1)=\left[ \begin{matrix} -100& 2& -200& 20\\\end{matrix} \right] ^T x^(1)=[100220020]T、先验协方差矩阵 P 1 − = [ 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 ] P_{1}^{-}=\left[ \begin{matrix} 1& 0& 0& 0\\ 0& 1& 0& 0\\ 0& 0& 1& 0\\ 0& 0& 0& 1\\\end{matrix} \right] P1= 1000010000100001 ,并以此开始迭代,得到实验图像如图所示。

在这里插入图片描述

在使用卡尔曼滤波器时,应至少保证系统模型或系统测量至少一个有足够的精度,否则卡尔曼滤波器无法从中提取到正确的估计信息。这是因为卡尔曼滤波调整的是对先验模型值与仪器测量值间的信任权重,若二者都不准确则卡尔曼跟踪的数值亦不准确。为验证这一结论,下面保持测量噪声不变,调整过程噪声方差,如图所示。

在这里插入图片描述
本文的完整工程代码请通过下方名片联系我获取


🔥 更多精彩专栏


👇源码获取 · 技术交流 · 抱团学习 · 咨询分享 请联系👇
卡尔曼滤波是一种用于状态估计的算法,可以用于估计系统状态的变化,同时考虑系统的噪声和不确定性。其基本思想是通过将先验估计和测量结果进行加权平均,来得到一个更准确的估计值,从而实现对系统状态的估计和预测。在实际应用中,卡尔曼滤波广泛应用于信号处理、控制工程、导航系统等领域。 下面是一个简单的用 MATLAB 实现的卡尔曼滤波算法示例: ```matlab % 系统模型 A = [1 1; 0 1]; B = [0.5; 1]; C = [1 0]; % 状态和测量噪声协方差矩阵 Q = [0.01 0; 0 0.01]; R = 1; % 初始状态估计和协方差矩阵 x0 = [0; 0]; P0 = [1 0; 0 1]; % 生成随机信号 N = 100; w = sqrt(Q) * randn(2, N); v = sqrt(R) * randn(1, N); % 初始化变量 x_est = x0; P_est = P0; x_pred = zeros(2, N); P_pred = zeros(2, 2, N); % 卡尔曼滤波 for k = 1:N % 预测 x_pred(:, k) = A * x_est + B * w(:, k); P_pred(:, :, k) = A * P_est * A' + Q; % 更新 K = P_pred(:, :, k) * C' / (C * P_pred(:, :, k) * C' + R); x_est = x_pred(:, k) + K * (v(k) - C * x_pred(:, k)); P_est = (eye(2) - K * C) * P_pred(:, :, k); end % 绘图 t = 1:N; figure; plot(t, x_pred(1, :), '--', t, x_est(1, :), '-', t, v, '-.'); legend('预测', '估计', '测量'); xlabel('时间'); ylabel('状态'); ``` 上面的代码演示了一个简单的线性系统状态估计问题。其中,系统模型由状态转移矩阵 A 和输入矩阵 B 定义,测量矩阵 C 为单位矩阵。状态和测量噪声协方差矩阵 Q 和 R 分别为 0.01 和 1。初始状态估计和协方差矩阵分别为 [0; 0] 和单位矩阵。随机信号通过 randn 函数生成,最终结果通过 plot 函数绘制。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr.Winter`

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值