Kalman滤波MATLAB综合实验报告

  • 格式:doc
  • 大小:190.50 KB
  • 文档页数:10

下载文档原格式

  / 10
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

《数学实验》综合实验报告实验名称综合实验(Kalman滤波)

2016年 5月

一、【实验目的】

明白滤波计算流程

能够调用相关函数进行数据处理

使用循环函数和二维曲线画图

有效的构建仿真模型,产生模拟数据

二、【实验原理分析】

卡尔曼滤波器是一个“optimal recursive data processing algorithm(最优化自回归数据处理算法)”。对于解决很大部分的问题,它是最优,效率最高甚至是最有用的。它的广泛应用已经超过30年,包括机器人导航,控制,传感器数据融合甚至在军事方面的雷达系统以及导弹追踪等等。近来更被应用于计算机图像处理,例如头脸识别,图像分割,图像边缘检测等等。

设系统可用一个线性随机微分方程来描述:

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)分别表示过程和测量的噪声。他们被假设成高斯白噪声,他们的协方差分别是Q,R(这里假设他们不随系统状态变化而变化)。

对于满足上面的条件(线性随机微分系统,过程和测量都是高斯白噪声),卡尔曼滤波器是最优的信息处理器。首先要利用系统的过程模型,来预测下一状态的系统。假设现在的系统状态是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)的协方差还没更新。我们用P表示协方差:

P(k|k-1)=A P(k-1|k-1) A’+Q (2)

式(2)中,P(k|k-1)是X(k|k-1)对应的协方差,P(k-1|k-1)是X(k-1|k-1)对应的协方差,A’表示A的转置矩阵,Q是系统过程的协方差。式子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)的协方差:

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)。这样,算法就可以自回归的运算下去。、

MA TLAB中已经给出了滤波函数,以下为直接调用方法:

设线性系统为

其调用格式为

[ kest, L, P]=kalman (sys, Qn, Rn, Nn)

[ kest, L, P]=kalman(sys, Qn, Rn, Nn, sensors, known)

[kest,L,P,M,Z]=kalman(sys,Qn,Rn,Nn)

最后一种调用格式只限于离散系统。

三、【实验内容及数据来源】

已知离散系统

第一式为系统方程,第二式为观测方程,表示状态量x的第二个分量。e与v是互不相关的高斯白噪声。

假设的真值,由此系统方程构造出k=1,2,…30的数据,构造时加上系统噪声干扰,再由

观测方程构造出观测数据并加观测噪声干扰,并以此作为仿真数据。用Kalman滤波对仿真数据进行滤波处理,并与真实结果比较。

四、【实验程序】

%%%%%%%系统描述

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % x[n+1]=Ax[n]+Bu[n]+Gw[n]

% y[n]=Cx[n]+Du[n]+Hw[n]+v[n]

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 状态转移矩阵

A=[0.49 0.298 0.412

0.401 -0.391 0.391

-0.992 0.401 0.296];

% B矩阵

B=zeros(3,3);

% G矩阵

G=eye(3,3);

% C矩阵向量

C=[0 1 0];

D=[0 0 0];

H=zeros(1,3);

% 状态向量初值(真值)

x(:,1)=[10.9 8.481 -4.3]';

% 状态向量初始估计值

guji=[20.1 21.3 20.7]';

% 进入循环

for i=2:30

%c产生正态分布数据

w=randn(3,1);

v=randn(1,1);

%真实数据

x(:,i)=A*x(:,i-1);

%人为制造系统误差

x1(:,i)=x(:,i)+w;

Qn=eye(2,2);

Rn=1;

Nn=0;

%人为制造观测数据的误差

z0(:,i)=C*x1(:,i)+v;

%建立Kalman的系统参数

sys=ss(A,[B,G],C,[D,H],-1);

[kest,L,P,M,Z]=kalman(sys,Qn,Rn,Nn);

%得到估计数据

guji(:,i)=A*guji(:,i-1)+L*(z0(:,i)-C*A*guji(:,i-1)); end

subplot(2,2,1)

% 做出真值曲线 x1

plot(x(1,:))

hold on

% 做出在噪声污染情况下的滤波估计值曲线 x1

plot(guji(1,:),':m')

hold off

legend('real of x1','estimate of x1')

grid

subplot(2,2,2)

% 做出真值曲线 x2

plot(x(2,:))

hold on

% 做出在噪声污染情况下的滤波估计值曲线 x2

plot(guji(2,:),':m')