目标跟踪(二):拓展卡尔曼滤波(EKF)

目标跟踪(二):拓展卡尔曼滤波(EKF)

我们在上一篇文章已经讲述了线性卡尔曼滤波(KF),也进行了详细的理论推导。但是,由于我们生活中存在很多非线性环节,这就使得线性卡尔曼滤波无法使用,在这一篇文章,我们将针对非线性环节,讨论介绍拓展卡尔曼滤波(EKF)。当然了,理解这篇文章的前提,是看懂上一篇文章。若上篇文章已懂,那么这篇文章就很简单。


写在最前面

在这里,不知道有没有一些朋友有以下问题?

为什么变为非线性环节,线性卡尔曼滤波就不能用呢?
当变为非线性环节的时候,叠加定理和齐次定理便不在满足。我们滤波的目的是为了去除噪声,假如我们假设噪声是服从高斯分布的,当通过非线性环节的时候,这个噪声的分布肯定已经不在是高斯分布了,所以我们不能在使用线性卡尔曼滤波进行之前的递推。

因此我们引入了非线性滤波


扩展卡尔曼滤波的原理(EKF)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
以上便是拓展卡尔曼滤波的核心内容。


写在最后

在这里,小编想说,其实拓展卡尔曼滤波就是将非线性环节进行线性化,使用泰勒展开,只用一阶,省略到高阶项。我们这样做的话又引入了线性化误差,因为我们人为的省略掉了高阶项。下一遍文章我们将介绍另一种线性化的方法,即无迹变换以及无迹卡尔曼滤波(UKF)。


Matlab仿真分析

仿真参数

在这里插入图片描述
在这里,我们仅仅将观测环节设为非线性环节,观测量为目标相对于观测站的角度。


在这里插入图片描述
在这里插入图片描述
根据仿真结果,我们可以看到,当观测环节由线性环节变为非线性环节,跟踪的误差明显增大。


Matalb代码如下

% 拓展卡尔曼滤波在目标跟踪过程中的应用,非线性环节为观测环节,观测的目标的方位
% 观测方程:Z(k) = atan((y(k)-Xstation(2))/(x(k)-Xstation(1))) + v(k)
clear;close all;
T = 1;
N = 60;
F = [1,T,0,0;
     0,1,0,0;
     0,0,1,T;
     0,0,0,1]; %二维CV模型
X0 = [100 2 200 20]';Qk = diag([0.1 0.01 0.1 0.01]);Rk = 0.1;
P0 = diag([0.1 0.01 0.1 0.01]);
Xstation = [0;0];
Xk = Track(X0,Qk,F,N/T);Zk = Measurements(Xk,Rk,Xstation); % 观测方程为非线性表达,所以直接在函数里面进行计算
[Xekf] = EKF(X0,F,Zk,Qk,Rk,P0,Xstation);

figure()
plot(Xk(1,:),Xk(3,:),'LineWidth',1);hold on;
plot(Xekf(1,:),Xekf(3,:),'LineWidth',1);grid on;
legend('真实轨迹','EKF估计航迹')
delta = sqrt((Xk(1,:)-Xekf(1,:)).^2+(Xk(3,:)-Xekf(3,:)).^2);
figure()
plot(delta);grid on
xlabel('时间/s');ylabel('距离均方误差');
legend('拓展Kalman滤波均方误差')

%--------------------------------------------------------------------------
%% 子函数部分
function Xk = Track(X0,Qk,F,N)
% 目标的真实航迹
%%输入参数
% X0 - 状态初值
% Qk - 过程噪声协方差
% Fx - 转移矩阵
% N - 仿真总结拍
%%输出参数
% Xk - 真实航迹

n_x = length(X0); % 状态向量维度
Xk = zeros(n_x,N);Xk(:,1) = X0;
for ii = 2:N
    Xk(:,ii) = F*Xk(:,ii-1) + Qk*randn(n_x,1);

