无迹卡尔曼滤波

无迹卡尔曼滤波(Unscented Kalman Filter,UKF)是卡尔曼滤波的一种扩展,它不需要对非线性函数进行线性化,而是通过选取一组称为sigma点的采样点来近似非线性函数的期望和协方差。

下面给出UKF二维平面仿真。观测为单个雷达模型。

clc;close all;clear;
bushu=100;
T=0.1;
fai=[1 , T , 0 , 0;
     0 , 1 , 0 , 0;
     0 , 0 , 1 , T;
     0 , 0 , 0 , 1];
gama=[0.5*T^2  ,   0   ;
         T     ,   0   ;
         0     ,0.5*T^2;
         0     ,   T   ];
%% 模拟数据
X(:,1)=[1;1;1;1];%%x Vx y Vy
Q=1e-2*diag([1,1]);
w=sqrt(Q)*randn(2,bushu);
for i=2:bushu
    X(:,i)=fai*X(:,i-1)+gama*w(:,i);
end
%% 测站位置& measurement equation
x0=2;y0=3;
R1=0.002;R2=0.003;R=diag([R1,R2]);
V1=sqrtm(R1)*randn(1,bushu);
V2=sqrtm(R2)*randn(1,bushu);
for i=1:bushu
    Z1(:,i)=sqrtm((x0-X(1,i))^2+(y0-X(3,i))^2)+V1(i);
    Z2(:,i)=atan((y0-X(3,i))/(x0-X(1,i)))+V2(i);
end
Z=[Z1;Z2];
%% CMF-UKF
n=4;
alpha=0.01;beta=2;kk=0;
lanmega=1;
%% UT变换
for j=1:2*n+1
    Wm(j)=lanmega/(2*(n+lanmega));
    Wc(j)=lanmega/(2*(n+lanmega));
end
Wm(1)=lanmega/(n+lanmega);
Wc(1)=lanmega/(n+lanmega)+3;
Xukf(:,1)=[1;1;1;1];
P(:,:,1)=0.01*eye(4);
for i=2:bushu
    Xestimate0(:,i-1)=Xukf(:,i-1);
    chl_P(:,:,i-1)=(chol((n+lanmega)*P(:,:,i-1)))';
    for k=1:n
        Xestimate1(:,k,i-1)=Xestimate0(:,i-1)+chl_P(:,k,i-1);
        Xestimate2(:,k,i-1)=Xestimate0(:,i-1)-chl_P(:,k,i-1);
    end
    Xsigma(:,:,i-1)=[Xestimate0(:,i-1),Xestimate1(:,:,i-1),Xestimate2(:,:,i-1)];
    Xsigma_jian(:,:,i)=fai*Xsigma(:,:,i-1);
    Xjian(:,i)=zeros(4,1);
    for k=1:2*n+1
        Xjian(:,i)=Xjian(:,i)+Wm(k)*Xsigma_jian(:,k,i);
    end
    Pxx(:,:,i)=zeros(4,4);
    for k=1:2*n+1
        Pxx(:,:,i)=Pxx(:,:,i)+Wc(k)*(Xjian(:,i)-Xsigma_jian(:,k,i))*(Xjian(:,i)-Xsigma_jian(:,k,i))';
    end
    Pxx(:,:,i)=Pxx(:,:,i)+gama*Q*gama';
    cho_P0(:,:,i)=(chol((n+lanmega)*Pxx(:,:,i)))';
    for k=1:n
        Xaugsigma1(:,k,i)=Xjian(:,i)+cho_P0(:,k,i);
        Xaugsigma2(:,k,i)=Xjian(:,i)-cho_P0(:,k,i);
    end
    Xaugsigma(:,:,i)=[Xjian(:,i),Xaugsigma1(:,:,i),Xaugsigma2(:,:,i)];
    for k=1:2*n+1
        Zsigma(1,k,i)=sqrtm((Xaugsigma(1,k,i)-x0)^2+(Xaugsigma(3,k,i)-y0)^2);
        Zsigma(2,k,i)=atan((Xaugsigma(3,k,i)-y0)/(Xaugsigma(1,k,i)-x0));
    end
    Zjian(:,i)=zeros(2,1);
    for k=1:2*n+1
        Zjian(:,i)=Zjian(:,i)+Wm(k)*Zsigma(:,k,i);
    end
    Pzz(:,:,i)=zeros(2,2);
    for k=1:2*n+1
        Pzz(:,:,i)=Pzz(:,:,i)+Wc(k)*(Zjian(:,i)-Zsigma(:,k,i))*(Zjian(:,i)-Zsigma(:,k,i))';
    end
    Pzz(:,:,i)=Pzz(:,:,i)+R;
    Pxz(:,:,i)=zeros(4,2);
    for k=1:2*n+1
        Pxz(:,:,i)=Pxz(:,:,i)+Wc(k)*(Xjian(:,i)-Xaugsigma(:,k,i))*(Zjian(:,i)-Zsigma(:,k,i))';
    end
    K(:,:,i)=Pxz(:,:,i)*pinv(Pzz(:,:,i));
    Xukf(:,i)=Xjian(:,i)+K(:,:,i)*(Z(:,i)-Zjian(:,i));
    P(:,:,i)=Pxx(:,:,i)-K(:,:,i)*Pzz(:,:,i)*K(:,:,i)';
end

figure(1)
plot(Xukf(1,:),Xukf(3,:),'r',X(1,:),X(3,:),'b')
legend('UKF','True');

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值