ParticleEx5.m
上传用户:shigeng
上传日期:2017-01-30
资源大小:122k
文件大小:8k
开发平台:

Matlab

  1. function [StdErr, EKFErr] = ParticleEx5
  2. % EKF Particle filter example.
  3. % Track a body falling through the atmosphere.
  4. % This system is taken from [Jul00], which was based on [Ath68].
  5. % Compare the particle filter with the EKF particle filter.
  6. global rho0 g k dt
  7. rho0 = 2; % lb-sec^2/ft^4
  8. g = 32.2; % ft/sec^2
  9. k = 2e4; % ft
  10. R = 10^4; % measurement noise variance (ft^2)
  11. Q = diag([0 0 0]); % process noise covariance
  12. M = 10^5; % horizontal range of position sensor
  13. a = 10^5; % altitude of position sensor
  14. P = diag([1e6 4e6 10]); % initial estimation error covariance
  15. x = [3e5; -2e4; 1e-3]; % initial state
  16. xhat = [3e5; -2e4; 1e-3]; % initial state estimate
  17. N = 200; % number of particles  
  18. % Initialize the particle filter.
  19. for i = 1 : N
  20.     xhatplus(:,i) = x + sqrt(P) * [randn; randn; randn]; % standard particle filter
  21.     xhatplusEKF(:,i) = xhatplus(:,i); % EKF particle filter
  22.     Pplus(:,:,i) = P; % initial EKF particle filter estimation error covariance
  23. end
  24. T = 0.5; % measurement time step
  25. randn('state',sum(100*clock)); % random number generator seed
  26. tf = 30; % simulation length (seconds)
  27. dt = 0.5; % time step for integration (seconds)
  28. xArray = x;
  29. xhatArray = xhat;
  30. xhatEKFArray = xhat;
  31. for t = T : T : tf
  32.     fprintf('.');
  33.     % Simulate the system.
  34.     for tau = dt : dt : T
  35.         % Fourth order Runge Kutta ingegration
  36.         [dx1, dx2, dx3, dx4] = RungeKutta(x);
  37.         x = x + (dx1 + 2 * dx2 + 2 * dx3 + dx4) / 6;
  38.         x = x + sqrt(dt * Q) * [randn; randn; randn] * dt;
  39.     end
  40.     % Simulate the noisy measurement.
  41.     z = sqrt(M^2 + (x(1)-a)^2) + sqrt(R) * randn;
  42.     % Simulate the continuous-time part of the particle filters (time update).
  43.     xhatminus = xhatplus;
  44.     xhatminusEKF = xhatplusEKF;
  45.     for i = 1 : N
  46.         for tau = dt : dt : T
  47.             % Fourth order Runge Kutta ingegration
  48.             % standard particle filter
  49.             [dx1, dx2, dx3, dx4] = RungeKutta(xhatminus(:,i));
  50.             xhatminus(:,i) = xhatminus(:,i) + (dx1 + 2 * dx2 + 2 * dx3 + dx4) / 6;
  51.             xhatminus(:,i) = xhatminus(:,i) + sqrt(dt * Q) * [randn; randn; randn] * dt;
  52.             xhatminus(3,i) = max(0, xhatminus(3,i)); % the ballistic coefficient cannot be negative
  53.             % EKF particle filter
  54.             [dx1, dx2, dx3, dx4] = RungeKutta(xhatminusEKF(:,i));
  55.             xhatminusEKF(:,i) = xhatminusEKF(:,i) + (dx1 + 2 * dx2 + 2 * dx3 + dx4) / 6;
  56.             xhatminusEKF(:,i) = xhatminusEKF(:,i) + sqrt(dt * Q) * [randn; randn; randn] * dt;
  57.             xhatminusEKF(3,i) = max(0, xhatminusEKF(3,i)); % the ballistic coefficient cannot be negative
  58.         end
  59.         % standard particle filter
  60.         zhat = sqrt(M^2 + (xhatminus(1,i)-a)^2);
  61.         vhat(i) = z - zhat;
  62.         % EKF particle filter
  63.         zhatEKF = sqrt(M^2 + (xhatminusEKF(1,i)-a)^2);
  64.         F = [0 1 0; -rho0 * exp(-xhatminusEKF(1,i)/k) * xhatminusEKF(2,i)^2 / 2 / k * xhatminusEKF(3,i) ...
  65.             rho0 * exp(-xhatminusEKF(1,i)/k) * xhatminusEKF(2,i) * xhatminusEKF(3,i) ...
  66.             rho0 * exp(-xhatminusEKF(1,i)/k) * xhatminusEKF(2,i)^2 / 2; ...
  67.             0 0 0];
  68.         H = [(xhatminusEKF(1,i) - a) / sqrt(M^2 + (xhatminusEKF(1,i)-a)^2) 0 0];
  69.         Pminus(:,:,i) = F * Pplus(:,:,i) * F' + Q;
  70.         K = Pminus(:,:,i) * H' * inv(H * Pminus(:,:,i) * H' + R);
  71.         xhatminusEKF(:,i) = xhatminusEKF(:,i) + K * (z - zhatEKF);
  72.         zhatEKF = sqrt(M^2 + (xhatminusEKF(1,i)-a)^2);
  73.         vhatEKF(i) = z - zhatEKF;
  74.     end
  75.     % Note that we need to scale all of the q(i) probabilities in a way
  76.     % that does not change their relative magnitudes.
  77.     % Otherwise all of the q(i) elements will be zero because of the
  78.     % large value of the exponential.
  79.     % standard particle filter
  80.     vhatscale = max(abs(vhat)) / 4;
  81.     qsum = 0;
  82.     for i = 1 : N
  83.         q(i) = exp(-(vhat(i)/vhatscale)^2);
  84.         qsum = qsum + q(i);
  85.     end
  86.     % Normalize the likelihood of each a priori estimate.
  87.     for i = 1 : N
  88.         q(i) = q(i) / qsum;
  89.     end
  90.     % EKF particle filter
  91.     vhatscaleEKF = max(abs(vhatEKF)) / 4;
  92.     qsumEKF = 0;
  93.     for i = 1 : N
  94.         qEKF(i) = exp(-(vhatEKF(i)/vhatscaleEKF)^2);
  95.         qsumEKF = qsumEKF + qEKF(i);
  96.     end
  97.     % Normalize the likelihood of each a priori estimate.
  98.     for i = 1 : N
  99.         qEKF(i) = qEKF(i) / qsumEKF;
  100.     end
  101.     % Resample the standard particle filter
  102.     for i = 1 : N
  103.         u = rand; % uniform random number between 0 and 1
  104.         qtempsum = 0;
  105.         for j = 1 : N
  106.             qtempsum = qtempsum + q(j);
  107.             if qtempsum >= u
  108.                 xhatplus(:,i) = xhatminus(:,j);
  109.                 xhatplus(3,i) = max(0,xhatplus(3,i)); % the ballistic coefficient cannot be negative
  110.                 break;
  111.             end
  112.         end
  113.     end
  114.     % The standard particle filter estimate is the mean of the particles.
  115.     xhat = mean(xhatplus')';
  116.     % Resample the EKF particle filter
  117.     Ptemp = Pplus;
  118.     for i = 1 : N
  119.         u = rand; % uniform random number between 0 and 1
  120.         qtempsum = 0;
  121.         for j = 1 : N
  122.             qtempsum = qtempsum + qEKF(j);
  123.             if qtempsum >= u
  124.                 xhatplusEKF(:,i) = xhatminusEKF(:,j);
  125.                 xhatplusEKF(3,i) = max(0,xhatplusEKF(3,i)); % the ballistic coefficient cannot be negative
  126.                 Pplus(:,:,i) = Ptemp(:,:,j);
  127.                 break;
  128.             end
  129.         end
  130.     end
  131.     % The EKF particle filter estimate is the mean of the particles.
  132.     xhatEKF = mean(xhatplusEKF')';
  133.     % Save data for plotting.
  134.     xArray = [xArray x];
  135.     xhatArray = [xhatArray xhat];
  136.     xhatEKFArray = [xhatEKFArray xhatEKF];
  137. end
  138. close all;
  139. t = 0 : T : tf;
  140. figure; 
  141. semilogy(t, abs(xArray(1,:) - xhatArray(1,:)), 'b-'); hold;
  142. semilogy(t, abs(xArray(1,:) - xhatEKFArray(1,:)), 'r:'); 
  143. set(gca,'FontSize',12); set(gcf,'Color','White');
  144. xlabel('Seconds');
  145. ylabel('Altitude Estimation Error');
  146. legend('Standard particle filter', 'EKF particle filter');
  147. figure; 
  148. semilogy(t, abs(xArray(2,:) - xhatArray(2,:)), 'b-'); hold;
  149. semilogy(t, abs(xArray(2,:) - xhatEKFArray(2,:)), 'r:');
  150. set(gca,'FontSize',12); set(gcf,'Color','White');
  151. xlabel('Seconds');
  152. ylabel('Velocity Estimation Error');
  153. legend('Standard particle filter', 'EKF particle filter');
  154. figure; 
  155. semilogy(t, abs(xArray(3,:) - xhatArray(3,:)), 'b-'); hold;
  156. semilogy(t, abs(xArray(3,:) - xhatEKFArray(3,:)), 'r:'); 
  157. set(gca,'FontSize',12); set(gcf,'Color','White');
  158. xlabel('Seconds');
  159. ylabel('Ballistic Coefficient Estimation Error');
  160. legend('Standard particle filter', 'EKF particle filter');
  161. figure;
  162. plot(t, xArray(1,:));
  163. set(gca,'FontSize',12); set(gcf,'Color','White');
  164. xlabel('Seconds');
  165. ylabel('True Position');
  166. figure;
  167. plot(t, xArray(2,:));
  168. title('Falling Body Simulation', 'FontSize', 12);
  169. set(gca,'FontSize',12); set(gcf,'Color','White');
  170. xlabel('Seconds');
  171. ylabel('True Velocity');
  172. for i = 1 : 3
  173.     StdErr(i) = sqrt((norm(xArray(i,:) - xhatArray(i,:)))^2 / tf / dt);
  174.     EKFErr(i) = sqrt((norm(xArray(i,:) - xhatEKFArray(i,:)))^2 / tf / dt);
  175. end
  176. disp(['Standard particle filter RMS error = ', num2str(StdErr)]);
  177. disp(['EKF particle filter RMS error = ', num2str(EKFErr)]);
  178. function [dx1, dx2, dx3, dx4] = RungeKutta(x)
  179. % Fourth order Runge Kutta integration for the falling body system.
  180. global rho0 g k dt
  181. dx1(1,1) = x(2);
  182. dx1(2,1) = rho0 * exp(-x(1)/k) * x(2)^2 / 2 * x(3) - g;
  183. dx1(3,1) = 0;
  184. dx1 = dx1 * dt;
  185. xtemp = x + dx1 / 2;
  186. dx2(1,1) = xtemp(2);
  187. dx2(2,1) = rho0 * exp(-xtemp(1)/k) * xtemp(2)^2 / 2 * xtemp(3) - g;
  188. dx2(3,1) = 0;
  189. dx2 = dx2 * dt;
  190. xtemp = x + dx2 / 2;
  191. dx3(1,1) = xtemp(2);
  192. dx3(2,1) = rho0 * exp(-xtemp(1)/k) * xtemp(2)^2 / 2 * xtemp(3) - g;
  193. dx3(3,1) = 0;
  194. dx3 = dx3 * dt;
  195. xtemp = x + dx3;
  196. dx4(1,1) = xtemp(2);
  197. dx4(2,1) = rho0 * exp(-xtemp(1)/k) * xtemp(2)^2 / 2 * xtemp(3) - g;
  198. dx4(3,1) = 0;
  199. dx4 = dx4 * dt;
  200. return;