From 014fd867d0acecc454ae019f6774ffaecccd00a0 Mon Sep 17 00:00:00 2001 From: Atsushi Sakai Date: Fri, 2 Feb 2018 14:14:55 -0800 Subject: [PATCH] first release PF localization --- .../particle_filter/particle_filter.py | 159 +++++++----------- 1 file changed, 58 insertions(+), 101 deletions(-) diff --git a/Localization/particle_filter/particle_filter.py b/Localization/particle_filter/particle_filter.py index 3a6a2d50..b1f64804 100644 --- a/Localization/particle_filter/particle_filter.py +++ b/Localization/particle_filter/particle_filter.py @@ -6,92 +6,16 @@ author: Atsushi Sakai (@Atsushi_twi) """ -# pw=Normalize(pw,NP);%正規化 -# [px,pw]=Resampling(px,pw,NTh,NP);%リサンプリング -# xEst=px*pw';%最終推定値は期待値 - -# %Animation (remove some flames) -# if rem(i,5)==0 -# hold off; -# arrow=0.5; -# %パーティクル表示 -# for ip=1:NP -# quiver(px(1,ip),px(2,ip),arrow*cos(px(3,ip)),arrow*sin(px(3,ip)),'ok');hold on; -# end -# plot(result.xTrue(:,1),result.xTrue(:,2),'.b');hold on; -# plot(RFID(:,1),RFID(:,2),'pk','MarkerSize',10);hold on; -# %観測線の表示 -# if~isempty(z) -# for iz=1:length(z(:,1)) -# ray=[xTrue(1:2)';z(iz,2:3)]; -# plot(ray(:,1),ray(:,2),'-r');hold on; -# end -# end -# plot(result.xd(:,1),result.xd(:,2),'.k');hold on; -# plot(result.xEst(:,1),result.xEst(:,2),'.r');hold on; -# axis equal; -# grid on; -# drawnow; -# -# function [px,pw]=Resampling(px,pw,NTh,NP) -# %リサンプリングを実施する関数 -# %アルゴリズムはLow Variance Sampling -# Neff=1.0/(pw*pw'); -# if Neffwcum(ind)) -# ind=ind+1; -# end -# px(:,ip)=ppx(:,ind);%LVSで選ばれたパーティクルに置き換え -# pw(ip)=1/NP;%尤度は初期化 -# end -# end - -# function pw=Normalize(pw,NP) -# %重みベクトルを正規化する関数 -# sumw=sum(pw); -# if sumw~=0 -# pw=pw/sum(pw);%正規化 -# else -# pw=zeros(1,NP)+1/NP; -# end - - -# function p=Gauss(x,u,sigma) -# %ガウス分布の確率密度を計算する関数 -# p=1/sqrt(2*pi*sigma^2)*exp(-(x-u)^2/(2*sigma^2)); - -# %Calc Observation from noise prameter -# function [z, x, xd, u] = Observation(x, xd, u, RFID,MAX_RANGE) -# global Qsigma; -# global Rsigma; - -# x=f(x, u);% Ground Truth -# u=u+sqrt(Qsigma)*randn(2,1);%add Process Noise -# xd=f(xd, u);% Dead Reckoning -# %Simulate Observation -# z=[]; -# for iz=1:length(RFID(:,1)) -# d=norm(RFID(iz,:)-x(1:2)'); -# if d wcum[0, ind]: + ind += 1 + inds.append(ind) + + px = px[:, inds] + pw = np.matrix(np.zeros((1, NP))) + 1.0 / NP # init weight + + return px, pw + + def plot_covariance_ellipse(xEst, PEst): Pxy = PEst[0:2, 0:2] eigval, eigvec = np.linalg.eig(Pxy) @@ -242,7 +200,6 @@ def main(): px = np.matrix(np.zeros((4, NP))) # Particle store pw = np.matrix(np.zeros((1, NP))) + 1.0 / NP # Particle weight - xDR = np.matrix(np.zeros((4, 1))) # Dead reckoning # history @@ -256,7 +213,7 @@ def main(): xTrue, z, xDR, ud = observation(xTrue, xDR, u, RFID) - xEst, PEst, px, pw = pf_estimation(px, pw, xEst, PEst, z, ud) + xEst, PEst, px, pw = pf_localization(px, pw, xEst, PEst, z, ud) # store data history hxEst = np.hstack((hxEst, xEst))