基于卡尔曼滤波算法的轨迹跟踪

目录

一、理论基础

二、核心程序

三、仿真结论


一、理论基础

       卡尔曼滤波是一种用于处理具有噪声的动态系统的数学方法。它最初是为了跟踪飞机、导弹和航天器的位置和速度而开发的。卡尔曼滤波在轨迹跟踪、控制系统和机器人导航等领域得到了广泛应用。本文将介绍基于卡尔曼滤波的轨迹跟踪的原理、实现步骤和应用。

一、卡尔曼滤波简介

       卡尔曼滤波是一种用于估计线性动态系统状态的数学方法。它基于贝叶斯定理,通过对系统状态的预测和测量结果的更新来估计系统状态。卡尔曼滤波的核心思想是利用先验信息和后验信息来优化系统状态的估计。先验信息是指系统状态的先前估计,后验信息是指基于新的测量结果更新后的估计。
       卡尔曼滤波将系统的状态表示为一个向量,包含系统的位置、速度和加速度等信息。这个向量被称为状态向量。卡尔曼滤波的主要步骤包括预测和更新:
      预测:根据系统的动态模型和先前的状态估计,预测系统的下一个状态。预测的过程包括两个步骤:状态预测和协方差预测。状态预测是利用系统的动态模型和先前的状态估计来预测系统的下一个状态。协方差预测是利用状态预测和系统的噪声模型来预测系统状态的不确定性。
      更新:利用新的测量结果来更新预测的状态估计。更新的过程包括两个步骤:计算卡尔曼增益和更新状态估计。卡尔曼增益是利用协方差预测和测量噪声模型来计算的,它表示测量结果对状态估计的权重。更新状态估计是利用卡尔曼增益和测量结果来更新先前的状态估计。
       卡尔曼滤波的优点是能够处理具有噪声的测量结果,并且能够利用系统的动态模型进行状态估计。它的缺点是需要对系统的动态模型和测量噪声模型进行准确的建模,并且对于非线性系统和非高斯噪声模型,需要使用扩展卡尔曼滤波或无迹卡尔曼滤波等方法进行处理。

二、基于卡尔曼滤波的轨迹跟踪

       基于卡尔曼滤波的轨迹跟踪是一种利用卡尔曼滤波进行目标位置估计的方法。它将目标的运动模型表示为一组线性方程,利用卡尔曼滤波对目标位置进行估计和预测。基于卡尔曼滤波的轨迹跟踪的应用非常广泛,包括自动驾驶、无人机导航、机器人视觉导航等领域。
      在轨迹跟踪中,需要估计目标的位置、速度和加速度等状态量。然而,由于目标的运动不确定性和测量噪声的存在,目标的真实状态很难被准确地测量。因此,需要利用卡尔曼滤波来对目标状态进行估计和预测。

轨迹跟踪的算法流程
基于卡尔曼滤波的轨迹跟踪主要包括以下步骤:

(1)初始化:确定目标的初始位置和速度,并建立状态向量和协方差矩阵。

(2)预测:利用目标的运动模型和先前的状态估计,预测目标的下一个状态。

(3)测量:利用传感器测量目标的位置。

(4)更新:利用卡尔曼滤波的公式,将测量结果与预测结果结合,得到更新后的状态估计和协方差矩阵。

(5)重复步骤(2)至(4)以实现连续的轨迹跟踪。

具体而言,轨迹跟踪的算法流程如下:

(1)初始化:

在轨迹跟踪开始时,需要确定目标的初始位置和速度,并建立状态向量和协方差矩阵。状态向量通常包含目标的位置、速度和加速度等信息,而协方差矩阵用于表示状态估计的不确定性。

(2)预测:

利用目标的运动模型和先前的状态估计,预测目标的下一个状态。目标的运动模型可以通过目标的历史运动数据来确定,通常假设目标的运动是匀加速运动或匀速运动。假设目标在时刻 t 的状态向量为 x(t),则可以利用以下公式进行预测:

$x(t+1)=F\cdot x(t)+B\cdot u(t)+w(t)$

其中,F是状态转移矩阵,B是控制矩阵,u(t)是控制向量,w(t)是过程噪声,用于表示运动模型的不确定性。

协方差矩阵的预测可以通过以下公式计算:

$P(t+1)=F\cdot P(t)\cdot F^T+Q$

其中,P(t)是先前状态估计的协方差矩阵,Q是过程噪声的协方差矩阵,用于表示状态估计的不确定性。

