?? pf2.m
字號:
function [xArray, xhatArray] = ParticleEx2
% Particle filter example.粒子濾波的例子
% Track a body falling through the atmosphere. 跟蹤在空氣中降落的物體
% This system is taken from [Jul00], which was based on [Ath68]. 這個系統來自[Jul00]
,基于[Ath68]。
rho0 = 2; % lb-sec^2/ft^4
g = 32.2; % ft/sec^2
k = 2e4; % ft
R = 10^4; % measurement noise variance (ft^2) 測量噪聲的不一致
Q = diag([0 0 0]); % process noise covariance 過程噪聲的協方差
M = 10^5; % horizontal range of position sensor 位置檢測器的水平的范圍
a = 10^5; % altitude of position sensor 位置檢測器的高度
P = diag([1e6 4e6 10]); % initial estimation error covariance 起始估計誤差的協方差
x = [3e5; -2e4; 1e-3]; % initial state 初始狀態
xhat = [3e5; -2e4; 1e-3]; % initial state estimate 初始狀態估計
N = 1000; % number of particles 粒子的個數
% Initialize the particle filter. 粒子濾波器的初始化
for i = 1 : N
xhatplus(:,i) = x + sqrt(P) * [randn; randn; randn];
end
T = 0.5; % measurement time step 測量時間間隔
randn('state',sum(100*clock)); % random number generator seed 任意數量的發生器
tf = 30; % simulation length (seconds) 仿真的時間長度(秒)
dt = 0.04; % time step for integration (seconds) 總體時間步調(秒)
xArray = x; 初始狀態矩陣
xhatArray = xhat; 初始狀態估計矩陣
for t = T : T : tf 從0.5秒開始到30秒結束,步幅為0.5秒。
fprintf('.'); 用點來表示
% Simulate the system. 仿真這個系統
for tau = dt : dt : T 從0.04到0.5秒,步幅為0.04秒。
% Fourth order Runge Kutta ingegration
dx1(1,1) = x(2);
dx1(2,1) = rho0 * exp(-x(1)/k) * x(2)^2 / 2 * x(3) - g;
dx1(3,1) = 0;
dx1 = dx1 * dt;
xtemp = x + dx1 / 2;
dx2(1,1) = xtemp(2);
dx2(2,1) = rho0 * exp(-xtemp(1)/k) * xtemp(2)^2 / 2 * xtemp(3) - g;
dx2(3,1) = 0;
dx2 = dx2 * dt;
xtemp = x + dx2 / 2;
dx3(1,1) = xtemp(2);
dx3(2,1) = rho0 * exp(-xtemp(1)/k) * xtemp(2)^2 / 2 * xtemp(3) - g;
dx3(3,1) = 0;
dx3 = dx3 * dt;
xtemp = x + dx3;
dx4(1,1) = xtemp(2);
dx4(2,1) = rho0 * exp(-xtemp(1)/k) * xtemp(2)^2 / 2 * xtemp(3) - g;
dx4(3,1) = 0;
dx4 = dx4 * dt;
x = x + (dx1 + 2 * dx2 + 2 * dx3 + dx4) / 6;
x = x + sqrt(dt * Q) * [randn; randn; randn] * dt;
end
% Simulate the noisy measurement. 仿真噪聲的度量
z = sqrt(M^2 + (x(1)-a)^2) + sqrt(R) * randn;
% Simulate the continuous-time part of the particle filter (time update). 仿真連續時間部分的粒子濾波(時間更新)
xhatminus = xhatplus;
for i = 1 : N
for tau = dt : dt : T
% Fourth order Runge Kutta ingegration
xtemp = xhatminus(:,i);
dx1(1,1) = xtemp(2);
dx1(2,1) = rho0 * exp(-xtemp(1)/k) * xtemp(2)^2 / 2 * xtemp(3) - g;
dx1(3,1) = 0;
dx1 = dx1 * dt;
xtemp = xhatminus(:,i) + dx1 / 2;
dx2(1,1) = xtemp(2);
dx2(2,1) = rho0 * exp(-xtemp(1)/k) * xtemp(2)^2 / 2 * xtemp(3) - g;
dx2(3,1) = 0;
dx2 = dx2 * dt;
xtemp = xhatminus(:,i) + dx2 / 2;
dx3(1,1) = xtemp(2);
dx3(2,1) = rho0 * exp(-xtemp(1)/k) * xtemp(2)^2 / 2 * xtemp(3) - g;
dx3(3,1) = 0;
dx3 = dx3 * dt;
xtemp = xhatminus(:,i) + dx3;
dx4(1,1) = xtemp(2);
dx4(2,1) = rho0 * exp(-xtemp(1)/k) * xtemp(2)^2 / 2 * xtemp(3) - g;
dx4(3,1) = 0;
dx4 = dx4 * dt;
xhatminus(:,i) = xhatminus(:,i) + (dx1 + 2 * dx2 + 2 * dx3 + dx4) / 6;
xhatminus(:,i) = xhatminus(:,i) + sqrt(dt * Q) * [randn; randn; randn] *
dt;
xhatminus(3,i) = max(0, xhatminus(3,i)); % the ballistic coefficient
cannot be negative
end
zhat = sqrt(M^2 + (xhatminus(1,i)-a)^2);
vhat(i) = z - zhat;
end
% Note that we need to scale all of the q(i) probabilities in a way that does not change
需要注意的是,我們需要用一種不改變他們相對量級的方法來測量q(i)的所有可能值,否則所有的q(i)的值將變為0,因為指數的大值。
% their relative magnitudes. Otherwise all of the q(i) elements will be zero because of the
% large value of the exponential.
vhatscale = max(abs(vhat)) / 4;
qsum = 0;
for i = 1 : N
q(i) = exp(-(vhat(i)/vhatscale)^2);
qsum = qsum + q(i);
end
% Normalize the likelihood of each a priori estimate. 每個預先估計可能值的歸一化
for i = 1 : N
q(i) = q(i) / qsum;
end
% Resample. 重采樣
for i = 1 : N
u = rand; % uniform random number between 0 and 1
qtempsum = 0;
for j = 1 : N
qtempsum = qtempsum + q(j);
if qtempsum >= u
xhatplus(:,i) = xhatminus(:,j);
% Use roughening to prevent sample impoverishment. 利用粗加工防止樣本的缺乏
E = max(xhatminus')' - min(xhatminus')';
sigma = 0.2 * E * N^(-1/length(x));
xhatplus(:,i) = xhatplus(:,i) + sigma .* [randn; randn; randn];
xhatplus(3,i) = max(0,xhatplus(3,i)); % the ballistic coefficient
cannot be negative
break;
end
end
end
% The particle filter estimate is the mean of the particles. 粒子濾波器的估計
xhat = 0;
for i = 1 : N
xhat = xhat + xhatplus(:,i);
end
xhat = xhat / N;
% Save data for plotting.
xArray = [xArray x];
xhatArray = [xhatArray xhat];
end
close all;
t = 0 : T : tf;
figure;
semilogy(t, abs(xArray(1,:) - xhatArray(1,:)), 'b'); hold;
set(gca,'FontSize',12); set(gcf,'Color','White');
xlabel('Seconds');
ylabel('Altitude Estimation Error');
figure;
semilogy(t, abs(xArray(2,:) - xhatArray(2,:)), 'b'); hold;
set(gca,'FontSize',12); set(gcf,'Color','White');
xlabel('Seconds');
ylabel('Velocity Estimation Error');
figure;
semilogy(t, abs(xArray(3,:) - xhatArray(3,:)), 'b'); hold;
set(gca,'FontSize',12); set(gcf,'Color','White');
xlabel('Seconds');
ylabel('Ballistic Coefficient Estimation Error');
figure;
plot(t, xArray(1,:));
set(gca,'FontSize',12); set(gcf,'Color','White');
xlabel('Seconds');
ylabel('True Position');
figure;
plot(t, xArray(2,:));
title('Falling Body Simulation', 'FontSize', 12);
set(gca,'FontSize',12); set(gcf,'Color','White');
xlabel('Seconds');
ylabel('True Velocity');
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -