⛄一、无人机简介

0 引言
随着现代技术的发展,飞行器种类不断变多,应用也日趋专一化、完善化,如专门用作植保的大疆PS-X625无人机,用作街景拍摄与监控巡察的宝鸡行翼航空科技的X8无人机,以及用作水下救援的白鲨MIX水下无人机等,决定飞行器性能主要是内部的飞控系统和外部的路径规划问题。就路径问题而言,在具体实施任务时仅靠操作员手中的遥控器控制无人飞行器执行相应的工作,可能会对操作员心理以及技术提出极高的要求,为了避免个人操作失误,进而造成飞行器损坏的危险,一种解决问题的方法就是对飞行器进行航迹规划。
飞行器的测量精度,航迹路径的合理规划,飞行器工作时的稳定性、安全性等这些变化对飞行器的综合控制系统要求越来越高。无人机航路规划是为了保证无人机完成特定的飞行任务,并且能够在完成任务的过程中躲避各种障碍、威胁区域而设计出最优航迹路线的问题。

1 常见的航迹规划算法

图1 常见路径规划算法
文中主要对无人机巡航阶段的航迹规划进行研究,假设无人机在飞行中维持高度与速度不变,那么航迹规划成为一个二维平面的规划问题。在航迹规划算法中,A算法计算简单,容易实现。在改进A算法基础上,提出一种新的、易于理解的改进A算法的无人机航迹规划方法。传统A算法将规划区域栅格化,节点扩展只限于栅格线的交叉点,在栅格线的交叉点与交叉点之间往往存在一定角度的两个运动方向。将存在角度的两段路径无限放大、细化,然后分别用两段上的相应路径规划点作为切点,找到相对应的组成内切圆的圆心,然后作弧,并求出相对应的两切点之间的弧所对应的圆心角,根据下式计算出弧线的长度

式中:R———内切圆的半径;
α———切点之间弧线对应的圆心角。

⛄二、粒子滤波算法简介

粒子滤波是一种贝叶斯次优估计算法,它摆脱了解决非线性滤波问题时随机量必须 满足高斯分布的制约条件,并在一定程度上解决了粒子样本匮乏问题,因此,近年来该算法在许多领域得到成功应用。 但是,粒子滤波中的粒子退化问题严重地限制了其基本方法 的发展。粒子滤波详见MCMC 改进粒子滤波算法及其在目标跟踪中的应用

⛄三、部分源代码

% 功能说明:ekf,ukf,pf,改进pf算法的无人机航迹预测比较程序

function main
% 因本程序涉及太多的随机数,下面让随机数每次都不变
rand(‘seed’,3);
randn(‘seed’,6);
% error(‘下面的参数T请参考书中的值设置,然后删除本行代码’)
n = 9;
T = 50;

Q= [1 0 0 0 0 0 0 0 0; % 过程噪声协方差矩阵
0 1 0 0 0 0 0 0 0;
0 0 1 0 0 0 0 0 0;
0 0 0 0.01 0 0 0 0 0;
0 0 0 0 0.01 0 0 0 0;
0 0 0 0 0 0.01 0 0 0;
0 0 0 0 0 0 0.0001 0 0;
0 0 0 0 0 0 0 0.0001 0;
0 0 0 0 0 0 0 0 0.0001];

R = [5000 0 0; % 观测噪声协方差矩阵
0 0.01^2 0 % 角度的观测值偏差不能给的太大
0 0 0.01^2];

% 系统初始化
X = zeros(9,T); % 真实值
Z = zeros(3,T);

% 真实状态初始化
%X(:,1)=[1000;5000;200;10;50;10;2;-4;2]+sqrtm(Q)*randn(n,1);
X(:,1)=[100;500;20;10;50;10;2;-4;2]+sqrtm(Q)*randn(n,1);
state0 = X(:,1);

x0=0;
y0=0;
z0=0;
Station=[x0;y0;z0]; % 观测站的位置

P0 =[100 0 0 0 0 0 0 0 0; % 协方差初始化
0 100 0 0 0 0 0 0 0;
0 0 100 0 0 0 0 0 0;
0 0 0 1 0 0 0 0 0;
0 0 0 0 1 0 0 0 0;
0 0 0 0 0 1 0 0 0;
0 0 0 0 0 0 0.1 0 0;
0 0 0 0 0 0 0 0.1 0
0 0 0 0 0 0 0 0 0.1];

%%%%%%%%%%%%% 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

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 = P0ones(n,nN2);% 各个粒子的协方差,这里需要定义为一个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 = P0ones(n,nN3);% 各个粒子的协方差,这里需要定义为一个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 = P0ones(n,nN); % 各个粒子的协方差
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]=feval(‘hfun’,X(:,t),Station);
Z(:,t)= [dd,alpha,beta]'+sqrtm®*randn(3,1);
end

