【MATLAB例程】5个UAV 分布式围捕编队运动仿真 —— 基于PID控制

该程序实现的是一个 5 架无人机对移动目标进行分布式围捕编队控制的二维仿真系统。系统中包含 1 个移动目标和 5 架无人机,每架无人机均独立执行控制算法,不依赖集中式调度中心,因此具有一定的分布式协同控制特征。
原创代码,包运行成功

文章目录

程序介绍

MATLAB 程序设计并实现了一套 5 架无人机分布式围捕编队运动仿真系统,主要用于验证多无人机在无集中调度条件下对移动目标进行协同包围与跟踪的控制效果。系统中包含一个移动目标和 5 架无人机,目标按照圆形轨迹运动,并叠加低频随机扰动,以模拟实际场景中目标运动的不确定性。各无人机根据自身与目标之间的相对距离和相位角独立计算控制量,从而实现分布式围捕编队控制。

程序采用 PID 控制方法 作为核心控制策略,其中径向 PID 用于调节无人机与目标之间的距离,使其逐渐收敛到设定的包围半径;切向 PID 用于调节无人机相对于目标的相位角,使 5 架无人机在目标周围保持近似均匀的角度间隔。为了提高编队运动的安全性,程序还引入了无人机之间的碰撞避免机制,当任意两架无人机之间的距离小于设定安全距离时,通过排斥势场产生附加控制量,从而降低无人机之间发生碰撞的风险。

在仿真过程中,程序首先生成目标运动轨迹,并初始化各无人机的位置和速度状态;随后在每一个仿真步长内,分别计算无人机相对于目标的径向误差、角度误差、PID 控制输出、目标速度前馈以及避碰控制量,最后通过一阶欧拉积分更新无人机位置。通过这种方式,可以直观模拟无人机从初始散布状态逐渐形成围捕编队,并持续跟踪移动目标的全过程。

程序输出包括实时动画和静态性能分析图两部分。实时动画用于展示目标轨迹、期望包围圆、各无人机运动轨迹、速度方向以及无人机与目标之间的连接关系;静态分析图则进一步给出了无人机完整运动轨迹、径向距离误差曲线以及角度分布均匀性指标。

运行结果

围捕过程(动画截图):

完整的轨迹图:

各UAV距离误差曲线(逐渐收敛):

MATLAB源代码

部分代码如下:

matlab 复制代码
%  5个UAV 分布式围捕编队运动仿真 ------ 基于 PID 控制
% 作者:matlabfilter(V同号,除前期达成一致外,付费咨询)
% 2026-04-26 / Ver1

clear; clc; close all;
rng(0);
%% 全局参数
N        = 5;        % UAV数量
dt       = 0.05;     % 仿真步长 (s)
T_total  = 40;       % 总时长  (s)
steps    = round(T_total/dt);
t_vec    = (0:steps-1)*dt;

R_des    = 6.0;      % 期望包围半径 (m)
v_max    = 4.0;      % UAV最大速度 (m/s)
w_enc    = 0.25;     % 包围旋转角速度 (rad/s)
d_safe   = 2.5;      % UAV间安全距离 (m)
k_rep    = 1.5;      % 排斥力增益

%% PID 增益
% 径向 (r)
Kp_r = 2.0;  Ki_r = 0.08;  Kd_r = 0.6;
% 切向 (θ)
Kp_a = 3.0;  Ki_a = 0.05;  Kd_a = 0.5;

%% 目标轨迹生成
%  主体:慢速圆形;叠加:低频随机游走
rng(42);
tgt_pos  = zeros(2, steps);
tgt_vel  = zeros(2, steps);
noise_x  = cumsum(0.03*randn(1,steps))*dt;
noise_y  = cumsum(0.03*randn(1,steps))*dt;
for k = 1:steps
    tk = t_vec(k);
    tgt_pos(1,k) = 4*cos(0.12*tk) + noise_x(k);
    tgt_pos(2,k) = 4*sin(0.12*tk) + noise_y(k);
end
% 目标速度(数值微分)
tgt_vel(:,1) = [0;0];
for k = 2:steps
    tgt_vel(:,k) = (tgt_pos(:,k)-tgt_pos(:,k-1))/dt;
end

如需帮助,或有导航、定位滤波相关的代码定制需求,请点击下方卡片联系作者

相关推荐
落羽的落羽1 小时前
【项目】C++从零实现JsonRpc框架——项目引入
linux·服务器·开发语言·c++·人工智能·算法·机器学习
墨月白1 小时前
【Python】程序设计基本方法
开发语言·python
TAN-90°-1 小时前
Java 5——final 抽象 接口
java·开发语言
Andy1 小时前
C++ 容器适配器_栈_队列_双端队列
开发语言·网络·c++
吴声子夜歌1 小时前
Java——显示锁
java·开发语言
思麟呀2 小时前
在C++基础上理解Csharp-2
开发语言·jvm·c++·c#
桀人2 小时前
类和对象——上篇
开发语言·c++
zzzsde2 小时前
【Linux】线程概念与控制(3):线程ID&&C++封装线程
linux·运维·服务器·开发语言·算法
消失的旧时光-19432 小时前
C 语言如何实现“面向对象”?—— 从 struct + 函数指针,到 Linux 内核设计思想
linux·c语言·开发语言