扩展卡尔曼滤波理论+仿真

 

matlab仿真代码 (CV+CT运动模型)

clc;
clear;
close all
%***************************初始化参数**************************************
T=1;%采样间隔
S=200 %仿真步数
T_f=1; %sample time of fusion center
w=-pi/180*3;% 转完角速度
A= [1 sin(w*T_f)/w 0 -(1-cos(w*T_f))/w
       0 cos(w*T_f)   0 -sin(w*T_f)
       0 (1-cos(w*T_f))/w 1 sin(w*T_f)/w
       0  sin(w*T_f) 0 cos(w*T_f) ]; %
%A=[1 T 0 0;0 1 0 0;0 0 1 T;0 0 0 1];;%实际模型CV 
r0=20;
Q=[r0 0 0 0;0 r0 0 0; 0 0 r0 0; 0 0 0 r0];%运动过程噪声协方差
wk=[sqrt(r0)*randn;sqrt(r0)*randn;sqrt(r0)*randn;sqrt(r0)*randn];%运动过程噪声
r1=20;
r2=0.001*pi/180;
R=[r1 0;0 r2];%雷达量测噪声协方差
vk(:,1)=[sqrt(r1)*randn;sqrt(r2)*randn];%雷达量测噪声
X0=[200;5;1000;15];%初始状态
X(:,1)=X0;
Zk(:,1)=[sqrt(X(1,1)^2+X(3,1)^2); atan2(X(3,1),X(1,1))]+vk(:,1);
%Zk(:,1)=[sqrt(X(1,1)^2+X(3,1)^2); atan(X(3,1)/X(1,1))]+vk(:,1);
X0=[200;1;1000;15];%初始估计状态
Pk=[400 0 0 0; 0 400 0 0; 0 0 400 0;0 0 0 400];%初始协方差
X_pre(:,1)=X0;
X_f(:,1)=[200;1;1000;15]
P_pre(:,:,1)=A*Pk*A'+Q;
rr=X_pre(1,1)^2+X_pre(3,1)^2;
H(:,:,1)=[X_pre(1,1)/sqrt(rr) 0 X_pre(3,1)/sqrt(rr) 0; -1.*X_pre(3,1)/rr 0 X_pre(1,1)/rr 0];
%****************************************滤波*******************************
for i=2:S
    wk(:,i)=[sqrt(r0)*randn;sqrt(r0)*randn;sqrt(r0)*randn;sqrt(r0)*randn];%运动过程噪声
    X(:,i)=A*X(:,i-1)+wk(:,i);%真实状态
    vk(:,i)=[sqrt(r1)*randn;sqrt(r2)*randn];

    Zk(:, i) = [sqrt(X(1, i)^2 + X(3, i)^2); atan2(X(3, i),X(1, i))] + vk(:, i);
    %Zk(:,i)=[sqrt(X(1,i)^2+X(3,i)^2); atan(X(3,i)/X(1,i))]+vk(:,i);
    K(:,:,i)=P_pre(:,:,i-1)*H(:,:,i-1)'*inv(H(:,:,i-1)*P_pre(:,:,i-1)*H(:,:,i-1)'+R);
    re(:,i)=Zk(:,i)-[sqrt(X_pre(1,i-1)^2+X_pre(3,i-1)^2); atan2(X_pre(3,i-1),X_pre(1,i-1))];
    %re(:,i)=Zk(:,i)-[sqrt(X_pre(1,i-1)^2+X_pre(3,i-1)^2); atan(X_pre(3,i-1)/X_pre(1,i-1))];
    X_f(:,i)=X_pre(:,i-1)+K(:,:,i)*re(:,i);
    P_f(:,:,i)=P_pre(:,:,i-1)-K(:,:,i)*H(:,:,i-1)*P_pre(:,:,i-1);
    X_pre(:,i)=A*X_f(:,i);
    P_pre(:,:,i)=A*P_f(:,:,i)*A'+Q;
    rr=X_pre(1,i)^2+X_pre(3,i)^2;
    H(:,:,i)=[X_pre(1,i)/sqrt(rr) 0 X_pre(3,i)/sqrt(rr) 0;-1.*X_pre(3,i)/rr 0 X_pre(1,i)/rr 0];
end
%***********误差图*************
for i=1:S
    rms(i)=sqrt((X(1,i)-X_f(1,i))^2+(X(3,i)-X_f(3,i))^2);
end
figure
t=50:100;
plot(t,rms(50:100));
%***********绘制轨迹图**********************
figure                                 
hold on; 
box on;                                %对当前坐标图加上边框
title('跟踪轨迹图');
xlabel('X/m');
ylabel('Y/m');
plot(X(1,:),X(3,:),'-k');              %真实轨迹 %显示(x,y)位置信息
plot(X_f(1,:),X_f(3,:),'-b','LineWidth', 1);         %Kalman滤波轨迹
plot(Zk(1,:).*cos(Zk(2,:)),Zk(1,:).*sin(Zk(2,:)),'-r')
legend('真实轨迹','滤波轨迹','观测轨迹')
正在学习机动目标跟踪算法,会持续更新,做相关方向的同学可以点个关注,大家共同进步。

  • 27
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值