kalman滤波的相关理解及MATLAB程序注解

时光怂恿深爱的人放手 提交于 2020-04-01 16:02:32

以下介绍部分乃网络资料,程序注释和优化乃自己原创: 

Dr Kalman 的卡尔曼滤波器。下面的描述,会涉及一些基本的概念知识,包括概率(Probability),随机变量(Random Variable),高斯或正态分配(Gaussian Distribution)还有State-space Model等等。但对于卡尔曼滤波器的详细证明,这里不能一一描述。

  首先,我们先要引入一个离散控制过程的系统。该系统可用一个线性随机微分方程(Linear Stochastic Difference equation)来描述:
  X(k)=A X(k-1)+B U(k)+W(k)
  再加上系统的测量值:
  Z(k)=H X(k)+V(k)
  上两式子中,X(k)是k时刻的系统状态,U(k)是k时刻对系统的控制量。A和B是系统参数,对于多模型系统,他们为矩阵。Z(k)是k时刻的测量值,H是测量系统的参数,对于多测量系统,H为矩阵。W(k)和V(k)分别表示过程和测量的噪声。他们被假设成高斯白噪声(White Gaussian Noise),他们的COVariance 分别是Q,R(这里我们假设他们不随系统状态变化而变化)。
  对于满足上面的条件(线性随机微分系统,过程和测量都是高斯白噪声),卡尔曼滤波器是最优的信息处理器。下面我们来用他们结合他们的covariances 来估算系统的最优化输出(类似上一节那个温度的例子)。
  首先我们要利用系统的过程模型,来预测下一状态的系统。假设现在的系统状态是k,根据系统的模型,可以基于系统的上一状态而预测出现在状态:
  X(k|k-1)=A X(k-1|k-1)+B U(k) ……….. (1)
  式(1)中,X(k|k-1)是利用上一状态预测的结果,X(k-1|k-1)是上一状态最优的结果,U(k)为现在状态的控制量,如果没有控制量,它可以为0。
  到现在为止,我们的系统结果已经更新了,可是,对应于X(k|k-1)的covariance还没更新。我们用P表示covariance:
  P(k|k-1)=A P(k-1|k-1) A’+Q ……… (2)
  式(2)中,P(k|k-1)是X(k|k-1)对应的covariance,P(k-1|k-1)是X(k-1|k-1)对应的covariance,A’表示A的转置矩阵,Q是系统过程的covariance。式子1,2就是卡尔曼滤波器5个公式当中的前两个,也就是对系统的预测。
  现在我们有了现在状态的预测结果,然后我们再收集现在状态的测量值。结合预测值和测量值,我们可以得到现在状态(k)的最优化估算值X(k|k):
  X(k|k)= X(k|k-1)+Kg(k) (Z(k)-H X(k|k-1)) ……… (3)
  其中Kg为卡尔曼增益(Kalman Gain):
  Kg(k)= P(k|k-1) H’ / (H P(k|k-1) H’ + R) ……… (4)
  到现在为止,我们已经得到了k状态下最优的估算值X(k|k)。但是为了要另卡尔曼滤波器不断的运行下去直到系统过程结束,我们还要更新k状态下X(k|k)的covariance:
  P(k|k)=(I-Kg(k) H)P(k|k-1) ……… (5)

  其中I 为1的矩阵,对于单模型单测量,I=1。当系统进入k+1状态时,P(k|k)就是式子(2)的P(k-1|k-1)。这样,算法就可以自回归的运算下去。

clear all;
N=200;
w(1)=0;
w=randn(1,N);%模拟产生过程噪声
x(1)=0;
A=1;
%根据系统的模型,可以基于系统的上一状态而预
%测出现在状态:
%  X(k|k-1)=A*X(k-1|k-1)+B U(k)
%           X(k-1|k-1)是上一状态最优的结果,U(k)为现在状态的控制量
for k=2:N;
    %预测出现在状态
    x(k)=A*x(k-1)+w(k-1);%计算U(k)=0时,状态方程的值
end
V=randn(1,N);%模拟产生测量噪声

R=std(V)^2;%V(k)的covariance
Q=std(w)^2;%W(k)的covariance  
H=0.2;%

%w(k)和V(k)分别表示过程和测量的噪声
Z=H*x+V;%Z(k)是k时刻的测量值


p(1)=10;
s(1)=1;
for t=2:N;
    p(t)=A*p(t-1)+Q;%A=1
    %于X(k|k-1)的covariance还没更新。我们用P(t)表示covariance
    %Q是系统过程的covariance
    
    Kg(t)=H*p(t)/(H.^2*p(t)+R);%计算Kg 卡尔曼增益
    
    %结合预测值和测量值,我们可以得到现在状态(k)的最优化估算
    %值X(k|k):此处用s(t)表示
    s(t)=A*s(t-1)+Kg(t)*(Z(t)-A*H*s(t-1));%最优化估算值X(k|k):
    
    %已经得到了k状态下最优的估算值X(k|k)。但是为了要令卡尔曼滤
    %波器不断的运行下去直到系统过程结束还要更新k状态下X(k|k)的
    %covariance:
    p(t)=p(t)-H*Kg(t)*p(t);%P(k|k)=(I-Kg(k)*H)*P(k|k-1),此处I等于1
end

%红色线最优化估算结果滤波后的值,
%绿色线测量值,蓝色线预测值
t=1:N;
plot(t,s,'r',t,Z,'g',t,x,'b');



易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!