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

📄 botm_demo.m

📁 kalman滤波
💻 M
字号:
%EIMM_DEMO2 Bearings Only Tracking of a Manouvering Target 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 non-linear bearings only model.% See BOT-demo or the documentation for more details.% % 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 = 1;% 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 variance for model 1 using EKFEKF_q1 = .05;EKF_Qc1 = diag([EKF_q1 EKF_q1]);% Discretization of the continous-time system.[EKF_A1,EKF_Q1] = lti_disc(F{1},L{1},EKF_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;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% Positions of sensors% $$$ S1 = [-0.5; 3];% $$$ S2 = [-0.5;-3];% $$$ S3 = [   7;-3];% $$$ S4 = [   7; 3];S1 = [-0.5; 3.5];S2 = [-0.5;-3.5];S3 = [   7;-3.5];S4 = [   7; 3.5];s = [S1 S2 S3 S4];% Handles to measurement modelsH{1} = @bot_dh_dx;H{2} = @bot_dh_dx;h_func{1} = @bot_h;h_func{2} = @bot_h;h_param{1} = s;h_param{2} = s;% Standard deviationsd = 0.1*ones(1,size(s,2));R = {};R{1} = diag(sd.^2);R{2} = R{1};% Generate measurementsY = bot_h(X_r,s);% Add noisefor i = 1:size(Y,2)    st = mstate(i);    for j = 1:size(Y,1)        Y(j,i) = Y(j,i) + sqrt(R{st}(j,j)) * randn;     endend% Print the trajectoryif print_figures    h = plot(X_r(1,:),X_r(2,:),'-g',...             s(1,:),s(2,:),'k^',...              X_r(1,1),X_r(2,1),'ro','MarkerSize',12);        legend('Real trajectory',...           'Positions of sensors',...           'Starting position', 'Location', 'North');    set(h,'markersize',5);    set(h,'linewidth',0.5);    set(gca,'FontSize',8);    xlim([-1 7.5])     ylim([-4 4])     if save_figures        print('-depsc','eimm2_trajectory.eps');    end    pauseendm = [0 0 0 -1 0]';P = diag([10.1 10.1 1.1 1.1 1]);%% Space for the estimates.% EKF with model 1EKF_MM = zeros(size(A{1},1), size(Y,2));EKF_PP = zeros(size(A{1},1), size(A{1},1), size(Y,2));% UKF with model 1UKF_MM = zeros(size(A{1},1), size(Y,2));UKF_PP = zeros(size(A{1},1), size(A{1},1), size(Y,2));% EKF based IMMEIMM_MM = zeros(size(m,1), size(Y,2));EIMM_PP = zeros(size(m,1), size(m,1), size(Y,2));EIMM_MM_i = cell(nmodels,n);EIMM_PP_i = cell(nmodels,n);EIMM_MU = zeros(nmodels,size(Y,2));% UKF based IMMUIMM_MM = zeros(size(m,1), size(Y,2));UIMM_PP = zeros(size(m,1), size(m,1), size(Y,2));UIMM_MM_i = cell(nmodels,n);UIMM_PP_i = cell(nmodels,n);UIMM_MU = zeros(nmodels,size(Y,2));%%% Initial estimates %%%% EKF with model 1EKF_M = [0 0 0 -1]';EKF_P = diag([1.1 1.1 0.1 0.1]);% UKF with model 1UKF_M = [0 0 0 -1]';UKF_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)    % EKF with model 1    [EKF_M,EKF_P] = kf_predict(EKF_M,EKF_P,EKF_A1,EKF_Q1);    [EKF_M,EKF_P] = ekf_update1(EKF_M,EKF_P,Y(:,i),H{1},R{1},h_func{1},[],h_param{1});        EKF_MM(:,i)   = EKF_M;    EKF_PP(:,:,i) = EKF_P;    % UKF with model 2    [UKF_M,UKF_P] = kf_predict(UKF_M,UKF_P,EKF_A1,EKF_Q1);    [UKF_M,UKF_P] = ukf_update1(UKF_M,UKF_P,Y(:,i),h_func{1},R{1},h_param{1});        UKF_MM(:,i)   = UKF_M;    UKF_PP(:,:,i) = UKF_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] = eimm_update(x_p1,P_p1,c_j1,ind,dims,Y(:,i),H,h_func,R,h_param);    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] = uimm_update(x_p2,P_p2,c_j2,ind,dims,Y(:,i),H,h_func,R,h_param);        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';        % Plot the estimates so far    if print_figures        plot(EKF_MM(1,1:i),EKF_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-');                % Measurement directions        hold on        for k = 1:size(s,2)            len = sqrt(sum((X_r(1:2,i)-s(:,k)).^2,1));            dx = len*cos(Y(k,i));            dy = len*sin(Y(k,i));                        plot([s(1,k);s(1,k)+dx], [s(2,k);s(2,k)+dy], 'k--')        end        plot(s(1,:),s(2,:),'k^')        xlim([-1 7.5])         ylim([-4 4])         hold off        drawnow    endend% Smooth with EKF based IMM smoother[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,h_func,h_param,Y);% Smooth with UKF based IMM smoother[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,h_func,h_param,Y);% Smooth the EKF estimates with RTS smoother using model 1[SM1,SP1] = rts_smooth(EKF_MM,EKF_PP,EKF_A1,EKF_Q1);% Smooth the UKF estimates with RTS smoother using model 1[SM2,SP2] = rts_smooth(UKF_MM,UKF_PP,EKF_A1,EKF_Q1);% Calculate the MSEsMSE_EKF1_1 = mean((X_r(1,:)-EKF_MM(1,:)).^2);MSE_EKF1_2 = mean((X_r(2,:)-EKF_MM(2,:)).^2);MSE_EKF1 = 1/2*(MSE_EKF1_1 + MSE_EKF1_2);MSE_EKS1_1 = mean((X_r(1,:)-SM1(1,:)).^2);MSE_EKS1_2 = mean((X_r(2,:)-SM1(2,:)).^2);MSE_EKS1 = 1/2*(MSE_EKS1_1 + MSE_EKS1_2);% Calculate the MSEsMSE_UKF1_1 = mean((X_r(1,:)-UKF_MM(1,:)).^2);MSE_UKF1_2 = mean((X_r(2,:)-UKF_MM(2,:)).^2);MSE_UKF1 = 1/2*(MSE_UKF1_1 + MSE_UKF1_2);MSE_UKS1_1 = mean((X_r(1,:)-SM2(1,:)).^2);MSE_UKS1_2 = mean((X_r(2,:)-SM2(2,:)).^2);MSE_UKS1 = 1/2*(MSE_UKS1_1 + MSE_UKS1_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('EKF1-RMSE = %.4f\n',MSE_EKF1);fprintf('EKS1-RMSE = %.4f\n',MSE_EKS1);fprintf('UKF1-RMSE = %.4f\n',MSE_UKF1);fprintf('UKS1-RMSE = %.4f\n',MSE_UKS1);fprintf('EIMM-RMSE = %.4f\n',MSE_EIMM);fprintf('EIMMS-RMSE = %.4f\n',MSE_EIMMS);fprintf('UIMM-RMSE = %.4f\n',MSE_UIMM);fprintf('UIMMS-RMSE = %.4f\n',MSE_UIMMS);% Plot the final filtering and smoothing resultsif print_figures    h = plot(X_r(1,:),X_r(2,:),'g-',...                      EKF_MM(1,:),EKF_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',...           'EKF',...           'ERTS',...           'IMM-EKF',...           'IMM-EKS',...           'IMM-UKF',...                      'IMM-UKS');    %title('Estimates produced by IMM-filter.')    set(h,'markersize',2);    set(h,'linewidth',0.5);    set(gca,'FontSize',8);    xlim([-1 7.5])     ylim([-4 4])     if save_figures        print('-depsc','eimm2_1.eps');    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 filters    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('-depsc','eimm2_2.eps');    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('-depsc','eimm2_3.eps');    end  end

⌨️ 快捷键说明

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