针对多无人机编队在动态障碍物环境下的协同飞行与安全避障问题,本文采用领航‑跟随编队控制与控制障碍函数(CBF) 相结合的方法,设计一种分布式多无人机避障控制框架。系统以集群几何中心为虚拟领航点实现稳定编队,通过控制障碍函数将避障约束转化为二次规划(QP)问题,实现无人机对动态障碍物的实时规避;同时引入无人机间安全距离约束,保证单机自主避障且不干扰其他无人机飞行。仿真结果表明,所提方法可实现动态障碍物无碰撞运动、多无人机编队保持、无人机间自主避障,满足复杂动态环境下多机安全协同飞行要求。
一、算法原理
1. 领航-跟随编队控制原理
设计思路 :以无人机集群几何中心为虚拟领航点,所有无人机作为跟随者保持相对位置。
- 计算集群中心位置:
Pcenter=1N∑i=1NPuav,i\boldsymbol{P}{center} = \frac{1}{N}\sum{i=1}^N \boldsymbol{P}_{uav,i}Pcenter=N1i=1∑NPuav,i - 每架无人机保持与中心的固定相对位置,实现队形稳定;
- 中心向总目标点匀速运动,带动整个编队移动。
2. 控制障碍函数(CBF)避障原理
CBF是实现安全避障的核心理论,保证无人机与障碍物/其他无人机始终大于安全距离:
- 定义安全函数:
h(x)=d(x,xobs)−Dsafe≥0h(\boldsymbol{x}) = d(\boldsymbol{x},\boldsymbol{x}{obs}) - D{safe} \ge 0h(x)=d(x,xobs)−Dsafe≥0
ddd为距离,DsafeD_{safe}Dsafe为安全距离,h≥0h \ge 0h≥0 表示无碰撞。 - 安全约束:h˙≥−αh\dot{h} \ge -\alpha hh˙≥−αh,保证系统渐进安全;
- 将避障需求转化为线性不等式约束,代入二次规划求解最优控制量。
3. 二次规划(QP)求解
目标:最小化控制量与期望速度的误差
约束:满足CBF避障安全条件
min12vTv−vaimTv\min \frac{1}{2}\boldsymbol{v}^T\boldsymbol{v} - \boldsymbol{v}_{aim}^T\boldsymbol{v}min21vTv−vaimTv
s.t. Av≤bs.t. \ \boldsymbol{A}\boldsymbol{v} \le \boldsymbol{b}s.t. Av≤b
求解得到无碰撞、稳定平滑的无人机速度。
4. 动态障碍物运动原理
- 每个障碍物独立随机生成运动方向与速度;
- 到达边界自动速度反弹;
- 实时检测与其他障碍物距离,小于安全距离则速度反向,实现无碰撞移动。
二、实现思路
MATLAB代码采用模块化设计,分为参数初始化、动态障碍物更新、无人机控制、可视化更新四大流程:
阶段1:初始化模块
- 配置无人机数量、初始位置、目标点;
- 配置动态障碍物数量、初始位置、运动参数;
- 定义安全距离、避障强度、速度限制等核心参数;
- 计算每架无人机的独立终点位置;
- 初始化图形界面,为不同无人机分配颜色+终点标记符号。
阶段2:动态障碍物更新(无碰撞移动)
循环遍历每个障碍物:
- 独立计时,定时随机改变运动方向与速度;
- 预计算下一时刻位置,进行边界碰撞检测;
- 与其他障碍物进行距离检测,小于安全距离则速度反向;
- 更新障碍物位置并刷新绘图。
阶段3:无人机编队+自主避障(核心)
- 虚拟领航点控制:计算集群中心向目标点的期望速度;
- 全局避障:CBF构建障碍物安全约束,QP求解中心速度;
- 单机独立避障 (新增功能):
- 每架无人机单独检测其他无人机距离;
- 构建无人机间防碰撞约束,独立QP求解速度;
- 保证无人机互不干扰、无碰撞;
- 龙格-库塔法更新无人机位置,保证运动平滑。
阶段4:可视化与数据存储
- 实时更新无人机、障碍物位置图形;
- 绘制无人机轨迹,用不同标记显示各无人机终点;
- 绘制速度、编队误差、目标距离曲线;
- 存储无人机飞行轨迹数据。
三、约束条件
1. 移动障碍物不碰撞实现
- 为每个障碍物设置独立运动逻辑,互不影响;
- 移动前预检测与所有障碍物的距离;
- 距离 < 安全距离 → 速度立即反向,从根源避免碰撞;
- 边界触碰反弹,防止飞出仿真区域。
2. 无人机独立自主避障
- 保留原编队结构,不改变整体协同逻辑;
- 为每架无人机增加单机避障层 :
- 检测周围其他无人机位置;
- 构建独立安全约束;
- 单独求解二次规划,获得自身无碰撞速度;
- 实现:编队不乱、无人机不撞、自主绕避。
四、部分MATLAB代码及效果
bash
clc; clear all; close all; warning off;
% 1. 无人机配置
UAV_NUM = 6; % 无人机数量
car_position = [-2, -3, -2, -1, -3,-1;
-2, -2, -3, -2.5, -0.5,0;
0, 0, 0, 0, 0,0];
% 2. 障碍物初始配置(独立随机移动)
OBSTACLE_NUM = 6; % 障碍物数量
obstacle_position = [0, 2, 2, 4, 1, 3;
-1, 2, 4, 4, -2, 2.5];
for k = 1:UAV_NUM
% 基础编队速度
v_base = center_v - 10*(car_position(1:2,k)-center_position-relative_center_position(:,k));
% 构建单机独立避障约束:避开其他无人机
A_uav = []; b_uav = [];
for m = 1:UAV_NUM
if m == k, continue; end
dx = car_position(1,k) - car_position(1,m);
dy = car_position(2,k) - car_position(2,m);
d = norm([dx; dy]);
safe_d = uav_safe_dist;
if d < safe_d * 1.8 % 近距离才触发避障
A_uav = [A_uav; dx/d, dy/d];
b_uav = [b_uav; alpha*(d - safe_d)];
end
end
% 单机独立求解速度(自主避障)
if ~isempty(A_uav)
v_opt = quadprog(eye(2), -v_base, -A_uav, b_uav, [], [], [], [], [], opt);
else
v_opt = v_base;
end
car_v(:,k) = max(min(v_opt, speed_limit), -speed_limit);
end


