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

📄 main.m

📁 卡尔曼在目标跟踪中的应用本文对作匀速运动的二维空中机动目标进行研究
💻 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 + -