您现在的位置是:首页 >技术杂谈 >【无人机】基于EKF、UKF、PF、改进PF滤波算法的无人机航迹预测(Matlab代码实现)网站首页技术杂谈

【无人机】基于EKF、UKF、PF、改进PF滤波算法的无人机航迹预测(Matlab代码实现)

程序猿鑫 2026-03-20 12:01:04
简介【无人机】基于EKF、UKF、PF、改进PF滤波算法的无人机航迹预测(Matlab代码实现)

 💥💥💥💞💞💞欢迎来到本博客❤️❤️❤️💥💥💥

🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。

⛳️座右铭:行百里者,半于九十。

目录

💥1 概述

基于EKF、UKF、PF、改进PF滤波算法的无人机航迹预测研究

一、引言

二、相关滤波算法原理

(一)扩展卡尔曼滤波(EKF)

(二)无迹卡尔曼滤波(UKF)

(三)粒子滤波(PF)

(四)改进粒子滤波(改进PF)

三、无人机航迹预测模型构建

(一)无人机运动模型

(二)观测模型

四、Matlab仿真实验

(一)实验设置

(二)性能指标

(三)实验结果

五、结果分析与讨论

六、结论与展望

📚2 运行结果

🎉3 参考文献

👨‍💻4 Matlab代码实现


💥1 概述

     工程测量中应用无人机航测技术,无人机不需要专业驾驶员进行操作作业,只需要无人机控制人员对拍摄影像随时注意查看,注意观察无人机的飞行状态。无人机操作技术也越来越简单,小型无人机机身、体积及重量都大大减少,最小的无人机只有巴掌大小,在手上就可以实现起飞与降落。无人机航测技术相较于传统客机航测技术大大减少了选择起飞降落地点的问题,其机身质量增加,在低空飞行可以很好地适应风向变化,降低飞行设备振动,避免对拍摄数据与图像采集造成影响。使用无人机航测技术只需要提前设定无人机飞行路线,随时观察无人机的飞行状态,根据实际情况修正。无人机系统发生问题时可以自行降落或飞回至起点排除故障,由于无人机结构简单,维修或零件更换成本较低,排除故障后可以重新飞行测量。

      无人机航测技术具有数据采集能力强、精确度高的优点,对无人机操作人员技术水平要求较低,极大程度减少了无人机操作时间与数据分析处理时间,无人机自身所携带的高清摄影相机与专业测绘仪器,可以将工程拍摄影像质量大幅度提高,提升工程测绘精确度。无人机具有一定的智能与自动化,可以在一定程度减少工作压力,提高工作效率质量。无人机还可以使用低空遥感模式对工程地理信息完成勘测,不管在高空还是超低空下都可以正常完成测绘作业,广泛应用于工程测量与应急救援领域中。

      无人机测绘技术在工程测量中应用具有较短的飞行周期,可以实现快速起飞降落,在数据获取分析及处理中,只需要投入较少时间。无人机测绘技术成本相较于传统客机测绘技术成本非常低,主要由于无人机制造材料成本低,保养频率低,零件构造简单,后期维修费用少,极大程度减少了工程测绘成本。无人机具有简单的操作模式,测绘人员可以在短时间内学会无人机设备操作和拍摄程序的使用,无需再投入其他成本,具有使用成本低的优点。

基于EKF、UKF、PF、改进PF滤波算法的无人机航迹预测研究

摘要:本研究聚焦于无人机航迹预测问题,采用扩展卡尔曼滤波(EKF)、无迹卡尔曼滤波(UKF)、粒子滤波(PF)以及改进的粒子滤波(改进PF)算法进行深入探讨。首先阐述了无人机航迹预测的重要意义,鉴于无人机系统的非线性和多参数特性,寻求有效的滤波算法至关重要。通过Matlab仿真实验,对四种算法在无人机航迹预测中的性能进行对比分析,结果表明不同算法在不同场景下各有优劣,改进PF算法在复杂环境中展现出一定优势,为无人机航迹预测算法的选择提供了参考依据 。

一、引言

无人机作为一种新兴的航空设备,在军事、民用等多个领域得到了广泛应用。在执行任务过程中,准确的航迹预测对于无人机完成任务、提高安全性以及实现高效指挥控制具有重要意义。航迹预测是根据无人机当前的飞行状态、气象信息等对其未来运动状态做出预测。然而,无人机系统输入/输出响应模型是非线性和多参数的,这给航迹预测带来了挑战。因此,寻求合适的滤波算法来提高航迹预测的精度和可靠性成为研究热点 。

二、相关滤波算法原理

(一)扩展卡尔曼滤波(EKF)

