zoukankan      html  css  js  c++  java
  • kalman滤波的相关理解及MATLAB程序注解

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

    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');



  • 相关阅读:
    Html5响应式设计与实现广场
    hdu 4911 Inversion
    LAN远程重启server安全方法
    华丽的网上突出代码组件CodeMirror
    Edit Distance -- LeetCode
    FPGA合成编码
    SenchaTouch2.3.1 正在使用listpaging以及pullrefresh插入 分页演示样品做
    【白云观导引头】一首诗
    初步boost之pool图书馆学习笔记
    分段的作用
  • 原文地址:https://www.cnblogs.com/siahekai/p/5840338.html
Copyright © 2011-2022 走看看