end
end
%--------------------------------------------------------------------------
function Zk = Measurements(Xk,Rk,Xstation)
% 传感器量测
%输入参数
% Xk - 真实航迹
% Rk - 量测噪声协方差
% Xstation - 观测站的坐标
%输出参数
% Zk - 传感器量测值


N = length(Xk(1,:)); % 仿真总节拍
Zk = zeros(1,N);
for ii = 1:N
    Zk(ii) = atan((Xk(3,ii)-Xstation(2))/(Xk(1,ii)-Xstation(1)))+Rk*randn(1);
end
end
%--------------------------------------------------------------------------
function [Xekf] = EKF(X0,F,Zk,Qk,Rk,P0,Xstation)
% 拓展卡尔曼滤波
%输入参数
% X0 - 滤波初值
% F - 转移矩阵
% Zk - 传感器量测
% Qk - 过程噪声协方差
% Rk - 量测噪声协方差
% Xstation - 观测站坐标
%输出参数
% Xekf - 状态估计

n_x = length(X0); % 状态向量维数
N = length(Zk); % 仿真总节拍
Xekf = zeros(n_x,N);Xekf(:,1) = X0;
Pk_Last = P0; % 协方差初始化
for ii = 2:N
    Xekf_hat = F*Xekf(:,ii-1); % 先验估计
    Pk = F*Pk_Last*F' + Qk; % 先验协方差矩阵
    H = [-(Xekf_hat(3)-Xstation(2))/((Xekf_hat(1)-Xstation(1))^2+(Xekf_hat(3)-Xstation(2))^2),0,...
        (Xekf_hat(1)-Xstation(1))/((Xekf_hat(1)-Xstation(1))^2+(Xekf_hat(3)-Xstation(2))^2),0];%即为所求一阶近似
    Kk = Pk*H'/(H*Pk*H'+Rk); % 卡尔曼增益
    Zzk = atan((Xekf_hat(3)-Xstation(2))/(Xekf_hat(1)-Xstation(1)));
    Xekf(:,ii) = Xekf_hat + Kk*(Zk(ii)-Zzk); % 后验估计
    Pk_Last = (eye(n_x)-Kk*H)*Pk; % 更新误差协方差
end
end

  • 15
    点赞
  • 105
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
拓展卡尔曼滤波(EKF)是一种用于处理非线性环节的卡尔曼滤波方法。它通过将非线性环节进行线性化,使用泰勒展开,只用一阶,省略高阶项来处理非线性问题。然而,这种线性化方法引入了线性化误差,因为高阶项被人为省略掉了。因此,EKF并不完美,但在某些情况下仍然是一个有效的工具。 在目标跟踪中,拓展卡尔曼滤波可以用于估计目标的位置。通过使用雷达等传感器测量目标的位置和速度,并结合先前的估计值,EKF可以根据系统的动力学模型预测目标的未来状态,并利用测量值进行修正。通过不断迭代这个过程,EKF可以提供对目标位置的准确估计。 然而,需要注意的是,虽然拓展卡尔曼滤波在某些情况下可以提供较好的估计结果,但它仍然存在一些局限性。例如,在高度非线性的系统中,EKF可能无法提供准确的估计结果。因此,在某些情况下,可以考虑使用其他的非线性滤波方法,如无迹卡尔曼滤波(UKF),它通过无迹变换来更准确地处理非线性问题。 综上所述,拓展卡尔曼滤波是一种用于处理非线性环节的卡尔曼滤波方法,可以用于目标跟踪中估计目标的位置。然而,它仍然存在一些局限性,因此在实际应用中需要根据具体情况选择合适的滤波方法。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [目标跟踪():拓展卡尔曼滤波(EKF)](https://blog.csdn.net/qq_44169352/article/details/124456313)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* [【目标跟踪】基于拓展卡尔曼滤波实现车载激光雷达和雷达的数据融合matlab代码](https://blog.csdn.net/m0_60703264/article/details/121072502)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值