[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

%%%%%%%%%%%%%%%%%%%%%% 数据分析 %%%%%%%%%%%%%%%%%%%%%%%%%
% 假定
for i = 1:T
Xupf(:,i) = X(:,i) + 2 * sin(t);
end

% RMS偏差比较图
EKFrms = zeros(1,T);
UKFrms = zeros(1,T);
PFrms = zeros(1,T);
EPFrms = zeros(1,T);

PF2rms = zeros(1,T);
EPF2rms = zeros(1,T);

PF3rms = zeros(1,T);
EPF3rms = zeros(1,T);

UPFrms = zeros(1,T);

end

% X轴RMS偏差比较图
EKFXrms = zeros(1,T);
UKFXrms = zeros(1,T);
PFXrms = zeros(1,T);
EPFXrms = zeros(1,T);
% X轴RMS偏差比较图
EKFYrms = zeros(1,T);
UKFYrms = zeros(1,T);
PFYrms = zeros(1,T);
EPFYrms = zeros(1,T);
% Z轴RMS偏差比较图
EKFZrms = zeros(1,T);
UKFZrms = zeros(1,T);
PFZrms = zeros(1,T);
EPFZrms = zeros(1,T);
for t=1:T
EKFXrms(1,t)=abs(X(1,t)-Xekf(1,t));
UKFXrms(1,t)=abs(X(1,t)-Xukf(1,t));
PFXrms(1,t)=abs(X(1,t)-Xpf(1,t));
EPFXrms(1,t)=abs(X(1,t)-Xepf(1,t));

EKFYrms(1,t)=abs(X(2,t)-Xekf(2,t));
UKFYrms(1,t)=abs(X(2,t)-Xukf(2,t));
PFYrms(1,t)=abs(X(2,t)-Xpf(2,t));
EPFYrms(1,t)=abs(X(2,t)-Xepf(2,t));EKFZrms(1,t)=abs(X(3,t)-Xekf(3,t));
UKFZrms(1,t)=abs(X(3,t)-Xukf(3,t));
PFZrms(1,t)=abs(X(3,t)-Xpf(3,t));
EPFZrms(1,t)=abs(X(3,t)-Xepf(3,t));

end

% 画图,三维轨迹图
NodePostion = [100,800,100;
200,800,900;
0,0,0];
figure
t=1:T;
hold on;
box on;
grid on;
for i=1:3
p8=plot3(NodePostion(1,i),NodePostion(2,i),NodePostion(3,i),‘ro’,‘MarkerFaceColor’,‘b’);
text(NodePostion(1,i)+0.5,NodePostion(2,i)+0.5,NodePostion(3,i)+1,

figure
hold on;
box on;
p1=plot(1:T,EKFrms,‘-k.’,‘lineWidth’,2);
p2=plot(1:T,UKFrms,‘-m^’,‘lineWidth’,2);
p3=plot(1:T,PFrms,‘-ro’,‘lineWidth’,2);
%p4=plot(1:T,EPFrms,‘-g*’,‘lineWidth’,2);
p5=plot(1:T,UPFrms,‘-bp’,‘lineWidth’,2);
legend([p1,p2,p3,p5],‘EKF偏差’,‘UKF偏差’,‘PF偏差’,‘DFEPF偏差’);
xlabel(‘time step’);
ylabel(‘RMS预测偏差’);

figure;
hold on;
box on;
p1=plot(1:T,PFrms,‘-k.’,‘lineWidth’,2);
p2=plot(1:T,EPFrms,‘-m^’,‘lineWidth’,2);
p3=plot(1:T,PF2rms,‘-r.’,‘lineWidth’,2);
p4=plot(1:T,EPF2rms,‘-cp’,‘lineWidth’,2);
p5=plot(1:T,PF3rms,‘-g.’,‘lineWidth’,2);
p6=plot(1:T,EPF3rms,‘-bp’,‘lineWidth’,2);
legend([p1,p2,p3,p4,p5,p6],‘PF偏差(Rc=5R,N=200)’,‘DFEPF偏差(Rc=5R,N=200)’,‘PF偏差(Rc=8R,N=200)’,‘DFEPF偏差(Rc=8R,N=200)’,‘PF偏差(Rc=5R,N=400)’,‘DFEPF偏差(Rc=5R,N=400)’);
xlabel(‘time step’);
ylabel(‘RMS预测偏差’);

figure;
hold on;
box on;
p1=plot(1:T,Tekf,‘-k.’,‘lineWidth’,2);
p2=plot(1:T,Tukf,‘-m^’,‘lineWidth’,2);
p3=plot(1:T,Tpf,‘-ro’,‘lineWidth’,2);
p4=plot(1:T,Tepf,‘-bp’,‘lineWidth’,2);
legend([p1,p2,p3,p4],‘EKF时间’,‘UKF时间’,‘PF时间’,‘DFEPF时间’);
xlabel(‘time step’);
ylabel(‘单步时间/s’);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% 再画一个不同Q、R得到的不同的结果图
% 再画一个偏差曲线图

⛄四、运行结果




⛄五、matlab版本及参考文献

1 matlab版本
2014a

2 参考文献
[1]巫茜,罗金彪,顾晓群,曾青.基于改进PSO的无人机三维航迹规划优化算法[J].兵器装备工程学报. 2021,42(08)

3 备注
简介此部分摘自互联网,仅供参考,若侵权,联系删除

【PF三维路径规划】基于matlab改进的粒子滤波无人机三维路径规划【含Matlab源码 1269期】相关推荐

  1. 【Matlab图像融合】小波变换遥感图像融合【含GUI源码 744期】

    一.代码运行视频(哔哩哔哩) [Matlab图像融合]小波变换遥感图像融合[含GUI源码 744期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1] 包子阳,余 ...

  2. 【Matlab人脸识别】KL变换人脸识别【含GUI源码 859期】

    一.代码运行视频(哔哩哔哩) [Matlab人脸识别]KL变换人脸识别[含GUI源码 859期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1] 蔡利梅.MAT ...

  3. 【Matlab心音信号】EMD心音信号特征提取【含GUI源码 1735期】

    一.代码运行视频(哔哩哔哩) [Matlab心音信号]EMD心音信号特征提取[含GUI源码 1735期] 二.matlab版本及参考文献 1 matlab版本 2014a *2 参考文献 [1] 沈再 ...

  4. 【Matlab语音隐写】DWT音频数字水印【含GUI源码 712期】

    一.代码运行视频(哔哩哔哩) [Matlab语音隐写]DWT音频数字水印[含GUI源码 712期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1]韩纪庆,张磊, ...

  5. 【Matlab通信】DTMF双音多频电话拨号仿真【含GUI源码 805期】

    一.代码运行视频(哔哩哔哩) [Matlab通信]DTMF双音多频电话拨号仿真[含GUI源码 805期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1] 蔡利梅 ...

  6. 【Matlab路径规划】改进的遗传算法机器人避障路径规划【含GUI源码 703期】

    一.代码运行视频(哔哩哔哩) [Matlab路径规划]改进的遗传算法机器人避障路径规划[含GUI源码 703期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1] ...

  7. 【聚类算法】基于matlab改进的粒子群算法优化K-means算法【含Matlab源码 1946期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[聚类算法]基于matlab改进的粒子群算法优化K-means算法[含Matlab源码 1946期] 点击上面蓝色字体,直接付费下载,即可 ...

  8. 【Matlab生物电信号】生物电信号仿真【含GUI源码 684期】

    一.代码运行视频(哔哩哔哩) [Matlab生物电信号]生物电信号仿真[含GUI源码 684期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1]董兵,超于毅,李 ...

  9. 【Matlab语音分析】语音信号分析【含GUI源码 1718期】

    一.代码运行视频(哔哩哔哩) [Matlab语音分析]语音信号分析[含GUI源码 1718期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1]韩纪庆,张磊,郑铁 ...

最新文章

  1. 并发队列-无界阻塞优先级队列
  2. 简书显示服务器错误,openfire服务器异常处理
  3. 5m 云服务器2核4g_阿里云服务器2核4gb
  4. python之ORM操作
  5. postman安装路径_OpenStack Swift 安装及使用
  6. SAP BSP应用configuration的加载原理
  7. 第六十九期:【学习分享】温水里的程序员,技术将成为温水
  8. Cookies和Session(二)
  9. Git与GitHub学习笔记(六)使用 Github Pages 管理项目文档
  10. Python检查模块
  11. C/C++ 计算程序运行时间的代码
  12. 音频帧率计算方法(只需要知道 采样率 和 一帧采样数 )
  13. 记一次无意间的bypass云锁的SQL注入
  14. 实现Comparable接口和Comparator接口
  15. 呼呼呼呼呼呼呼呼呼好
  16. 2012年6月10日免费http代理大全
  17. 1. 系统符号与正则符号
  18. 使用计算机时注意的,使用计算机时注意几点预防“鼠标手”
  19. 自我管理能力提升-角色定位
  20. React Native 集成极光推送 jpush-react-native

热门文章

  1. QQ超市模拟排配3D版 1.1 (XNA4.0)
  2. ACFUNProject{网页通用筛选抓取器+C#初学者简易教程}
  3. 联合国首发幸福指数排名 丹麦居首中国112位
  4. 【小技巧】FPGA开发流程普通流程
  5. shell和Makefile
  6. MongoDB系列4——查询操作符
  7. linux 命名管道 c语言 不同进程,进程间通信 - 命名管道实现
  8. 亚马逊精品公司运营和运营主管的指导要求(很干,很实用)
  9. Netron神经网络结构可视化只显示权重没有箭头,已解决
  10. openresty lua-resty-balancer动态负载均衡