单观测站纯方位EKF算法

建立水下纯方位目标单观测站系统,目标做匀速直线运动,观测站静止位于坐标原点,采用EKF非线性滤波算法跟踪水下运动目标,以下是matlab代码:

%%单观测站EKF方法
%%目标匀速直线运动,观测站静止
clear all; clc;close all;
x=0;          %%观测站x坐标
y=0;           %%观测站Y坐标

DS0=5000;            	    %目标初始距离      
V=15;                      	%速度范围30-70kn
DA=120/180*pi;  			%目标航向角
D=-30/180*pi;       	    %起始方位角
X0=DS0*sin(D);    	        %目标起点坐标
Y0=DS0*cos(D);
Vx=V*sin(DA);
Vy=V*cos(DA);

N=500;                  %%采样点数
T=1;
t=[1:N]*T;              %%观测时刻
Xt=X0+Vx*t;             %%目标瞬时坐标
Yt=Y0+Vy*t;

B0=atan((Xt-x)./(Yt-y));       %%观测站准确方位角

err_x=zeros(1,N);%分配空间
err_y=zeros(1,N);
err_vy=zeros(1,N);
err_vx=zeros(1,N);

for num=1:1                        %%蒙特卡罗实验数目
    errB=2.5/180*pi.*randn(1,N);    %%方位角测量误差
    B0=B0+errB;                     %%实际测量方位角
    Z=B0;
%%---运动目标为匀速模型,有噪声驱动的加速度
    F=[1 0 T 0; 0 1 0 T; 0 0 1 0; 0 0 0 1];    %%状态转移方程
    G=[T^2/2 0; 0 T^2/2; T 0; 0 T];            %%噪声转移方程
    v=diag([0.01,0.02]); 
    x0=[X0 Y0 Vx Vy]';                         %%状态矢量初始值[X Y Vx Vy]
    Xk(:,1)=x0;
    q=v;
    P0=eye(4,4);                              %%初始误差矩阵
    R=[1/180*pi];                             %%%观测角度的测量方差
    H=zeros(1,4);
    figure(1)
    plot(x(1),y(1),'mo')
   box on
    grid on
    hold on
    plot(Xt,Yt,'k')
    %title('目标航迹')
   
    for i=2:N                                   %%EKF迭代过程
        Xn=F*x0;
        Pp=F*P0*F'+G*q*G';
        tx=Xn(1);
        ty=Xn(2);
        
        H(1,1)=(ty-y(1))/((ty-y(1))^2+(tx-x(1))^2);
        H(1,2)=-(tx-x(1))/((ty-y(1))^2+(tx-x(1))^2);
        K=Pp*H'*inv(H*Pp*H'+R);
   
        Zp=atan((tx-x(1))/(ty-y(1)));
        
        Xk(:,i)=Xn+K*(Z(:,i)-Zp);
        
        Pk=(eye(4)-K*H)*Pp;
        P0=Pk;
        x0=Xk(:,i);
        plot(Xk(1,i),Xk(2,i),'r');    %%画估计目标轨迹
        hold on
        
    end
    error_x=Xk(1,:)-Xt;
    error_y=Xk(2,:)-Yt;
    error_vx=Xk(3,:)-Vx;
    error_vy=Xk(4,:)-Vy;
  
    err_x=err_x+error_x;
    err_y=err_y+error_y;
    err_vx=err_vx+error_vx;
    err_vy=err_vy+error_vy;
end
figure(1)
        plot(Xk(1,:),Xk(2,:),'-r');                 %%画估计目标轨迹
        title('观测噪声方差R=1°时的目标航迹');
        legend('观测站位置','目标真实航迹','目标估计航迹');
        hold on
        box on 

figure(2)
subplot(2,2,1)
plot(abs(err_x/num))
title('X坐标估计误差')
xlabel('时间')
subplot(2,2,2)
plot(abs(err_y/num))
title('Y坐标估计误差')
xlabel('时间')

subplot(2,2,3)
plot(abs(err_vx/num))
title('Vx估计误差')
xlabel('时间')

subplot(2,2,4)
plot(abs(err_vy/num))
title('Vy估计误差')
xlabel('时间')
  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

m0_52765390

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值