?? main.m
字號:
T=1;
alpha=0.8; % 加權衰減因子
window=1/(1-alpha); % 檢測機動的有效窗口長度
dt=100; % dt=dt_x=dt_y=100
Th=25; % 機動檢測門限
Ta=9.49; % 退出機動的檢測門限
N=155/T; % 采樣次數
M=50; % 模擬次數
ar=20;
r=(300)^2/ar;
w=pi*300/r;
% 真實軌跡數據1,向心加速度等于20m/s^2
t0=1:1:70;
xo0=-21000+300*t0;
yo0=4500+0*t0;
t1=0:1:15;
xo1=r*sin(w*t1)%+xo0(70);
yo1=r*cos(w*t1)%+yo0(70);
t2=1:1:70;
xo2=xo1(16)-300*t2;
yo2=yo1(16)+0*t2;
x=[xo0,xo1,xo2];
y=[yo0,yo1,yo2];
e_x1=zeros(1,N);
e_x2=zeros(1,N);
e_y1=zeros(1,N);
e_y2=zeros(1,N);
px=zeros(1,N);
qy=zeros(1,N);
u=zeros(1,N);
u_a=zeros(1,N);
for j=1:M
no1=50*randn(1,N); % 隨機白噪
no2=50*randn(1,N);
for i=1:N;
zx(i)=x(i)+no1(i); % 觀測數據
zy(i)=y(i)+no2(i);
z(:,i)=[zx(i);zy(i)];
end
%
X_estimate(2,:)=[zx(2),(zx(2)-zx(1))/T,zy(2),(zy(2)-zy(1))/T];
X_est=X_estimate(2,:);
P_estimate=[dt^2,dt^2/T,0,0;dt^2/T,(dt^2)*2/(T^2),0,0;0,0,dt^2,dt^2/T;0,0,dt^2/T,(dt^2)*2/(T^2)];
x1(1)=zx(1); y1(1)=zy(1); x1(2)=X_estimate(2,1); y1(2)=X_estimate(2,3);
u(1)=0; u(2)=0;
u1=u(2);
pp=0;% 0表示非機動,1表示機動
qq=0;
rr=1;
k=3;
while k<=N
if k<=20
z1=z(:,k);
[X_pre,X_est,P_estimate,u1]=kalmanstatic(X_est,P_estimate,z1,k,u1);
X_estimate(k,:)=X_est;
X_predict(k,:)=X_pre;
P(k,:)=[P_estimate(1,1),P_estimate(1,2),P_estimate(2,2),P_estimate(3,3),P_estimate(3,4),P_estimate(4,4)];
x1(k)=X_estimate(k,1);
y1(k)=X_estimate(k,3);
u(k)=u1;
k=k+1;
else
if pp==0 % 進入非機動模型
if rr==window+1 % 由機動進入非機動模型,為防止回朔,至少遞推window+1次
u1=0;
else
end
while rr>0
z1=z(:,k);
[X_pre,X_est,P_estimate,u1]=kalmanstatic(X_est,P_estimate,z1,k,u1);
X_estimate(k,:)=X_est;
X_predict(k,:)=X_pre;
P(k,:)=[P_estimate(1,1),P_estimate(1,2),P_estimate(2,2),P_estimate(3,3),P_estimate(3,4),P_estimate(4,4)];
x1(k)=X_estimate(k,1);
y1(k)=X_estimate(k,3);
u(k)=u1;
rr=rr-1;
end
rr=1;
if u(k)>=Th
pp=1;qq=1; % “pp=1,qq=1”表示由非機動進入機動模型
else
end
k=k+1;
else % 機動模型
if qq==1 %由非機動進入機動模型,需要進行修正
k=k-window-1;
Xm_est=[X_estimate(k-1,:),0,0];
Xm_pre=[X_predict(k,:),0,0];
Pm_estimate=zeros(6,6);
P=P(k-1,:);
m=0;
else %在機動模型中進行遞推
Xm_est=Xm_estimate(k-1,:);
end
z1=z(:,k);
[Xm_est,Pm_estimate,ua1,qq,m]=kalmandynamic(Xm_pre,Xm_est,Pm_estimate,z1,k,P,qq,m);
Xm_estimate(k,:)=Xm_est;
x1(k)=Xm_estimate(k,1);
y1(k)=Xm_estimate(k,3);
ua(k)=ua1;
if ua1<Ta % 進入非機動模型,降維,標志 pp=0
X_est=Xm_estimate(k,1:4);
P_estimate=Pm_estimate(1:4,1:4);
pp=0;
rr=window+1;
else
end
k=k+1;
end
end
end
for j=1:N
px(1,j)=x1(1,j)+px(1,j); % 迭加每次估計的數據
qy(1,j)=y1(1,j)+qy(1,j);
e_x1(j)=(x1(j)-x(j))+e_x1(j);
e_y1(j)=(y1(j)-y(j))+e_y1(j);
e_x2(j)=((x1(j)-x(j))^2)+e_x2(j);
e_y2(j)=((y1(j)-y(j))^2)+e_y2(j);
end
for k=1:N
px(1,k)=px(1,k)/M;
qy(1,k)=qy(1,k)/M;
e_x(k)=e_x1(k)/M;
ex(k)=sqrt(e_x2(k)/M-e_x(k)^2);
e_y(k)=e_y1(k)/M;
ey(k)=sqrt(e_y2(k)/M-e_y(k)^2);
end
figure(1);
subplot(1,2,1),plot(x,y,'b',zx,zy,'k');
legend('真實軌跡','觀測軌跡');
subplot(1,2,2),plot(zx,zy,'k',px,zy,'r');
legend('觀測軌跡','50次濾波軌跡');
figure(2);
plot(x,y,'k',x1,y1,'r');
legend('真實軌跡','一次濾波軌跡');
figure(3);
subplot(2,2,1),plot(e_x); title('X坐標 濾波誤差均值曲線');
subplot(2,2,2),plot(e_y); title('Y坐標 濾波誤差均值曲線');
subplot(2,2,3),plot(ex); title('X坐標 濾波誤差標準差曲線');
subplot(2,2,4),plot(ey); title('Y坐標 濾波誤差標準差曲線');
% figure; plot(e_x); title('X坐標 濾波誤差均值曲線');
% figure; plot(e_y); title('Y坐標 濾波誤差均值曲線');
% figure; plot(ex); title('X坐標 濾波誤差標準差曲線');
% figure; plot(ey); title('Y坐標 濾波誤差標準差曲線');
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -