⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ct_demo.m

📁 有关kalman滤波及其一些变形滤波算法
💻 M
字号:
%EIMM_DEMO1 Coordinated turn model demonstration % % Simple demonstration for non-linear IMM using the following models:%  1. Standard Wiener process velocity model%  2. Coordinated turn model%% The measurement model is linear, which gives noisy measurements % of target's position.% % Copyright (C) 2007-2008 Jouni Hartikainen%% This software is distributed under the GNU General Public % Licence (version 2 or later); please refer to the file % Licence.txt, included with the software, for details.print_figures = 1;save_figures = 0;% Dimensionality of the state spacedims = 5;% The number of models in usenmodels = 2;% Step sizedt = 0.1;% Space for function handles and parametersa_func = {};ia_func = {};a_param = {};h_func = {};h_param = {};dh_dx_func = {};a_func{1} = [];a_func{2} = @f_turn;ia_func{1} = [];ia_func{2} = @f_turn_inv;a_param{1} = [];a_param{2} = {dt};% Space for model parametersind = cell(1,nmodels);F   = cell(1,nmodels);L   = cell(1,nmodels);Qc  = cell(1,nmodels);A   = cell(1,nmodels);Q   = cell(1,nmodels);H   = cell(1,nmodels);R   = cell(1,nmodels);% Index vector of model 1ind{1} = [1 2 3 4]';% Transition matrix for the continous-time velocity model.F{1} = [0 0 1 0;        0 0 0 1;        0 0 0 0;        0 0 0 0];% Noise effect matrix for the continous-time system.L{1} = [0 0;        0 0;        1 0;        0 1];% Process noise varianceq1 = 0.01;Qc{1} = diag([q1 q1]);% Discretization of the continous-time system.[A{1},Q{1}] = lti_disc(F{1},L{1},Qc{1},dt);% Process noise varianceKF_q1 = .05;KF_Qc1 = diag([KF_q1 KF_q1]);% Discretization of the continous-time system.[KF_A1,KF_Q1] = lti_disc(F{1},L{1},KF_Qc1,dt);%%% Specification of the turning model% System components. 5th parameter is the turning rate ind{2} = [1 2 3 4 5]';% Derivative of the dynamic function A{2} = @f_turn_dx;% Process noise for the turning rateQc{2} = 0.15;% Noise effect matrixL{2} = [0 0 0 0 1]';% Process noise covarianceQ{2} = L{2}*Qc{2}*L{2}'*dt;% Check the derivatives%der_check(a_func{2}, A{2}, 1, [1 1 1 1 0]',{dt});% Measurement models.H{1} = [1 0 0 0;        0 1 0 0];H{2} = [1 0 0 0 0;        0 1 0 0 0];hdims = 2;%mu_ip = [0.90 0.05 0.05];mu_ip = [0.95 0.05];mu_0j = mu_ip;%p_ij = [0.65 0.35;%        0.10 0.90];p_ij = [0.90 0.10;        0.10 0.90];% Number of data pointsn = 200;% Space for real states and modesX_r = zeros(dims,n);mstate = zeros(1,n);%%%%%%% Creation of trajectory %%%%%%%% Start with constant velocity 1 toward rightmstate(1:40) = 1;X_r(:,1) = [0 0 1 0 0]';% At 4s make a turn left with rate 1 mstate(41:90) = 2;X_r(5,40) = 1;% At 9s move straight for 2 secondsmstate(91:110) = 1;% At 11s commence another turn right with rate -1mstate(111:160) = 2;X_r(5,110) = -1;% At 16s move straight for 4 secondsmstate(161:200) = 1;% Generate object state valuesfor i = 2:n   st = mstate(i);   if isstr(a_func{st}) | strcmp(class(a_func{st}),'function_handle')       X_r(ind{st},i) = feval(a_func{st},X_r(ind{st},i-1),a_param{st});   else        X_r(ind{st},i) = A{st}*X_r(ind{st},i-1);   endend% Noise variances of the measurement models% Model 1 r1 = .05;r2 = .05;R{1} = diag([r1 r2]);% Model 2r1 = .05;r2 = .05;R{2} = diag([r1 r2]);% Generate the measurements.Y = zeros(hdims,n);for i = 1:n    Y(:,i) = H{mstate(i)}*X_r(ind{mstate(i)},i) + gauss_rnd(zeros(size(Y,1),1), R{mstate(i)});endac = floor(n/2)+1:floor(n/2)+2;clf; clc;%fprintf('Filtering with KF...');if print_figures    h = plot(X_r(1,:),X_r(2,:),'-g',...             Y(1,:),Y(2,:),'.',...              X_r(1,1),X_r(2,1),'ro','MarkerSize',12);        legend('Real trajectory',...           'Measurements',...           'Starting position');    set(h,'markersize',5);    set(h,'linewidth',0.5);    set(gca,'FontSize',8);    xlim([-1 7.5])     ylim([-3.5 3.5])     %title('Trajectory of the object');    if save_figures        print('-dpsc','eimm1_trajectory.ps');    end    pauseendm = [0 0 0 -1 0]';P = diag([10.1 10.1 1.1 1.1 1]);%% Space for the estimates.% KF with model 1KF_MM = zeros(size(A{1},1), size(Y,2));KF_PP = zeros(size(A{1},1), size(A{1},1), size(Y,2));% IMMIMM1_MM = zeros(size(m,1), size(Y,2));IMM1_PP = zeros(size(m,1), size(m,1), size(Y,2));IMM1_MM_i = cell(nmodels,n);IMM1_PP_i = cell(nmodels,n);IMM1_MU = zeros(nmodels,size(Y,2));%%% Initial estimates %%%% KF with model 1KF_M = [0 0 0 -1]';KF_P = diag([1.1 1.1 0.1 0.1]);% EKF based IMMx_ip1{1} = [0 0 1 0]';x_ip1{2} = [0 0 1 0 0]';mu_ip1 = mu_ip;P_ip1{1} = diag([0.1 0.1 0.1 0.1]);P_ip1{2} = diag([0.1 0.1 0.1 0.1 1]);% UKF based IMMx_ip2{1} = [0 0 1 0]';x_ip2{2} = [0 0 1 0 0]';mu_ip2 = mu_ip;P_ip2{1} = diag([0.1 0.1 0.1 0.1]);P_ip2{2} = diag([0.1 0.1 0.1 0.1 1]);% Filtering steps.for i = 1:size(Y,2)    % KF with model 1    [KF_M,KF_P] = kf_predict(KF_M,KF_P,KF_A1,KF_Q1);    [KF_M,KF_P] = kf_update(KF_M,KF_P,Y(:,i),H{1},R{1});    KF_MM(:,i)   = KF_M;    KF_PP(:,:,i) = KF_P;        % EKF based IMM    [x_p1,P_p1,c_j1] = eimm_predict(x_ip1,P_ip1,mu_ip1,p_ij,ind,dims,A,a_func,a_param,Q);    [x_ip1,P_ip1,mu_ip1,m1,P1] = imm_update(x_p1,P_p1,c_j1,ind,dims,Y(:,i),H,R);    EIMM_MM(:,i)   = m1;    EIMM_PP(:,:,i) = P1;    EIMM_MU(:,i)   = mu_ip1';    EIMM_MM_i(:,i) = x_ip1';    EIMM_PP_i(:,i) = P_ip1';        % UKF based IMM    [x_p2,P_p2,c_j2] = uimm_predict(x_ip2,P_ip2,mu_ip2,p_ij,ind,dims,A,a_func,a_param,Q);        [x_ip2,P_ip2,mu_ip2,m2,P2] = imm_update(x_p2,P_p2,c_j2,ind,dims,Y(:,i),H,R);    UIMM_MM(:,i)   = m2;    UIMM_PP(:,:,i) = P2;    UIMM_MU(:,i)   = mu_ip2';    UIMM_MM_i(:,i) = x_ip2';    UIMM_PP_i(:,i) = P_ip2';    if print_figures        % Plot the estimates obtained so far        plot(Y(1,1:i),Y(2,1:i),'k.',...             KF_MM(1,1:i),KF_MM(2,1:i),'y-',...             EIMM_MM(1,1:i),EIMM_MM(2,1:i),'r-',...             UIMM_MM(1,1:i),UIMM_MM(2,1:i),'b-',...                      X_r(1,1:i),X_r(2,1:i),'g-');        xlim([-1 7.5])         ylim([-3.5 3.5])                 drawnow    endend% Smooth with EKF based IMM[SMI_1,SPI_1,SMI_i_1,SPI_i_1,MU_S_1] = eimm_smooth(EIMM_MM,EIMM_PP,EIMM_MM_i,EIMM_PP_i,EIMM_MU,p_ij,mu_0j,ind,dims,A,ia_func,a_param,Q,R,H,[],[],Y);% Smooth with UKF based IMM[SMI_2,SPI_2,SMI_i_2,SPI_i_2,MU_S_2] = uimm_smooth(UIMM_MM,UIMM_PP,UIMM_MM_i,UIMM_PP_i,UIMM_MU,p_ij,mu_0j,ind,dims,A,ia_func,a_param,Q,R,H,[],[],Y);% Smooth with KF[SM1,SP1] = erts_smooth1(KF_MM,KF_PP,KF_A1,KF_Q1);% Calculate the MSEsMSE_KF1_1 = mean((X_r(1,:)-KF_MM(1,:)).^2);MSE_KF1_2 = mean((X_r(2,:)-KF_MM(2,:)).^2);MSE_KF1 = 1/2*(MSE_KF1_1 + MSE_KF1_2);MSE_KS1_1 = mean((X_r(1,:)-SM1(1,:)).^2);MSE_KS1_2 = mean((X_r(2,:)-SM1(2,:)).^2);MSE_KS1 = 1/2*(MSE_KS1_1 + MSE_KS1_2);MSE_EIMM1 = mean((X_r(1,:)-EIMM_MM(1,:)).^2);MSE_EIMM2 = mean((X_r(2,:)-EIMM_MM(2,:)).^2);MSE_EIMM = 1/2*(MSE_EIMM1 + MSE_EIMM2);MSE_EIMMS1 = mean((X_r(1,:)-SMI_1(1,:)).^2);MSE_EIMMS2 = mean((X_r(2,:)-SMI_1(2,:)).^2);MSE_EIMMS = 1/2*(MSE_EIMMS1 + MSE_EIMMS2);MSE_UIMM1 = mean((X_r(1,:)-UIMM_MM(1,:)).^2);MSE_UIMM2 = mean((X_r(2,:)-UIMM_MM(2,:)).^2);MSE_UIMM = 1/2*(MSE_UIMM1 + MSE_UIMM2);MSE_UIMMS1 = mean((X_r(1,:)-SMI_2(1,:)).^2);MSE_UIMMS2 = mean((X_r(2,:)-SMI_2(2,:)).^2);MSE_UIMMS = 1/2*(MSE_UIMMS1 + MSE_UIMMS2);fprintf('Mean square errors of position estimates:\n');fprintf('KF1-MSE = %.4f\n',MSE_KF1);fprintf('KS1-MSE = %.4f\n',MSE_KS1);fprintf('EIMM-MSE = %.4f\n',MSE_EIMM);fprintf('EIMMS-MSE = %.4f\n',MSE_EIMMS);fprintf('UIMM-MSE = %.4f\n',MSE_UIMM);fprintf('UIMMS-MSE = %.4f\n',MSE_UIMMS);% Plot the final filtering and smoothing resultsif print_figures    h = plot(X_r(1,:),X_r(2,:),'g-',...                      KF_MM(1,:),KF_MM(2,:),'-k',...             SM1(1,:),SM1(2,:),'--k',...             EIMM_MM(1,:),EIMM_MM(2,:),'-r',...                          SMI_1(1,:),SMI_1(2,:),'--r',...             UIMM_MM(1,:),UIMM_MM(2,:),'-b',...             SMI_2(1,:),SMI_2(2,:),'--b');    legend('True trajectory',...           'KF',...           'RTS',...           'IMM-EKF',...           'IMM-EKS',...           'IMM-UKF',...           'IMM-UKS');    %title('Estimates produced by Kalman filter using the model 1.');    set(h,'markersize',2);    set(h,'linewidth',0.5);    set(gca,'FontSize',8);    xlim([-1 7.5])     ylim([-3.5 3.5])     if save_figures        print('-dpsc','eimm1_1.ps');    end    pause        % Determine the real model probabilities    p_models = zeros(nmodels,n);    I1 = find(mstate == 1);    p_models(1,I1) = 1;    I2 = find(mstate == 2);    p_models(2,I2) = 1;    % Plot model 2 probability for each step    h = plot(1:n, p_models(2,:),'g--',...             1:n,EIMM_MU(2,:)','-r',...             1:n,MU_S_1(2,:)','--r',...             1:n,UIMM_MU(2,:)','-b',...             1:n,MU_S_2(2,:)','--b');    %1:n,MU_S_2(2,:)','b-');    legend('True',...           'IMM-EKF',...           'IMM-EKS',...           'IMM-UKF',...           'IMM-UKS');    %title('Probability of model 2');    ylim([-0.1,1.1]);    set(h,'markersize',2);    set(h,'linewidth',0.5);    set(gca,'FontSize',8);    if save_figures        print('-dpsc','eimm1_2.ps');    end    pause    % Collect the turn rate estimates    EMM_t = zeros(5,n);    EMM_s = zeros(5,n);    UMM_t = zeros(5,n);    UMM_s = zeros(5,n);    for i = 1:n        EMM_t(:,i) = EIMM_MM_i{2,i};        EMM_s(:,i) = SMI_i_1{2,i};        UMM_t(:,i) = UIMM_MM_i{2,i};        UMM_s(:,i) = SMI_i_2{2,i};    end        % Plot the filtered turn rates    h = plot(1:n, X_r(5,:),'-g',...             1:n,EMM_t(5,:),'-r',...                  1:n,EMM_s(5,:),'--r',...                  1:n,UMM_t(5,:),'-b',...                          1:n,UMM_s(5,:),'--b');    %title('Turn rate estimates')    legend('True',...           'IMM-EKF',...           'IMM-EKS',...           'IMM-UKF',...           'IMM-UKS');    set(h,'markersize',2);    set(h,'linewidth',0.5);    set(gca,'FontSize',8);        if save_figures        print('-dpsc','eimm1_3.ps');    endend

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -