码迷,mamicode.com
首页 > 其他好文 > 详细

终于成功仿了一次Kalman滤波器

时间:2014-12-13 00:50:12      阅读:623      评论:0      收藏:0      [点我收藏+]

标签:des   blog   http   io   ar   os   sp   for   on   

终于成功仿了一次Kalman滤波器

首先是测试了从网上down的一段代码
bubuko.com,布布扣% KALMANF - updates a system state vector estimate based upon an
bubuko.com,布布扣% observation, using a discrete Kalman filter.
bubuko.com,布布扣%
bubuko.com,布布扣% Version 1.0, June 30, 2004
bubuko.com,布布扣%
bubuko.com,布布扣% This tutorial function was written by Michael C. Kleder
bubuko.com,布布扣% (Comments are appreciated at: public@kleder.com)
bubuko.com,布布扣%
bubuko.com,布布扣% INTRODUCTION
bubuko.com,布布扣%
bubuko.com,布布扣% Many people have heard of Kalman filtering, but regard the topic
bubuko.com,布布扣% as mysterious. While it‘s true that deriving the Kalman filter and
bubuko.com,布布扣% proving mathematically that it is "optimal" under a variety of
bubuko.com,布布扣% circumstances can be rather intense, applying the filter to
bubuko.com,布布扣% a basic linear system is actually very easy. This Matlab file is
bubuko.com,布布扣% intended to demonstrate that.
bubuko.com,布布扣%
bubuko.com,布布扣% An excellent paper on Kalman filtering at the introductory level,
bubuko.com,布布扣% without detailing the mathematical underpinnings, is:
bubuko.com,布布扣% "An Introduction to the Kalman Filter"
bubuko.com,布布扣% Greg Welch and Gary Bishop, University of North Carolina
bubuko.com,布布扣% http://www.cs.unc.edu/~welch/kalman/kalmanIntro.html
bubuko.com,布布扣%
bubuko.com,布布扣% PURPOSE:
bubuko.com,布布扣%
bubuko.com,布布扣% The purpose of each iteration of a Kalman filter is to update
bubuko.com,布布扣% the estimate of the state vector of a system (and the covariance
bubuko.com,布布扣% of that vector) based upon the information in a new observation.
bubuko.com,布布扣% The version of the Kalman filter in this function assumes that
bubuko.com,布布扣% observations occur at fixed discrete time intervals. Also, this
bubuko.com,布布扣% function assumes a linear system, meaning that the time evolution
bubuko.com,布布扣% of the state vector can be calculated by means of a state transition
bubuko.com,布布扣% matrix.
bubuko.com,布布扣%
bubuko.com,布布扣% USAGE:
bubuko.com,布布扣%
bubuko.com,布布扣% s = kalmanf(s)
bubuko.com,布布扣%
bubuko.com,布布扣% "s" is a "system" struct containing various fields used as input
bubuko.com,布布扣% and output. The state estimate "x" and its covariance "P" are
bubuko.com,布布扣% updated by the function. The other fields describe the mechanics
bubuko.com,布布扣% of the system and are left unchanged. A calling routine may change
bubuko.com,布布扣% these other fields as needed if state dynamics are time-dependent;
bubuko.com,布布扣% otherwise, they should be left alone after initial values are set.
bubuko.com,布布扣% The exceptions are the observation vectro "z" and the input control
bubuko.com,布布扣% (or forcing function) "u." If there is an input function, then
bubuko.com,布布扣% "u" should be set to some nonzero value by the calling routine.
bubuko.com,布布扣%
bubuko.com,布布扣% SYSTEM DYNAMICS:
bubuko.com,布布扣%
bubuko.com,布布扣% The system evolves according to the following difference equations,
bubuko.com,布布扣% where quantities are further defined below:
bubuko.com,布布扣%
bubuko.com,布布扣% x = Ax + Bu + w meaning the state vector x evolves during one time
bubuko.com,布布扣% step by premultiplying by the "state transition
bubuko.com,布布扣% matrix" A. There is optionally (if nonzero) an input
bubuko.com,布布扣% vector u which affects the state linearly, and this
bubuko.com,布布扣% linear effect on the state is represented by
bubuko.com,布布扣% premultiplying by the "input matrix" B. There is also
bubuko.com,布布扣% gaussian process noise w.
bubuko.com,布布扣% z = Hx + v meaning the observation vector z is a linear function
bubuko.com,布布扣% of the state vector, and this linear relationship is
bubuko.com,布布扣% represented by premultiplication by "observation
bubuko.com,布布扣% matrix" H. There is also gaussian measurement
bubuko.com,布布扣% noise v.
bubuko.com,布布扣% where w ~ N(0,Q) meaning w is gaussian noise with covariance Q
bubuko.com,布布扣% v ~ N(0,R) meaning v is gaussian noise with covariance R
bubuko.com,布布扣%
bubuko.com,布布扣% VECTOR VARIABLES:
bubuko.com,布布扣%
bubuko.com,布布扣% s.x = state vector estimate. In the input struct, this is the
bubuko.com,布布扣% "a priori" state estimate (prior to the addition of the
bubuko.com,布布扣% information from the new observation). In the output struct,
bubuko.com,布布扣% this is the "a posteriori" state estimate (after the new
bubuko.com,布布扣% measurement information is included).
bubuko.com,布布扣% s.z = observation vector
bubuko.com,布布扣% s.u = input control vector, optional (defaults to zero).
bubuko.com,布布扣%
bubuko.com,布布扣% MATRIX VARIABLES:
bubuko.com,布布扣%
bubuko.com,布布扣% s.A = state transition matrix (defaults to identity).
bubuko.com,布布扣% s.P = covariance of the state vector estimate. In the input struct,
bubuko.com,布布扣% this is "a priori," and in the output it is "a posteriori."
bubuko.com,布布扣% (required unless autoinitializing as described below).
bubuko.com,布布扣% s.B = input matrix, optional (defaults to zero).
bubuko.com,布布扣% s.Q = process noise covariance (defaults to zero).
bubuko.com,布布扣% s.R = measurement noise covariance (required).
bubuko.com,布布扣% s.H = observation matrix (defaults to identity).
bubuko.com,布布扣%
bubuko.com,布布扣% NORMAL OPERATION:
bubuko.com,布布扣%
bubuko.com,布布扣% (1) define all state definition fields: A,B,H,Q,R
bubuko.com,布布扣% (2) define intial state estimate: x,P
bubuko.com,布布扣% (3) obtain observation and control vectors: z,u
bubuko.com,布布扣% (4) call the filter to obtain updated state estimate: x,P
bubuko.com,布布扣% (5) return to step (3) and repeat
bubuko.com,布布扣%
bubuko.com,布布扣% INITIALIZATION:
bubuko.com,布布扣%
bubuko.com,布布扣% If an initial state estimate is unavailable, it can be obtained
bubuko.com,布布扣% from the first observation as follows, provided that there are the
bubuko.com,布布扣% same number of observable variables as state variables. This "auto-
bubuko.com,布布扣% intitialization" is done automatically if s.x is absent or NaN.
bubuko.com,布布扣%
bubuko.com,布布扣%x = inv(H)*z
bubuko.com,布布扣%P = inv(H)*R*inv(H‘)
bubuko.com,布布扣%
bubuko.com,布布扣% This is mathematically equivalent to setting the initial state estimate
bubuko.com,布布扣% covariance to infinity.
bubuko.com,布布扣%
bubuko.com,布布扣% SCALAR EXAMPLE (Automobile Voltimeter):
bubuko.com,布布扣%
bubuko.com,布布扣% % Define the system as a constant of 12 volts:
bubuko.com,布布扣function T
bubuko.com,布布扣clear s
bubuko.com,布布扣s.x = 12;
bubuko.com,布布扣s.A = 1;
bubuko.com,布布扣% % Define a process noise (stdev) of 2 volts as the car operates:
bubuko.com,布布扣s.Q = 2^2; % variance, hence stdev^2
bubuko.com,布布扣% Define the voltimeter to measure the voltage itself:
bubuko.com,布布扣s.H = 1;
bubuko.com,布布扣% % Define a measurement error (stdev) of 2 volts:
bubuko.com,布布扣s.R = 2^2; % variance, hence stdev^2
bubuko.com,布布扣%Do not define any system input (control) functions:
bubuko.com,布布扣s.B = 0;
bubuko.com,布布扣s.u = 0;
bubuko.com,布布扣% % Do not specify an initial state:
bubuko.com,布布扣s.x = nan;
bubuko.com,布布扣s.P = nan;
bubuko.com,布布扣% % Generate random voltages and watch the filter operate.
bubuko.com,布布扣tru=[]; % truth voltage
bubuko.com,布布扣for t=1:20
bubuko.com,布布扣    tru(end+1) = randn*2+12;
bubuko.com,布布扣    s(end).z = tru(end) + randn*2; % create a measurement
bubuko.com,布布扣    s(end+1)=kalmanf(s(end)); % perform a Kalman filter iteration
bubuko.com,布布扣    % end
bubuko.com,布布扣    % figure
bubuko.com,布布扣    % hold on
bubuko.com,布布扣    % grid on
bubuko.com,布布扣    % % plot measurement data:
bubuko.com,布布扣    hz=plot([s(1:end-1).z],‘r‘);hold on
bubuko.com,布布扣    % % plot a-posteriori state estimates:
bubuko.com,布布扣    hk=plot([s(2:end).x],‘b-‘);hold on
bubuko.com,布布扣    ht=plot(tru,‘g-‘);hold on
bubuko.com,布布扣    legend(‘observations‘,‘Kalman output‘,‘true voltage‘,0)
bubuko.com,布布扣    title(‘Automobile Voltimeter Example‘)
bubuko.com,布布扣    % hold off
bubuko.com,布布扣end    
bubuko.com,布布扣    
bubuko.com,布布扣function s = kalmanf(s)
bubuko.com,布布扣
bubuko.com,布布扣% set defaults for absent fields:
bubuko.com,布布扣if ~isfield(s,‘x‘); s.x=nan*z; end
bubuko.com,布布扣if ~isfield(s,‘P‘); s.P=nan; end
bubuko.com,布布扣if ~isfield(s,‘z‘); error(‘Observation vector missing‘); end
bubuko.com,布布扣if ~isfield(s,‘u‘); s.u=0; end
bubuko.com,布布扣if ~isfield(s,‘A‘); s.A=eye(length(x)); end
bubuko.com,布布扣if ~isfield(s,‘B‘); s.B=0; end
bubuko.com,布布扣if ~isfield(s,‘Q‘); s.Q=zeros(length(x)); end
bubuko.com,布布扣if ~isfield(s,‘R‘); error(‘Observation covariance missing‘); end
bubuko.com,布布扣if ~isfield(s,‘H‘); s.H=eye(length(x)); end
bubuko.com,布布扣
bubuko.com,布布扣if isnan(s.x)
bubuko.com,布布扣    % initialize state estimate from first observation
bubuko.com,布布扣    if diff(size(s.H))
bubuko.com,布布扣        error(‘Observation matrix must be square and invertible for state autointialization.‘);
bubuko.com,布布扣    end
bubuko.com,布布扣    s.x = inv(s.H)*s.z;
bubuko.com,布布扣    s.P = inv(s.H)*s.R*inv(s.H‘); 
bubuko.com,布布扣else
bubuko.com,布布扣    
bubuko.com,布布扣    % This is the code which implements the discrete Kalman filter:
bubuko.com,布布扣    
bubuko.com,布布扣    % Prediction for state vector and covariance:
bubuko.com,布布扣    s.x = s.A*s.x + s.B*s.u;
bubuko.com,布布扣    s.P = s.A * s.P * s.A‘ + s.Q;
bubuko.com,布布扣    
bubuko.com,布布扣    % Compute Kalman gain factor:
bubuko.com,布布扣    K = s.P*s.H‘*inv(s.H*s.P*s.H‘+s.R);
bubuko.com,布布扣    
bubuko.com,布布扣    % Correction based on observation:
bubuko.com,布布扣    s.x = s.x + K*(s.z-s.H*s.x);
bubuko.com,布布扣    s.P = s.P - K*s.H*s.P;
bubuko.com,布布扣    
bubuko.com,布布扣    % Note that the desired result, which is an improved estimate
bubuko.com,布布扣    % of the sytem state vector x and its covariance P, was obtained
bubuko.com,布布扣    % in only five lines of code, once the system was defined. (That‘s
bubuko.com,布布扣    % how simple the discrete Kalman filter is to use.) Later,
bubuko.com,布布扣    % we‘ll discuss how to deal with nonlinear systems.
bubuko.com,布布扣    
bubuko.com,布布扣end
bubuko.com,布布扣
bubuko.com,布布扣

