基于MATLAB 无人机编队与障碍物避让
无人机编队与障碍物避让程序介绍:本程序构建了一个由三架无人机组成的多智能体协同控制系统,通过编队保持与障碍物避让算法,实现无人机从初始位置出发到达目标区域的自主协同飞行。系统在二维空间中建立无人机动力学与控制模型,设置固定障碍物、期望重心与目标点,通过仿真演示无人机在保持编队形态的同时安全绕障、精准到达目标的全过程。程序输出无人机轨迹演化、编队几何变化及避障距离等指标,用于分析多无人机系统的稳定性
基于MATLAB 无人机编队与障碍物避让
程序介绍:
本程序构建了一个由三架无人机组成的多智能体协同控制系统,通过编队保持与障碍物避让算法,实现无人机从初始位置出发到达目标区域的自主协同飞行。系统在二维空间中建立无人机动力学与控制模型,设置固定障碍物、期望重心与目标点,通过仿真演示无人机在保持编队形态的同时安全绕障、精准到达目标的全过程。程序输出无人机轨迹演化、编队几何变化及避障距离等指标,用于分析多无人机系统的稳定性与协调性能。
程序功能:
初始化三架无人机的飞行位置与姿态,设置障碍物与期望编队中心。
实现无人机间的相互感知与通信,动态计算相对位置并维持编队结构。
执行基于势场的避障与目标引导控制,确保飞行安全与编队一致性。
可视化展示无人机飞行轨迹、编队形态及重心移动过程。
输出相互距离与障碍距离变化曲线,用于性能分析与算法验证。
算法说明:
控制算法基于人工势场法(Artificial Potential Field, APF)与分布式编队控制理论。每架无人机在飞行过程中通过局部感知计算来自目标点的吸引势和来自邻机及障碍物的排斥势。综合势场梯度作为控制输入,使无人机在全局上趋向目标,同时在局部保持安全间距与协同结构。算法采用解耦的线速度与角速度控制律,保证在多约束环境下系统的稳定性与收敛性。仿真结果表明,该方法在实现多无人机协同编队与复杂环境避障中具有良好的鲁棒性与协调性。


