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

📄 kalman_fliter_nine.m

📁 九维的卡尔曼滤波跟踪算法
💻 M
字号:
function [Z,X_yuce]=kalman_fliter_nine(A1,A2,A3,N,T,ave,var)
%%%A1,A2及A3为极坐标下测量的前三组数据,都为1*3的矩阵,为确定卡尔曼滤波的初始值和初始协方差,ave和var分别为采样间隔T1的均值和方差
% clear all;
% clc;

%%%初始条件给定
% T=1;
% N=100;
Nvar1=50;
Nvar2=60;
Nvar3=20;
Wvar1=100;
Wvar2=80;
Wvar3=50;
V1=sqrt(Nvar1)*randn(1,N);              %%%产生方差为Nvar1的正态分布的过程噪声数据
V2=sqrt(Nvar2)*randn(1,N);              %%%产生方差为Nvar2的正态分布的过程噪声数据
V3=sqrt(Nvar3)*randn(1,N);              %%%产生方差为Nvar3的正态分布的过程噪声数据
W1=sqrt(Wvar1)*randn(1,N);              %%%产生方差为Wvar1的正态分布的量测噪声数据
W2=sqrt(Wvar2)*randn(1,N);              %%%产生方差为Wvar2的正态分布的量测噪声数据
W3=sqrt(Wvar3)*randn(1,N);              %%%产生方差为Wvar3的正态分布的量测噪声数据
I=eye(9);


%%%初始状态给定
F=[1 T T^2/2 0 0 0 0 0 0
   0 1 T 0 0 0 0 0 0
   0 0 1 0 0 0 0 0 0
   0 0 0 1 T T^2/2 0 0 0
   0 0 0 0 1 T 0 0 0
   0 0 0 0 0 1 0 0 0
   0 0 0 0 0 0 1 T T^2/2
   0 0 0 0 0 0 0 1 T
   0 0 0 0 0 0 0 0 1];                %%%系统方程的一步转移矩阵
H=[T^2/2 0 0 
   T 0 0
   1 0 0
   0 T^2/2 0
   0 T 0
   0 1 0
   0 0 T^2/2
   0 0 T
   0 0 1];                            %%%系统方程的噪声输入矩阵
C=[1 0 0 0 0 0 0 0 0
   0 0 0 1 0 0 0 0 0
   0 0 0 0 0 0 1 0 0];                %%%量测方程的量测矩阵
%Q=7.5^2*eye(3,3);                    %%%过程噪声的协方差矩阵,为方阵,可设为对角阵
Q=[50 0 0
   0 60 0
   0 0 20];
R=[90 0 0
   0 40 0
   0 0 20];                          %%%量测噪声的协方差矩阵,为方阵,不一定为对角阵


% d=100;                            %%%d为径向距离测量误差的协方差
% e=0.001;                          %%%e为方位角测量误差的协方差
% f=0.001;                          %%%f为俯仰角测量误差的协方差