EKF是卡尔曼滤波在非线性系统中的扩展。它通过对非线性函数进行一阶泰勒展开,将非线性问题近似为线性问题,然后应用卡尔曼滤波的框架进行状态估计。其基本步骤包括预测和更新。预测阶段根据当前状态估计和系统模型预测下一时刻的状态和协方差;更新阶段利用测量值对预测结果进行修正,从而得到更准确的状态估计 。

(二)无迹卡尔曼滤波(UKF)

UKF的核心思想是采用UT变换,利用一组Sigma采样点来描述随机变量的高斯分布,然后通过非线性函数的传递,再利用加权统计线性回归技术来近似非线性函数的后验均值和方差。相比于EKF,UKF不需要对非线性函数进行线性化近似,能够更准确地处理非线性问题,尤其在强非线性系统中表现更优 。

(三)粒子滤波(PF)

粒子滤波是一种基于贝叶斯原理的序贯蒙特卡罗技术。其基本原理是用随机样本来近似状态后验概率密度函数,适用于任何非线性非高斯系统。通过大量的粒子来表示状态空间,每个粒子携带权重,根据观测值更新粒子权重,再通过重采样等操作得到更准确的状态估计。粒子滤波最大的优点是不受线性和高斯分布的限制 。

(四)改进粒子滤波(改进PF)

在传统粒子滤波的基础上,针对粒子退化等问题进行改进。例如,可以采用更合理的重要性采样函数、增加粒子数量、引入辅助变量等方法来提高粒子滤波的性能,使其在无人机航迹预测中能更准确地跟踪和预测航迹 。

三、无人机航迹预测模型构建

(一)无人机运动模型

建立无人机的运动学和动力学模型,描述无人机在三维空间中的位置、速度、姿态等状态变量随时间的变化关系。通常包括位置更新方程、速度更新方程以及姿态角更新方程等,这些方程反映了无人机的运动规律,是航迹预测的基础 。

(二)观测模型

考虑无人机的观测系统,如GPS、惯性测量单元(IMU)等,建立观测模型。观测模型描述了状态变量与观测值之间的关系,通过观测值来修正和更新对无人机状态的估计 。

四、Matlab仿真实验

(一)实验设置

在Matlab环境下进行仿真实验,使用matlab2021a或者更高版本。设置无人机的初始状态、飞行参数、环境噪声等条件。生成不同场景下的无人机飞行数据,包括直线飞行、曲线飞行、受干扰飞行等场景,以全面评估算法性能。实验中运行里面的Runme.m文件,不要直接运行子函数文件,同时注意matlab左侧的当前文件夹窗口必须是当前工程所在路径 。

(二)性能指标

采用位置误差、速度误差、姿态角误差等指标来评估算法的预测精度;通过计算算法的运行时间来评估算法的实时性;分析算法在不同场景下的稳定性,如面对噪声干扰、模型参数变化时的性能表现 。

(三)实验结果

  1. 不同算法在直线飞行场景下的性能对比:EKF算法在直线飞行且噪声较小的情况下,能够较快收敛并给出较准确的预测结果,但在存在一定非线性因素时,误差会逐渐增大。UKF算法的预测精度整体优于EKF,能够更好地处理非线性问题,误差波动较小。PF算法在该场景下也能实现较好的预测,但由于粒子退化问题,在长时间预测时精度有所下降。改进PF算法通过改进措施,在直线飞行场景下的预测精度和稳定性都有明显提升 。
  2. 不同算法在曲线飞行场景下的性能对比:曲线飞行场景增加了非线性程度。EKF算法的误差明显增大,难以准确跟踪曲线轨迹。UKF算法相对表现较好,但在复杂曲线和强噪声环境下,精度也会受到一定影响。PF算法和改进PF算法在处理曲线飞行时具有优势,能够较好地适应非线性变化,改进PF算法在粒子多样性和权重更新方面的改进使其在该场景下的预测精度高于PF算法 。
  3. 不同算法在受干扰飞行场景下的性能对比:在受干扰飞行场景中,如存在大气扰动、电磁干扰等情况,EKF和UKF算法的稳定性受到较大挑战,误差迅速增大。PF算法和改进PF算法由于其对非线性和非高斯环境的适应性,能够在一定程度上抑制干扰,保持相对稳定的预测性能,改进PF算法在抗干扰能力上表现更为突出 。

五、结果分析与讨论

综合实验结果,不同滤波算法在无人机航迹预测中各有优缺点。EKF算法简单易用,在弱非线性和噪声较小的环境下有较好表现,但在强非线性和复杂环境中性能受限。UKF算法在处理非线性问题上优于EKF,能提供更准确的预测,但计算复杂度相对较高。PF算法具有很强的适应性,能处理各种非线性非高斯系统,但存在粒子退化问题。改进PF算法通过改进策略有效缓解了粒子退化问题,在复杂场景下的预测精度、稳定性和实时性方面都有较好的平衡,更适合实际应用中的无人机航迹预测 。

六、结论与展望

