主要内容

卡尔曼滤波器设计

此示例显示如何执行Kalman筛选。下面设计和模拟了稳态滤波器和时变滤波器。

问题描述

鉴于以下离散植物

$$ x(n + 1)= ax(n)+ bu(n)+ bw(n)$$

$$ y(n)= cx(n)+ du(n)$$

在哪里

a = [1.1269 -0.4940 0.1129,1.0000 0 0,0 1.0000 0];B = [-0.3832 0.5919 0.5191];c = [1 0 0];d = 0;

设计卡尔曼滤波器以根据噪声测量yv [n] = c x [n] + v [n]来估计输出y

稳态卡尔曼滤波器设计

您可以使用函数kalman设计稳态卡尔曼滤波器。该功能基于过程噪声协方差Q和传感器噪声协方差R确定最佳稳态滤波器MM。

首先指定植物+噪声模型。注意:将采样时间设置为-1以将工厂标记为离散。

植物= SS(A,[B B],C,0,-1,'InputName',{'U''W'},'outputname''是');

指定过程噪声协方差(Q):

q = 2.3;%一个大于零

指定传感器噪声协方差(R):

r = 1;%一个大于零

现在使用方程式设计稳态卡尔曼滤波器

时间更新:x [n + 1 | n] = ax [n | n-1] + bu [n] + bw [n]
测量更新:X [n | n] = x [n | n-1] + m(yv [n]  -  cx [n | n-1])
其中m =使用Kalman命令的最佳创新增益:
[kalmf,l,〜,m,z] =卡尔曼(植物,q,r);

卡尔曼滤波器Kalmf的第一个输出是工厂输出估计Y_E = CX [n | n],并且剩余的输出是状态估计。只保留第一个输出Y_E:

kalmf = kalmf(1,:);米,%创新获得
M = 0.5345 0.0101 -0.4776

要查看此过滤器的工作原理,请生成一些数据并将过滤的响应与真正的工厂响应进行比较:

为了模拟上面的系统,您可以单独生成每个部分的响应或一起生成两个。要分别模拟,首先使用LSIM与植物,然后用过滤器。以下示例在一起模拟。

%首先,用U,W,V作为输入构建完整的工厂模型%Y和YV作为输出:a = a;b = [b b 0 * b];c = [c; c];d = [0 0 0; 0 0 1];p = ss(a,b,c,d,-1,'InputName',{'U''W''v'},'outputname',{'是''yv'});

接下来,通过将u指定为共享输入,并行连接工厂模型和卡尔曼滤波器:

SYS =并联(P,Kalmf,1,1,[],[]);

最后,将工厂输出YV连接到滤波器输入YV。注意:YV是SYS的第4个输入,也是其第二输出:

SimModel =反馈(SYS,1,4,2,1);Simmodel = SimModel([1 3],[1 2 3]);%删除YV形式I / O

由此产生的仿真模型具有W,V,U作为输入和Y,Y_E作为输出:

simmodel.inputname.
ans = 3x1小区数组{'w'} {'v'} {'u'}
simmodel.outputname.
ans = 2x1单元阵列{'y'} {'y_e'}

您现在可以模拟过滤器行为。生成正弦输入载体(已知):

t =(0:100)';u = sin(t / 5);

生成过程噪声和传感器噪声矢量:

RNG(10,'twister');w = sqrt(q)* randn(长度(t),1);v = sqrt(r)* randn(长度(t),1);

现在使用LSIM模拟响应:

OUT = LSIM(SIMMODEL,[W,V,U]);Y = OUT(:,1);%真实响应ye = out(:,2);%过滤响应yv = y + v;%测量响应

比较过滤的响应的真实响应:

CLF子图(211),绘图(t,y,'B',t,ye,'r--'),Xlabel('不。样本'),Ylabel('输出') 标题('卡尔曼滤波响应')子图(212),绘图(t,y-yv,'G',t,y ye,'r--'),Xlabel('不。样本'),Ylabel('错误'

如第二绘图所示,卡尔曼滤波器由于测量噪声而降低了误差y-yv。要确认这一点,请比较错误CoviRACE:

测定= y-yv;measerrcov = sum(measerr. * meanerr)/长度(measerr);Esterr = y-ye;Esterrcov = Sum(Estr. * Estr)/长度(Esterr);

过滤前错误的协议(测量错误):

MEARERRCOV
MEARERRCOV = 0.9871

过滤后误差的协议(估算误差):

Esterrcov.
Esterrcov = 0.3479

时变卡尔曼滤波器设计

现在,设计一个时变的卡尔曼滤波器来执行相同的任务。即使当噪声协方差没有静止时,也可以更改的卡尔曼滤波器表现良好。但是,对于这个例子,我们将使用静止的协方差。

时变卡尔曼滤波器具有以下更新方程。

时间更新:x [n + 1 | n] = ax [n | n] + bu [n] + bw [n]
p [n + 1 | n] = ap [n | n] a'+ b * q * b'
测量更新:X [n | n] = x [n | n-1] + m [n](yv [n]  -  cx [n | n-1])-1 m [n] = p [n | n-1] C'(CP [n | n-1] c'+ r)
p [n | n] =(I-m [n] c)p [n | n-1]

首先,产生嘈杂的工厂响应:

sys = ss(a,b,c,d,-1);Y = LSIM(SYS,U + W);%w =过程噪声yv = y + v;%v = meas。噪音

接下来,实现for循环中的滤波器递归:

p = b * q * b';%初始错误协方差x =零(3,1);州的初始条件ye =零(长度(t),1);Ycov = Zeros(长度(t),1);errcov = zeros(长度(t),1);为了i = 1:长度(t)%测量更新mn = p * c'/(c * p * c'+ r);x = x + mn *(yv(i)-c * x);%x [n | n]p =(眼睛(3)-mn * c)* p;%p [n | n]ye(i)= c * x;errcov(i)= c * p * c';%时间更新x = a * x + b * u(i);%x [n + 1 | n]p = a * p * a'+ b * q * b';%p [n + 1 | n]结尾

现在,将筛选响应的真实响应进行比较:

子图(211),绘图(t,y,'B',t,ye,'r--'),Xlabel('不。样本'),Ylabel('输出') 标题('响应时变卡尔曼滤波器')子图(212),绘图(t,y-yv,'G',t,y ye,'r--'),Xlabel('不。样本'),Ylabel('错误'

时间变化过滤器还估计估计期间的输出协方差。绘制输出协方差,看看过滤器是否已达到稳定状态(如我们预期的静止输入噪声):

子图(211)绘图(t,ertcov),ylabel('错误covar'),

从协方差情节,您可以看到输出协方差在约5个样本中达到稳定状态。从那时起,时间变化过滤器具有与稳态版本相同的性能。

比较协方差错误:

测定= y-yv;measerrcov = sum(measerr. * meanerr)/长度(measerr);Esterr = y-ye;Esterrcov = Sum(Estr. * Estr)/长度(Esterr);

过滤前错误的协议(测量错误):

MEARERRCOV
MEARERRCOV = 0.9871

过滤后误差的协议(估算误差):

Esterrcov.
Esterrcov = 0.3479

验证卡尔曼增益矩阵的稳态和最终值是否一致:

M,Mn.
M = 0.5345 0.0101 -0.4776 Mn = 0.5345 0.0101 -0.4776

外部网站