卡尔曼滤波

王朝百科·作者佚名  2009-12-08  
宽屏版  字体: |||超大  

卡尔曼滤波

卡尔曼滤波的应用斯坦利.施密特(Stanley Schmidt)首次实现了卡尔曼滤波器.卡尔曼在NASA埃姆斯研究中心访问时,发现他的方法对于解决阿波罗计划的轨道预测很有用,后来阿波罗飞船的导航电脑使用了这种滤波器. 关于这种滤波器的论文由Swerling (1958), Kalman (1960)与 Kalman and Bucy (1961)发表.

目前,卡尔曼滤波已经有很多不同的实现.卡尔曼最初提出的形式现在一般称为简单卡尔曼滤波器.除此以外,还有施密特扩展滤波器,信息滤波器以及很多Bierman, Thornton 开发的平方根滤波器的变种.也行最常见的卡尔曼滤波器是锁相环,它在收音机,计算机和几乎任何视频或通讯设备中广泛存在.

卡尔曼滤波的一个典型实例是从一组有限的,对物体位置的,包含噪声的观察序列预测出物体的坐标位置及速度. 在很多工程应用(雷达,计算机视觉)中都可以找到它的身影. 同时,卡尔曼滤波也是控制理论以及控制系统工程中的一个重要话题.

比如,在雷达中,人们感兴趣的是跟踪目标,但目标的位置,速度,加速度的测量值往往在任何时候都有噪声.卡尔曼滤波利用目标的动态信息,设法去掉噪声的影响,得到一个关于目标位置的好的估计。这个估计可以是对当前目标位置的估计(滤波),也可以是对于将来位置的估计(预测),也可以是对过去位置的估计(插值或平滑).

扩展卡尔曼滤波(EKF)

EXTEND KALMAN FILTER

扩展卡尔曼滤波器

是由kalman filter考虑时间非线性的动态系统,常应用于目标跟踪系统。

附matlab下面的kalman滤波程序:

clear

N=200;

w(1)=0;

w=randn(1,N)

x(1)=0;

a=1;

for k=2:N;

x(k)=a*x(k-1)+w(k-1);

end

V=randn(1,N);

q1=std(V);

Rvv=q1.^2;

q2=std(x);

Rxx=q2.^2;

q3=std(w);

Rww=q3.^2;

c=0.2;

Y=c*x+V;

p(1)=0;

s(1)=0;

for t=2:N;

p1(t)=a.^2*p(t-1)+Rww;

b(t)=c*p1(t)/(c.^2*p1(t)+Rvv);

s(t)=a*s(t-1)+b(t)*(Y(t)-a*c*s(t-1));

p(t)=p1(t)-c*b(t)*p1(t);

end

t=1:N;

plot(t,s,'r',t,Y,'g',t,x,'b');

function [x, V, VV, loglik] = kalman_filter(y, A, C, Q, R, init_x, init_V, varargin)

% Kalman filter.

% [x, V, VV, loglik] = kalman_filter(y, A, C, Q, R, init_x, init_V, ...)

%

% INPUTS:

% y(:,t) - the observation at time t

% A - the system matrix

% C - the observation matrix

% Q - the system covariance

% R - the observation covariance

% init_x - the initial state (column) vector

% init_V - the initial state covariance

%

% OPTIONAL INPUTS (string/value pairs [default in brackets])

% 'model' - model(t)=m means use params from model m at time t [ones(1,T) ]

% In this case, all the above matrices take an additional final dimension,

% i.e., A(:,:,m), C(:,:,m), Q(:,:,m), R(:,:,m).

% However, init_x and init_V are independent of model(1).

% 'u' - u(:,t) the control signal at time t [ [] ]

% 'B' - B(:,:,m) the input regression matrix for model m

%

% OUTPUTS (where X is the hidden state being estimated)

% x(:,t) = E[X(:,t) | y(:,1:t)]

% V(:,:,t) = Cov[X(:,t) | y(:,1:t)]

% VV(:,:,t) = Cov[X(:,t), X(:,t-1) | y(:,1:t)] t >= 2

% loglik = sum{t=1}^T log P(y(:,t))

%

% If an input signal is specified, we also condition on it:

% e.g., x(:,t) = E[X(:,t) | y(:,1:t), u(:, 1:t)]

% If a model sequence is specified, we also condition on it:

% e.g., x(:,t) = E[X(:,t) | y(:,1:t), u(:, 1:t), m(1:t)]

[os T] = size(y);

ss = size(A,1); % size of state space

% set default params

model = ones(1,T);

u = [];

B = [];

ndx = [];

args = varargin;

nargs = length(args);

for i=1:2:nargs

switch args

case 'model', model = args{i+1};

case 'u', u = args{i+1};

case 'B', B = args{i+1};

case 'ndx', ndx = args{i+1};

otherwise, error(['unrecognized argument ' args])

end

end

x = zeros(ss, T);

V = zeros(ss, ss, T);

VV = zeros(ss, ss, T);

loglik = 0;

for t=1:T

m = model(t);

if t==1

%prevx = init_x(:,m);

%prevV = init_V(:,:,m);

prevx = init_x;

prevV = init_V;

initial = 1;

else

prevx = x(:,t-1);

prevV = V(:,:,t-1);

initial = 0;

end

if isempty(u)

[x(:,t), V(:,:,t), LL, VV(:,:,t)] = ...

kalman_update(A(:,:,m), C(:,:,m), Q(:,:,m), R(:,:,m), y(:,t), prevx, prevV, 'initial', initial);

else

if isempty(ndx)

[x(:,t), V(:,:,t), LL, VV(:,:,t)] = ...

kalman_update(A(:,:,m), C(:,:,m), Q(:,:,m), R(:,:,m), y(:,t), prevx, prevV, ...

'initial', initial, 'u', u(:,t), 'B', B(:,:,m));

else

i = ndx;

% copy over all elements; only some will get updated

x(:,t) = prevx;

prevP = inv(prevV);

prevPsmall = prevP(i,i);

prevVsmall = inv(prevPsmall);

[x(i,t), smallV, LL, VV(i,i,t)] = ...

kalman_update(A(i,i,m), C(:,i,m), Q(i,i,m), R(:,:,m), y(:,t), prevx(i), prevVsmall, ...

'initial', initial, 'u', u(:,t), 'B', B(i,:,m));

smallP = inv(smallV);

prevP(i,i) = smallP;

V(:,:,t) = inv(prevP);

end

end

loglik = loglik + LL;

end

 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝百科 版权所有