本研究通过对EKF、UKF、PF、改进PF滤波算法在无人机航迹预测中的应用进行深入研究和Matlab仿真实验,得出了不同算法在不同场景下的性能特点。改进PF算法在复杂环境下展现出优势,为无人机航迹预测提供了更有效的方法。未来的研究可以进一步优化改进PF算法,探索更高效的粒子采样和权重更新策略;结合多传感器融合技术,提高航迹预测的准确性和可靠性;考虑实际应用中的更多因素,如硬件资源限制、实时性要求等,推动无人机航迹预测技术的实际应用 。

📚2 运行结果

部分代码:

%% %%%%%%%%%%% EKF滤波算法 %%%%%%%%%%%%
Qekf = Q;                   % EKF过程噪声方差
Rekf = R;                   % EKF过程噪声方差 
Xekf=zeros(9,T);            % 滤波状态
Xekf(:,1)=X(:,1);           % EKF滤波初始化
Pekf = P0;                  % 协方差
Tekf=zeros(1,T);            % 用于记录一个采样周期的算法时间消耗
%% %%%%%%%%%%% UKF滤波算法 %%%%%%%%%%%%           
Qukf = Q;              % UKF过程噪声方差
Rukf = R;              % UKF观测噪声方差 
Xukf=zeros(9,T);       % 滤波状态
Xukf(:,1)=X(:,1);      % UKF滤波初始化
Pukf = P0;             % 协方差
Tukf=zeros(1,T);       % 用于记录一个采样周期的算法时间消耗 
%% %%%%%%%%%%% PF滤波算法 %%%%%%%%%%%%
N = 200;                 % 粒子数              
Xpf=zeros(n,T);        % 滤波状态
Xpf(:,1)=X(:,1);       % PF滤波初始化
Xpfset=ones(n,N);      % 粒子集合初始化
for j=1:N   % 粒子集初始化
    Xpfset(:,j)=state0;  % 全都初始化为x0,每个粒子的值相等
end
Tpf=zeros(1,T);        % 用于记录一个采样周期的算法时间消耗 

%% %%%%%%%%%%% PF2滤波算法 %%%%%%%%%%%%
N2 = 200;                 % 粒子数 
R2 = [5000 0 0;                 % 观测噪声协方差矩阵  
    0 0.01^2 0                   % 角度的观测值偏差不能给的太大
    0 0 0.01^2];
Xpf2=zeros(n,T);        % 滤波状态
Xpf2(:,1)=X(:,1);       % PF滤波初始化
Xpf2set=ones(n,N2);      % 粒子集合初始化
for j=1:N2   % 粒子集初始化
    Xpf2set(:,j)=state0;  % 全都初始化为x0,每个粒子的值相等
end

%% %%%%%%%%%%% PF3滤波算法 %%%%%%%%%%%%
N3 = 400;                 % 粒子数 
R3 = [5000 0 0;                 % 观测噪声协方差矩阵  
    0 0.01^2 0                   % 角度的观测值偏差不能给的太大
    0 0 0.01^2];
Xpf3=zeros(n,T);        % 滤波状态
Xpf3(:,1)=X(:,1);       % PF滤波初始化
Xpf3set=ones(n,N3);      % 粒子集合初始化
for j=1:N3   % 粒子集初始化
    Xpf3set(:,j)=state0;  % 全都初始化为x0,每个粒子的值相等
end

%% %%%%%%%%%%% EPF滤波算法 %%%%%%%%%%%% 
Xepf=zeros(9,T);       % 滤波状态
Xepf(:,1)=X(:,1);      % EPF滤波初始化
Xepfset=ones(n,N);     % 粒子集合初始化,这里需要定义为一个3维数组,或者简单起见,一次性写完,定义为一个(9xN)的二维数组,表示当前状态的所有粒子
for j=1:N   % 粒子集初始化
    Xepfset(:,j)=state0;  % 全都初始化为state0,每个粒子的值相等
end
Pepf = P0*ones(n,n*N);% 各个粒子的协方差,这里需要定义为一个3维数组,或者简单起见,一次性写完,定义为一个9x(9xN)的二维数组
Tepf=zeros(1,T);       % 用于记录一个采样周期的算法时间消耗   

%% %%%%%%%%%%% EPF2滤波算法 %%%%%%%%%%%%
Rekf2 = R2;
Xepf2=zeros(9,T);       % 滤波状态
Xepf2(:,1)=X(:,1);      % EPF滤波初始化
Xepf2set=ones(n,N2);     % 粒子集合初始化,这里需要定义为一个3维数组,或者简单起见,一次性写完,定义为一个(9xN)的二维数组,表示当前状态的所有粒子
for j=1:N2   % 粒子集初始化
    Xepf2set(:,j)=state0;  % 全都初始化为state0,每个粒子的值相等