后来不过瘾,自己写了一个,没想到稍微改了一改竟然成功了,效果还不错
bubuko.com,布布扣% 状态
bubuko.com,布布扣% xk=A•xk-1+B•uk+wk
bubuko.com,布布扣% zk=H•xk+vk,
bubuko.com,布布扣% p(w) ~ N(0,Q)
bubuko.com,布布扣% p(v) ~ N(0,R),
bubuko.com,布布扣
bubuko.com,布布扣% 预测
bubuko.com,布布扣% x‘k=A•xk+B•uk
bubuko.com,布布扣% P‘k=A•P(k-1)*AT + Q
bubuko.com,布布扣% 修正
bubuko.com,布布扣% Kk=P‘k•HT•(H•P‘k•HT+R)-1
bubuko.com,布布扣% xk=x‘k+Kk•(zk-H•x‘k)
bubuko.com,布布扣% Pk=(I-Kk•H)•P‘k
bubuko.com,布布扣
bubuko.com,布布扣%要注意的是:必须把系统状态和kalman滤波器内部预测的状态分开
bubuko.com,布布扣function Test
bubuko.com,布布扣A=[1 0.1;0 1];
bubuko.com,布布扣B=0;
bubuko.com,布布扣Xp=rand(2,1)*0.1; 
bubuko.com,布布扣X=[0 0]‘;
bubuko.com,布布扣H=[1 0];
bubuko.com,布布扣Q=eye(2)*1e-5;
bubuko.com,布布扣R=eye(1)*0.1; 
bubuko.com,布布扣P=eye(2);% P‘(k)
bubuko.com,布布扣angle=[];
bubuko.com,布布扣angle_m=[];
bubuko.com,布布扣angle_real=[];
bubuko.com,布布扣for i=1:500
bubuko.com,布布扣    angle_real=[angle_real X(1)]; %实际角度
bubuko.com,布布扣    
bubuko.com,布布扣    [Xp,P]=Predict(A,Xp,P,Q); 
bubuko.com,布布扣    
bubuko.com,布布扣    X=A*X+rand(2,1)*1e-5;
bubuko.com,布布扣    z_m=H*X+rand(1,1)*0.1-0.05;  
bubuko.com,布布扣    angle_m=[angle_m z_m(1)];   %测量的角度
bubuko.com,布布扣        
bubuko.com,布布扣    [Xp,P]=Correct(P,H,R,X,z_m);
bubuko.com,布布扣    angle=[angle Xp(1)];     %预测的角度    
bubuko.com,布布扣end
bubuko.com,布布扣t=1:500;
bubuko.com,布布扣plot(t,angle,‘r‘,t,angle_m,‘g‘,t,angle_real,‘b‘)
bubuko.com,布布扣legend(‘预测值‘,‘测量值‘,‘实际值‘)
bubuko.com,布布扣
bubuko.com,布布扣figure
bubuko.com,布布扣plot(t,angle-angle_real,‘r‘,t,angle_m-angle_real,‘g‘)
bubuko.com,布布扣legend(‘滤波后的误差‘,‘测量的误差‘)
bubuko.com,布布扣title(‘误差分析‘)
bubuko.com,布布扣xlabel(‘time‘);
bubuko.com,布布扣ylabel(‘error‘);
bubuko.com,布布扣
bubuko.com,布布扣function [Xk,Pk]=Predict(A,Xk,Pk_1,Q)
bubuko.com,布布扣Xk=A*Xk;
bubuko.com,布布扣Pk=A*Pk_1*A‘+Q;
bubuko.com,布布扣
bubuko.com,布布扣function [Xk,Pk]=Correct(Pk,H,R,Xk,zk)
bubuko.com,布布扣Kk=Pk * H‘ * inv(H * Pk * H‘ + R);
bubuko.com,布布扣Xk=Xk+ Kk*(zk-H*Xk);
bubuko.com,布布扣Pk=(eye(size(Pk,1)) - Kk*H)*Pk;
 
 
顺便附上几张仿真图
这是状态图
bubuko.com,布布扣
这是误差分析
bubuko.com,布布扣

终于成功仿了一次Kalman滤波器

标签:des   blog   http   io   ar   os   sp   for   on   

原文地址:http://www.cnblogs.com/x113/p/4160734.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!