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

📄 demse4.m

📁 有关kalman滤波及其一些变形滤波算法
💻 M
字号:
% DEMSE4  Bearing Only Tracking Example%%   This demonstrates the use of the Sigma-Point Particle Filter on the classic%   HARD bearing only tracking problem.%%   Note : This problem has not been optimised for optimal performance. It is%          simply to demonstrate the use of the SPPF on a tracking problem.%%%   See also%   GSSM_BOT%
%   Copyright (c) Oregon Health & Science University (2006)
%
%   This file is part of the ReBEL Toolkit. The ReBEL Toolkit is available free for
%   academic use only (see included license file) and can be obtained from
%   http://choosh.csee.ogi.edu/rebel/.  Businesses wishing to obtain a copy of the
%   software should contact rebel@csee.ogi.edu for commercial licensing information.
%%   See LICENSE (which should be part of the main toolkit distribution) for more%   detail.%=============================================================================================clc;clear all;fprintf('\nDEMSE4 :  Bearing Only Tracking\n\n');fprintf('A random target trajectory is generated for each run, resulting in varying\n');fprintf('tracking performance.\n\n');fprintf('NOTE 1: This example has not been optimised for optimal performance.\n');fprintf('It is used simply to demonstrate the use of the different inference\n');fprintf('algorithms on a very hard nonlinear tracking problem.\n\n');fprintf('NOTE 2: To best view result plots, maximize window and move legend boxes to outside frame.\n\n\n');%--- General setupaddrelpath('../gssm');         % add relative search path to example GSSM files to MATLABPATHaddrelpath('../data');         % add relative search path to example data files to MATLABPATH%--- Initialise GSSMmodel = gssm_bot('init');%--- Generate inference data structureArg.model = model;                                   % embed GSSMArg.type = 'state';                                  % estimation typeArg.tag = 'State estimation for bearings-only tracking problem';  % info tag (not required)InfDS = geninfds(Arg);                               % call generate function%--- Generate estimation process and observation noise sources%ftype = input('Inference algorithm  [ srcdkf / pf / sppf / gmsppf ] : ','s');  %  set type of inference algorithm (estimator) to use :%--- Generate some data : Initial target state generated according to Gordon, Salmond & Ewing - 1995N = 25;                                              % max. time k=1..NV = model.pNoise.sample( model.pNoise, N);     % generate process noiseW = model.oNoise.sample( model.oNoise, N);     % generate observation noiseX = zeros(InfDS.statedim, N);                        % system state buffery = zeros(InfDS.obsdim,N);                           % system observations bufferbearing_0      = -pi+rand(1)*2*pi;bearing_rate_0 = 0.1*randn(1);range_0        = 0.1*randn(1)+1;range_rate_0   = 0.01*randn(1)-0.1;X(:,1) = [range_0*cos(bearing_0);                       % initial target location in 2D-cartesian space         (range_0 + range_rate_0)*cos(addangle(bearing_0,bearing_rate_0)) - range_0*cos(bearing_0);         range_0*sin(bearing_0);         (range_0 + range_rate_0)*sin(addangle(bearing_0,bearing_rate_0)) - range_0*sin(bearing_0)];y(:,1) = model.hfun( model, X(:,1), W(:,1), []);  % initial observationfor k=2:N,    X(:,k) = model.ffun( model, X(:,k-1), V(:,k-1), []);    y(:,k) = model.hfun( model, X(:,k), W(:,k), []);endtrue_range   = sqrt(X(1,:).^2 + X(3,:).^2);             % calculate range ground truth trajectorytrue_bearing = atan2(X(3,:), X(1,:));                   % calculate bearing ground truth trajectory%--- Use a couple of different filters...lftype = {'srcdkf','pf','sppf','gmsppf'};figure(1); clf;for k=1:4,      ftype = lftype{k};      %--- Setup estimation buffers  Xh = zeros(InfDS.statedim, N);  Sx = eye(InfDS.statedim);  range_error   = zeros(1,N);  bearing_error = zeros(1,N);  pos_error     = zeros(1,N);  %--- Determine initial uncertainty in vehicle position  Nstat = 10000;  Wstat = model.oNoise.sample( model.oNoise, Nstat);  bearing_stat      = bearing_0 + sqrt(model.oNoise.cov(1,1))*randn(1,Nstat);  bearing_rate_stat = 0.1*randn(1,Nstat);  range_stat        = 0.1*randn(1,Nstat)+1;  range_rate_stat   = 0.01*randn(1,Nstat)-0.1;  Xstat = [range_stat.*cos(bearing_stat);         (range_stat + range_rate_stat).*cos(addangle(bearing_stat,bearing_rate_stat)) - range_stat.*cos(bearing_stat);         range_stat.*sin(bearing_stat);         (range_stat + range_rate_stat).*sin(addangle(bearing_stat,bearing_rate_stat)) - range_stat.*sin(bearing_stat)];  Mu0 = mean(Xstat,2);  P0  = cov(Xstat');  Xh(:,1) = Mu0;                  % initial state distribution : mean  Sx = chol(P0)';                 % initial state distribution : covariance Cholesky factor  %--- Display target trajectory detail  figure(1); subplot(3,4,k);  p1=plot(X(1,:),X(3,:),'-*'); hold on;  p2=plot(X(1,1),X(3,1),'c*');  p3=plot(X(1,end),X(3,end),'m*');  p4=plot(0,0,'kx','linewidth',2); hold off;  %legend([p1 p2 p3 p4],'target trajectory','position : k=0',['position : k=' num2str(N)],'observer position',0);  xlabel('x');  ylabel('y');  title(['Target Trajectory - ' ftype]);  axis tight  vmin1 = axis;  vmax1 = axis;    subplot(3,4,k+4);  p11=plot(1:N,true_range,'b-o');  xlabel('k');  ylabel('range');  title(['Range Profile - ' ftype]);  %legend([p11],'true');  axis tight  vmin2 = axis;  vmax2 = axis;  subplot(3,4,k+8);  p13=plot(1:N,true_bearing,'b-o'); hold on;  p14=plot(1:N,y(1,:),'k+'); hold off;  %legend([p13 p14],'true bearing','measured bearing',0);  xlabel('time : k');  ylabel('bearing : radians');  title(['Bearing Profile - ' ftype]);  axis tight  vmin3 = axis;  vmax3 = axis;    drawnow%-------------------------------------------------------switch ftypecase {'pf','gspf','gmsppf'}  numParticles = 1000;                        % number of particlesotherwise  numParticles = 200;endbearing_stat      = bearing_0+sqrt(model.oNoise.cov(1,1))*randn(1,numParticles);bearing_rate_stat = 0.1*randn(1,numParticles);range_stat        = 0.1*randn(1,numParticles)+1;range_rate_stat   = 0.01*randn(1,numParticles)-0.1;initialParticles = [range_stat.*cos(bearing_stat);                    (range_stat + range_rate_stat).*cos(addangle(bearing_stat,bearing_rate_stat)) - range_stat.*cos(bearing_stat);                    range_stat.*sin(bearing_stat);                    (range_stat + range_rate_stat).*sin(addangle(bearing_stat,bearing_rate_stat)) - range_stat.*sin(bearing_stat)];initialParticles = Sx*randn(InfDS.statedim,numParticles) + cvecrep(Mu0,numParticles);initialParticlesCov = repmat(Sx,[1 1 numParticles]);  % particle covariances%=================================================================================================================%--- Run estimator on observed data (noisy bearing readings)disp([ftype ' : Estimating trajectory...']);  switch ftype  %---------------------------------------------------------------------------------------------------------  case 'pf'      [pNoise, oNoise, InfDS] = gensysnoiseds(InfDS, ftype);     % call system noise sources generation function      ParticleFiltDS.N = numParticles;      ParticleFiltDS.particles = initialParticles;      ParticleFiltDS.weights = (1/numParticles)*ones(1,numParticles);      InfDS.resampleThreshold = 1;    % set resample threshold      InfDS.estimateType = 'mean';    % estimate type for Xh      [Xh, ParticleFiltDS] = pf(ParticleFiltDS, pNoise, oNoise, y, [], [], InfDS);  %---------------------------------------------------------------------------------------------------------  case 'gmsppf'      [pNoise, oNoise, InfDS] = gensysnoiseds(InfDS, ftype);     % call system noise sources generation function      ParticleFiltDS.N = numParticles;      % number of particles      ParticleFiltDS.stateGMM = gmmfit(initialParticles, 5, [0.001 10], 'sqrt');  % fit a 5 component GMM to initial state distribution      InfDS.estimateType = 'mean';    % estimate type for Xh      InfDS.spkfType = 'srcdkf';      % Type of SPKF to use inside SPPF (note that ParticleFiltDS.particlesCov should comply)      InfDS.spkfParams  = sqrt(3);    % scale factor (CDKF parameter h)      [Xh, ParticleFiltDS] = gmsppf(ParticleFiltDS, pNoise, oNoise, y, [], [], InfDS);  %---------------------------------------------------------------------------------------------------------  case 'sppf'      [pNoise, oNoise, InfDS] = gensysnoiseds(InfDS, ftype);     % call system noise sources generation function      InfDS.spkfType = 'srcdkf';      % Type of SPKF to use inside SPPF (note that ParticleFiltDS.particlesCov should comply)      InfDS.spkfParams  = sqrt(3);    % scale factor (CDKF parameter h)      InfDS.resampleThreshold = 1;    % set resample threshold      InfDS.estimateType = 'mean';    % estimate type for Xh      [pNoiseGAUS, oNoiseGAUS, foo] = gensysnoiseds(InfDS, InfDS.spkfType); % generate Gaussian system noise sources for internal SPKFs      % build ParticleFilter data structure      ParticleFiltDS.N = numParticles;              % number of particles      ParticleFiltDS.particles = initialParticles;  % initialize particle means      ParticleFiltDS.particlesCov = initialParticlesCov;  % initialize article covariances      ParticleFiltDS.pNoise = pNoiseGAUS;      % embed SPKF noise sources      ParticleFiltDS.oNoise = oNoiseGAUS;      %   "   "       "    "      ParticleFiltDS.weights = cvecrep(1/numParticles,numParticles); % initialize particle weights      [Xh, ParticleFiltDS] = sppf(ParticleFiltDS, pNoise, oNoise, y, [], [], InfDS);  %---------------------------------------------------------------------------------------------------------  case 'srcdkf'      [pNoise, oNoise, InfDS] = gensysnoiseds(InfDS, ftype);     % call system noise sources generation function      InfDS.spkfParams  = sqrt(3);    % scale factor (CDKF parameter h)      [Xh, Sx] = srcdkf(Xh(:,1), Sx, pNoise, oNoise, y, [], [], InfDS);  %---------------------------------------------------------------------------------------------------------  case 'srukf'      [pNoise, oNoise, InfDS] = gensysnoiseds(InfDS, ftype);     % call system noise sources generation function      InfDS.spkfParams  = [1 2 0];    % scale factor (CDKF parameter h)      [Xh, Sx] = srukf(Xh(:,1), Sx, pNoise, oNoise, y, [], [], InfDS);  %---------------------------------------------------------------------------------------------------------  otherwise      error([' Unknown inference algorithm type ''' ftype '''']);end%=================================================================================================================%--- Calculate errorsrange_estimate = sqrt(Xh(1,:).^2 + Xh(3,:).^2);bearing_estimate = atan2(Xh(3,:), Xh(1,:));range_error   =  range_estimate - true_range;bearing_error =  bearing_estimate - true_bearing;pos_error     =  sqrt((Xh([1;3],:)-X([1;3],:)).^2);%--- Display resultsfigure(1); subplot(3,4,k); hold on;p5=plot(Xh(1,:),Xh(3,:),'r-o');plot(Xh(1,1),Xh(3,1),'c*');plot(Xh(1,end),Xh(3,end),'m*');if (k==1), legend([p1 p2 p3 p4 p5],'trajectory','position: k=0',['position: k=' num2str(N)],'observer','estimate',0); endxlabel('x');ylabel('y');title(['Target Trajectory - ' ftype]);axis tightvmin1 = min([vmin1; axis]);vmax1 = max([vmax1; axis]);hold off;figure(1); subplot(3,4,k+4); hold on;p12=plot(1:N,range_estimate,'r-');xlabel('k');ylabel('range');title(['Range Profile - ' ftype]);%legend([p11 p12],'true','inferred');axis tightvmin2 = min([vmin2; axis]);vmax2 = max([vmax2; axis]);hold off;subplot(3,4,k+8); hold onp15=plot(1:N,bearing_estimate,'r-');xlabel('t');ylabel('bearing');title(['Bearing Profile - ' ftype])axis tightvmin3 = min([vmin3; axis]);vmax3 = max([vmax3; axis]);if (k==1), legend([p13 p14 p15],'true','measured','inferred',0); endhold off;endfor k=1:4,    figure(1);    subplot(3,4,k); axis([vmin1(1) vmax1(2) vmin1(3) vmax1(4)]);    subplot(3,4,k+4); axis([vmin2(1) vmax2(2) vmin2(3) vmax2(4)]);    subplot(3,4,k+8); axis([vmin3(1) vmax3(2) vmin3(3) vmax3(4)]);end%--- House keepingremrelpath('../gssm');       % remove relative search path to example GSSM files from MATLABPATHremrelpath('../data');       % remove relative search path to example data files from MATLABPATH

⌨️ 快捷键说明

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