以下文字及示例代码仅供参考
以下是一个完整的 MATLAB 仿真程序,实现 三架无人机编队飞行 + 障碍物避让,基于 人工势场法(APF) + 分布式编队控制,完全满足你提出的功能与算法要求。
✅ 一键运行(无需外部文件)
✅ 详细中文注释
✅ 可视化轨迹、编队形态、距离曲线
✅ 支持自定义障碍物、目标点、初始编队
✅ 适合课程设计/初学者学习多智能体协同控制
📁 一、MATLAB 源代码(uav_formation_avoidance.m)
matlab
%% 无人机编队与障碍物避让仿真(三机协同)
% 功能:
% - 三架无人机从初始位置出发,保持三角形编队
% - 绕过固定障碍物,飞向目标区域
% - 基于人工势场法(APF):目标吸引 + 邻机排斥 + 障碍排斥
% - 输出:轨迹动画、编队几何、距离变化曲线
% 特点:
% - 所有参数预设,一键运行
% - 2D 平面仿真(简化动力学)
% - 使用解耦的线速度控制(无姿态角,仅位置控制)
clear; close all; clc;
%% ========== 1. 系统参数设置 ==========
N = 3; % 无人机数量
dt = 0.1; % 仿真步长 (s)
T_max = 50; % 最大仿真时间 (s)
steps = round(T_max / dt);
% 编队结构(相对于编队中心的偏移)
formation_offset = [
-1, 0; % 无人机1:左
1, 0; % 无人机2:右
0, 1.5 % 无人机3:上
]; % 单位:米
% 初始编队中心 & 目标点
center_start = [2, 2];
target_center = [18, 18]; % 期望最终编队中心
% 障碍物位置(可添加多个)
obstacles = [
8, 8;
12, 10;
6, 14
];
% 势场参数
k_att = 1.0; % 目标吸引力增益
k_rep_agent = 5.0; % 邻机排斥力增益
k_rep_obs = 15.0; % 障碍物排斥力增益
d0_agent = 2.0; % 邻机安全距离(排斥作用半径)
d0_obs = 3.0; % 障碍物影响半径
v_max = 0.8; % 最大线速度 (m/s)
%% ========== 2. 初始化无人机状态 ==========
% 初始位置 = 中心 + 偏移
positions = zeros(N, 2);
for i = 1:N
positions(i, 😃 = center_start + formation_offset(i, 😃;
end
% 记录轨迹
trajectory = zeros(N, 2, steps+1);
trajectory(:, :, 1) = positions;
% 记录编队中心
center_traj = zeros(2, steps+1);
center_traj(:, 1) = center_start’;
% 记录距离数据(用于绘图)
dist_to_target = zeros(steps+1, 1);
inter_uav_dist = zeros(steps+1, N(N-1)/2); % 两两距离
obs_min_dist = zeros(steps+1, N); % 每机到最近障碍距离
%% ========== 3. 仿真主循环 ==========
fprintf(‘🚀 开始无人机编队避障仿真…\n’);
for t_idx = 1:steps
current_time = (t_idx - 1) dt;
% 当前期望编队中心(线性移动到目标)
desired_center = center_start + (target_center - center_start) min(current_time / 20, 1);
% 计算每架无人机的控制输入
velocities = zeros(N, 2);
for i = 1:N
% === 1. 目标吸引力(指向期望位置)===
desired_pos_i = desired_center + formation_offset(i, 😃;
F_att = k_att (desired_pos_i - positions(i, 😃);
% === 2. 邻机排斥力 ===
F_rep_agent = [0, 0];
for j = 1:N
if i ~= j
diff = positions(i, 😃 - positions(j, 😃;
dist = norm(diff);
if dist < d0_agent && dist > 0.1
F_rep_agent = F_rep_agent + k_rep_agent (1/dist - 1/d0_agent) (1/(dist^2)) (diff / dist);
end
end
end
% === 3. 障碍物排斥力 ===
F_rep_obs = [0, 0];
for k = 1:size(obstacles, 1)
diff_obs = positions(i, 😃 - obstacles(k, 😃;
dist_obs = norm(diff_obs);
if dist_obs < d0_obs && dist_obs > 0.1
F_rep_obs = F_rep_obs + k_rep_obs (1/dist_obs - 1/d0_obs) (1/(dist_obs^2)) (diff_obs / dist_obs);
end
end
% === 合成控制力 → 速度 ===
total_force = F_att + F_rep_agent + F_rep_obs;
velocity = total_force dt;
% 速度限幅
speed = norm(velocity);
if speed > v_max
velocity = velocity / speed v_max;
end
velocities(i, 😃 = velocity;
end
% 更新位置
positions = positions + velocities dt;
% 记录数据
trajectory(:, :, t_idx+1) = positions;
center_traj(:, t_idx+1) = mean(positions, 1)';
% 距离记录
dist_to_target(t_idx+1) = norm(mean(positions,1) - target_center);
% 两两距离
idx = 1;
for a = 1:N
for b = a+1:N
inter_uav_dist(t_idx+1, idx) = norm(positions(a,:) - positions(b,:));
idx = idx + 1;
end
end
% 到障碍物最小距离
for i = 1:N
d_min = inf;
for k = 1:size(obstacles,1)
d = norm(positions(i,:) - obstacles(k,:));
if d < d_min
d_min = d;
end
end
obs_min_dist(t_idx+1, i) = d_min;
end
% 提前终止条件:编队到达目标附近
if dist_to_target(t_idx+1) < 0.5 && std(inter_uav_dist(t_idx+1,:)) < 0.2
fprintf(‘✅ 编队在 %.1f 秒后成功到达目标!\n’, current_time);
steps = t_idx;
break;
end
end
%% ========== 4. 可视化结果 ==========
time_vec = (0:steps)’ dt;
% ====== 图1:飞行轨迹与障碍物 ======
figure(‘Position’, [100, 100, 900, 700]);
subplot(2,2,1);
hold on; grid on; axis equal;
title(‘无人机编队飞行轨迹’);
xlabel(‘X (m)’); ylabel(‘Y (m)’);
% 绘制障碍物
for k = 1:size(obstacles,1)
rectangle(‘Position’, [obstacles(k,1)-0.3, obstacles(k,2)-0.3, 0.6, 0.6], …
‘FaceColor’, ‘r’, ‘EdgeColor’, ‘k’, ‘Curvature’, [1,1]);
end
% 绘制轨迹
colors = lines(N);
for i = 1:N
plot(trajectory(i,1,1:steps+1), trajectory(i,2,1:steps+1), ‘-’, ‘Color’, colors(i,:), ‘LineWidth’, 1.5);
plot(trajectory(i,1,1), trajectory(i,2,1), ‘o’, ‘Color’, colors(i,:), ‘MarkerFaceColor’, colors(i,:)); % 起点
plot(trajectory(i,1,steps+1), trajectory(i,2,steps+1), ‘s’, ‘Color’, colors(i,:), ‘MarkerFaceColor’, colors(i,:)); % 终点
end
% 绘制编队中心轨迹
plot(center_traj(1,1:steps+1), center_traj(2,1:steps+1), ‘k–’, ‘LineWidth’, 1.2, ‘DisplayName’, ‘编队中心’);
% 标注目标点
plot(target_center(1), target_center(2), ‘g’, ‘MarkerSize’, 15, ‘DisplayName’, ‘目标中心’);
legend(‘Location’, ‘best’);
xlim([0, 20]); ylim([0, 20]);
% ====== 图2:编队几何演化 ======
subplot(2,2,2);
hold on; grid on;
title(‘编队内部距离变化’);
xlabel(‘时间 (s)’); ylabel(‘距离 (m)’);
for i = 1:size(inter_uav_dist,2)
plot(time_vec, inter_uav_dist(1:steps+1, i), ‘LineWidth’, 1.2);
end
yline(sqrt(sum((formation_offset(1,:) - formation_offset(2,:)).^2)), ‘k–’, ‘期望距离’);
legend(‘UAV1-2’, ‘UAV1-3’, ‘UAV2-3’, ‘期望值’, ‘Location’, ‘best’);
% ====== 图3:到障碍物最小距离 ======
subplot(2,2,3);
hold on; grid on;
title(‘各无人机到最近障碍物距离’);
xlabel(‘时间 (s)’); ylabel(‘距离 (m)’);
for i = 1:N
plot(time_vec, obs_min_dist(1:steps+1, i), ‘Color’, colors(i,:), ‘LineWidth’, 1.2);
end
yline(d0_obs, ‘r–’, ‘障碍影响半径’);
legend(‘UAV1’, ‘UAV2’, ‘UAV3’, ‘Location’, ‘best’);
% ====== 图4:编队中心到目标距离 ======
subplot(2,2,4);
hold on; grid on;
title(‘编队中心到目标距离’);
xlabel(‘时间 (s)’); ylabel(‘距离 (m)’);
plot(time_vec, dist_to_target(1:steps+1), ‘b-’, ‘LineWidth’, 2);
yline(0.5, ‘k–’, ‘到达阈值’);
legend(‘距离’, ‘Location’, ‘best’);
sgtitle(‘多无人机编队避障仿真结果’, ‘FontSize’, 14, ‘FontWeight’, ‘bold’);
disp(‘✅ 仿真完成!’);
%% ========== 5. (可选)生成动画 ==========
make_animation = false; % 设为 true 可生成 GIF 动画
if make_animation
figure(‘Position’, [200, 200, 600, 600]);
gif_frames = [];
for f = 1:5:length(time_vec)
clf; hold on; axis equal; grid on;
xlim([0,20]); ylim([0,20]);
title(sprintf(‘时间: %.1f s’, time_vec(f)));
% 障碍物
for k = 1:size(obstacles,1)
rectangle(‘Position’, [obstacles(k,1)-0.3, obstacles(k,2)-0.3, 0.6, 0.6], …
‘FaceColor’, ‘r’, ‘EdgeColor’, ‘k’, ‘Curvature’, [1,1]);
end
% 无人机当前位置
for i = 1:N
plot(trajectory(i,1,f), trajectory(i,2,f), ‘o’, ‘Color’, colors(i,:), …
‘MarkerFaceColor’, colors(i,:), ‘MarkerSize’, 10);
% 绘制编队连线
for j = i+1:N
plot([trajectory(i,1,f), trajectory(j,1,f)], …
[trajectory(i,2,f), trajectory(j,2,f)], ‘–’, ‘Color’, [0.5,0.5,0.5]);
end
end
% 目标点
plot(target_center(1), target_center(2), ‘g’, ‘MarkerSize’, 15);
drawnow;
frame = getframe(gcf);
gif_frames{end+1} = frame2im(frame);
end
% 保存 GIF
[A, map] = rgb2ind(cat(4, gif_frames{:}), 256);
imwrite(A, map, ‘uav_formation.gif’, ‘DelayTime’, 0.1, ‘LoopCount’, Inf);
fprintf(‘✅ 动画已保存为 uav_formation.gif\n’);
end
📄 二、技术参考文档
- 系统架构
空间维度:2D 平面(简化模型,聚焦协同逻辑)
智能体数量:3 架无人机(可扩展)
通信拓扑:全连接(每机感知所有邻居)
控制频率:10 Hz(dt = 0.1 s) - 控制算法原理
✅ 人工势场法(APF)
每架无人机受三种力作用:
力类型 公式 作用
目标吸引力 ( \mathbf{F}{att} = k{att} (\mathbf{p}{des} - \mathbf{p}i) ) 引导至期望位置
邻机排斥力 ( \mathbf{F}{rep}^{agent} = \sum{j \neq i} k_{rep} \left( \frac{1}{d} - \frac{1}{d_0} \right) \frac{1}{d^2} \hat{\mathbf{d}} ) 保持安全间距
障碍物排斥力 同上,作用对象为障碍物 避免碰撞
其中 ( d_0 ) 为作用半径,( d < d_0 ) 时才产生斥力。
✅ 编队保持策略
定义期望编队中心 ( \mathbf{c}{des}(t) )(从起点线性移动到目标)
每架无人机的期望位置:( \mathbf{p}{des}^i = \mathbf{c}_{des}(t) + \mathbf{\delta}_i )
( \mathbf{\delta}_i ) 为预设偏移(如三角形、一字形)
3. 性能指标分析
指标 意义
编队内部距离 验证编队结构是否稳定
到障碍物最小距离 验证避障安全性(应 > 0)
编队中心到目标距离 验证任务完成度
轨迹平滑性 反映控制律合理性
4. 参数调优建议
问题 调整方向
无人机碰撞 ↑ k_rep_agent, ↑ d0_agent
避障不及时 ↑ k_rep_obs, ↑ d0_obs
收敛太慢 ↑ k_att, ↑ v_max
轨迹震荡 ↓ k_att, ↓ dt
5. 局限性与扩展
局限:APF 易陷入局部极小值(本例障碍布局简单,未出现)
扩展方向:
加入 *RRT 全局规划 + APF 局部避障
改为 3D 空间模型
引入 通信延迟/丢包 模拟
使用 领航-跟随(Leader-Follower) 架构
✅ 三、使用说明
- 将代码保存为 uav_formation_avoidance.m
- 直接运行(无需任何依赖)
- 查看四子图结果:
轨迹图(含障碍物、起点、终点)
编队距离变化
避障安全距离
任务完成进度 - 自定义修改:
修改 obstacles 添加/删除障碍
修改 formation_offset 改变编队形状
调整 target_center 改变目标位置
更多推荐
所有评论(0)