end
Pepf2 = P0*ones(n,n*N2);% 各个粒子的协方差,这里需要定义为一个3维数组,或者简单起见,一次性写完,定义为一个9x(9xN)的二维数组

%% %%%%%%%%%%% EPF3滤波算法 %%%%%%%%%%%%
Rekf3 = R3;
Xepf3=zeros(9,T);       % 滤波状态
Xepf3(:,1)=X(:,1);      % EPF滤波初始化
Xepf3set=ones(n,N3);     % 粒子集合初始化,这里需要定义为一个3维数组,或者简单起见,一次性写完,定义为一个(9xN)的二维数组,表示当前状态的所有粒子
for j=1:N3   % 粒子集初始化
    Xepf3set(:,j)=state0;  % 全都初始化为state0,每个粒子的值相等
end
Pepf3 = P0*ones(n,n*N3);% 各个粒子的协方差,这里需要定义为一个3维数组,或者简单起见,一次性写完,定义为一个9x(9xN)的二维数组

%%%%%%%%%%%%% UPF滤波算法 %%%%%%%%%%%%  
Xupf=zeros(n,T);       % 滤波状态  
Xupf(:,1)=X(:,1);      % UPF滤波初始化
Xupfset=ones(n,N);     % 粒子集合初始化     
for j=1:N   % 粒子集初始化
    Xupfset(:,j)=state0;  % 全都初始化为state0,每个粒子的值相等
end
Pupf = P0*ones(n,n*N); % 各个粒子的协方差    
Tupf=zeros(1,T);       % 用于记录一个采样周期的算法时间消耗        
 

Xmupf = zeros(n,T);       % 滤波状态  
Tmupf = zeros(1,T);
%% %%%%%%%%%%%%%%%%%%%% 模拟系统运行 %%%%%%%%%%%%%%%%%%%%%%%%%

for t=2:T
    % 模拟系统状态运行一步
    [y1,y2,y3,y4,y5,y6,y7,y8,y9] = feval('ffun',X(:,t-1));
    X(:,t)= [y1,y2,y3,y4,y5,y6,y7,y8,y9]'+ sqrtm(Q) * randn(n,1);  % 产生实际状态值
end

%% 模拟目标运动过程,观测站对目标观测获取距离数据
for t=1:T
    [dd,alpha,beta]=hfun(X(:,t),Station);
    Z(:,t)= [dd,alpha,beta]'+sqrtm(R)*randn(3,1);
end

sum_pf = 0;
sum_epf = 0;
for t=2:T
    % 调用EKF算法
    tic
    [Xekf(:,t),Pekf]=ekf(Xekf(:,t-1),Z(:,t),Pekf,Qekf,Rekf,Station);                 
    Tekf(t)=toc;
    
    % 调用UKF算法
    tic
    [Xukf(:,t),Pukf]=function_ukf(Station,Xukf(:,t-1),Pukf,Z(:,t),Qukf,Rukf);        
    Tukf(t)=toc;
    
    % 调用PF算法
    tic
    [Xpf(:,t),Xpfset,Neffpf]=pf(Xpfset,Z(:,t),N,n,R,Q,Station);                             
    Tpf(t)=toc;
    sum_pf = sum_pf + Neffpf;
    
    % 调用PF2算法
    [Xpf2(:,t),Xpf2set,Neffpf]=pf(Xpf2set,Z(:,t),N2,n,R2,Q,Station);                             
    
    % 调用PF3算法
    [Xpf3(:,t),Xpf3set,Neffpf]=pf(Xpf3set,Z(:,t),N3,n,R3,Q,Station);                             
    
    
    % 调用EPF算法
    tic
    [Xepf(:,t),Xepfset,Pepf,Neffepf]=epf(Xepfset,Z(:,t),n,Pepf,N,R,Qekf,Rekf,Station);       
    Tepf(t)=toc;
    sum_epf = sum_epf + Neffepf;
    
    % 调用EPF2算法
    [Xepf2(:,t),Xepf2set,Pepf2,Neffepf]=epf(Xepf2set,Z(:,t),n,Pepf2,N2,R2,Qekf,Rekf2,Station);       % 搞定
    
    % 调用EPF3算法
    [Xepf3(:,t),Xepf3set,Pepf3,Neffepf]=epf(Xepf3set,Z(:,t),n,Pepf3,N3,R3,Qekf,Rekf3,Station);       % 搞定
    
    % 调用UPF算法
    %tic
    %[Xupf(:,t),Xupfset,Pupf]=upf(Xupfset,Z(:,t),n,Pupf,N,R,Qukf,Rukf,Station);         % 1
    %Tupf(t)=toc;

end

🎉3 参考文献

[1]李帅,张杰,杜立杰,李盼.工程测量中无人机航测技术的应用[J].黑龙江科学,2022,13(16):56-58. 

👨‍💻4 Matlab代码实现

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。