(3)测量:

利用传感器测量目标的位置,得到测量向量z(t)。测量向量通常包含目标的位置信息,但也可能包含其他信息,如目标的大小和形状等。

(4)更新:

利用卡尔曼滤波的公式,将测量结果与预测结果结合,得到更新后的状态估计和协方差矩阵。具体而言,卡尔曼滤波的更新包括以下步骤:

计算卡尔曼增益K(t):
卡尔曼增益K(t)表示测量结果对状态估计的权重。它的计算公式为:
       K(t)=P(t)\cdot H^T\cdot(H\cdot P(t)\cdot H^T+R)^{-1}$
       其中,H是测量矩阵,用于将状态向量映射到测量空间中;R是测量噪声的协方差矩阵,用于表示测量结果的不确定性。
更新状态向量:
利用卡尔曼增益和测量结果更新状态向量,计算公式为:
x(t+1)=x(t)+K(t)\cdot(z(t)-H\cdot x(t))$
其中,z(t)是测量向量,H是测量矩阵
更新协方差矩阵:
利用卡尔曼增益和测量结果更新协方差矩阵,计算公式为:
P(t+1)=(I-K(t)\cdot H)\cdot P(t)$
其中,I是单位矩阵。
(5)重复步骤(2)至(4)以实现连续的轨迹跟踪。
轨迹跟踪的参数设置
      在进行轨迹跟踪时,需要设置一些参数,包括状态向量、运动模型、测量噪声、过程噪声和初始协方差矩阵等。
       状态向量包含目标的位置、速度和加速度等信息,可以根据具体应用进行设置。
      运动模型是描述目标运动规律的数学模型,通常假设目标的运动是匀加速运动或匀速运动。运动模型的选择应该根据目标的运动特性和应用需求来确定。

二、核心程序

...............................................................
while 1 % infinite loop, break used
    xa=[xa x];
    ya=[ya y];
    vxa=[vxa vx];
    vya=[vya vy];
    ta=[ta t];
    xna=[xna x+sgx*randn]; 
    yna=[yna y+sgy*randn]; % add gaussian noise
    
    if y<0 % when return to ground
        break % stop motion
    end
    
    % update values
    x=x+vx*dt; % vx~(x(k+1)-x(k))/dt => x(k+1)~x(k)+vx*dt
    y=y+vy*dt;
    vy=vy-g*dt;
    t=t+dt;
    % note: vx not change
end

% plot nosied trajectory
%plot(xa,ya,'b-',xna,yna,'r--');
figure;
plot(xna,yna,'b-');
xlabel('x, m');
ylabel('y, m');
%legend('real curve','noised curve');

% apply kalman filtering:
R=[sgx^2   0     
   0       sgy^2]; % covariance matrix for nose in x and y 

H=[1 0 0 0 0;
   0 0 1 0 0]; % observarion matrix

F=[ 1  dt 0  0  0
    0  1  0  0  0
    0  0  1  dt 0
    0  0  0  1  dt
    0  0  0  0  1  ]; % state transition matrix

P=eye(5); % inital gues for P-matrix

I=eye(5); % unit matrix
 

xc=[xna(1)
    0
    yna(1)
    0
    0]; % guess for initial value of estimation of state vector
% for x y get initial noised position, for vx vy ay is zeros

z=[xna
   yna]; % observation

xca=xc; % will be stored in xca
nc=2; % loop counter, stert from second step
for t=ta(2:end)
    Ps=F*P*F';
    K=Ps*H'*(H*Ps*H'+R)^(-1);
    xc=F*xc+K*(z(:,nc)-H*F*xc);
    P=(I-K*H)*Ps*(I-K*H)'+K*R*K';
    %P=(I-K*H)*Ps;
    xca=[xca xc]; % store
    nc=nc+1;
end

% add to plot filtered tragectory:
hold on;
plot(xca(1,:),xca(3,:),'r-','linewidth',2);
legend('noised','filtered');
title('trajectory');

% plot velocities graph in separated window:
figure;
plot(ta,xca(2,:),'r-','linewidth',2);
hold on;
plot(ta,vxa,'r--');
plot(ta,xca(4,:),'b-','linewidth',2);
plot(ta,vya,'b--');
xlabel('time, s');
legend('filtered vx','original vx','filtered vy','original vy');
title('velocities');
UP199

三、仿真结论

 

猜你喜欢

转载自blog.csdn.net/ccsss22/article/details/130776357