%%%%%此处调用轨迹函数的前三组数值
a1=A1(1);
a2=A1(2);
a3=A1(3);                         %%%a代表方位角φ
b1=A2(1);
b2=A2(2);
b3=A2(3);                         %%%b代表俯仰角θ
c1=A3(1);
c2=A3(2);
c3=A3(3);                         %%%c代表径向距离r
% a1=1.5703;
% a2=1.5698;
% a3=1.5693;
% b1=0;
% b2=0;
% b3=0;
% c1=sqrt(2000^2+1);
% c2=sqrt(2000^2+4);
% c3=sqrt(2000^2+9);
%%%以上数值假设状态向量[x x' x'' y y' y'' z z' z'']=[10 300 10 10 200 20 10 100 30]
%%%依据其前三组数值[10 10 10],[315 220 125],[630 450 270]通过坐标转换而来

%%%系统的初始状态
Z11=c1*cos(a1)*cos(b1);
Z21=c1*sin(a1)*cos(b1);
Z31=c1*sin(b1);

Z12=c2*cos(a2)*cos(b2);
Z22=c2*sin(a2)*cos(b2);
Z32=c2*sin(b2);

Z13=c3*cos(a3)*cos(b3);
Z23=c3*sin(a3)*cos(b3);
Z33=c3*sin(b3);

X0=[Z13
    (Z13-Z12)/T
    ((Z13-Z12)/T-(Z12-Z11)/T)/T
    Z23
    (Z23-Z22)/T
    ((Z23-Z22)/T-(Z22-Z21)/T)/T
    Z33
    (Z33-Z32)/T
    ((Z33-Z32)/T-(Z32-Z31)/T)/T];

% %%%初始协方差矩阵
% D=[d 0 0
%    0 e 0
%    0 0 f];
% 
% B1=[cos(a1)*cos(b1) -c1*sin(a1)*cos(b1) -c1*cos(a1)*sin(b1)
%    sin(a1)*cos(b1) c1*cos(a1)*cos(b1) -c1*sin(a1)*sin(b1)
%    sin(b1) 0 c1*cos(b1)];
% E1=B1*D*B1';
% 
% 
% B2=[cos(a2)*cos(b2) -c2*sin(a2)*cos(b2) -c2*cos(a2)*sin(b2)
%    sin(a2)*cos(b2) c2*cos(a2)*cos(b2) -c2*sin(a2)*sin(b2)
%    sin(b2) 0 c2*cos(b2)];
% E2=B2*D*B2';
% 
% 
% B3=[cos(a3)*cos(b3) -c3*sin(a3)*cos(b3) -c3*cos(a3)*sin(b3)
%    sin(a3)*cos(b3) c3*cos(a3)*cos(b3) -c3*sin(a3)*sin(b3)
%    sin(b3) 0 c3*cos(b3)];
% E3=B3*D*B3';
E1=R;
E2=R;
E3=R;


for i=1:3
    for j=1:3
        P_yuce(3*i-2:3*i,3*j-2:3*j)=[E3(i,j) E3(i,j)/T E3(i,j)/T^2
                                E3(i,j)/T (E3(i,j)+E2(i,j))/T^2 (E3(i,j)+2*E2(i,j))/T^3
                                E3(i,j)/T^2 (E3(i,j)+2*E2(i,j))/T^3 (E3(i,j)+4*E2(i,j)+E1(i,j))/T^4];
    end
end


%%%卡尔曼滤波算法%%%
X_chushi=X0;
X_yuce(:,1)=X0;

T1=ave+sqrt(var)*randn(1,N);
%%%产生均值为ave,方差为var的正态分布随机矩阵,作为不断变化的采样间隔
t=0;

for k=1:N
%     X(:,k)=F*X_chushi+H*[V1(k),V2(k),V3(k)]';
%     Z(:,k)=C*X(:,k)+[W1(k),W2(k),W3(k)]';
    t=t+T1(1,k);                                               %%%每次循环调用一组数值,而不是全部的数值
    [x y z]=fuyang(0,2000,0,2400,15,100,1,3,30,0,t);           %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%此处调用函数轨迹
    Z(:,k)=[x y z]'+[W1(k),W2(k),W3(k)]';
    X_guji(:,k)=F*X_yuce(:,k);
    P_guji=F*P_yuce*F'+H*Q*H';
    a=Z(:,k)-C*X_guji(:,k);
    A=C*P_guji*C'+R;
    K=P_guji*C'*inv(A);
    X_yuce(:,k+1)=X_guji(:,k)+K*a;
    P_yuce=[I-K*C]*P_guji;
%     X_chushi=X(:,k);
end


%%%绘图
% plot3(X(1,:),X(4,:),X(7,:))
% hold on;
% plot3(X_yuce(1,:),X_yuce(4,:),X_yuce(7,:),'r')
% subplot(3,1,1);
% plot(X_yuce(1,2:101)-X(1,:),'r')
% hold on;
% plot(X_yuce(4,2:101)-X(4,:),'-.')
% hold on;
% plot(X_yuce(7,2:101)-X(7,:),'g')
% hold on;
% subplot(3,1,2);
% plot(X_yuce(2,2:101)-X(2,:),'r')
% hold on;
% plot(X_yuce(5,2:101)-X(5,:),'-.')
% hold on;
% plot(X_yuce(8,2:101)-X(8,:),'g')
% subplot(3,1,3)
% plot(X_yuce(3,2:101)-X(3,:),'r')
% hold on;
% plot(X_yuce(6,2:101)-X(6,:),'-.')
% hold on;
% plot(X_yuce(9,2:101)-X(9,:),'g')

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -