UGV/UAV异构混合阶多智能体一致性:建模、MATLAB仿真与收敛性分析
2026/9/15 4:47:28 网站建设 项目流程

简介:针对UGV与UAV构成的异构混合阶多智能体系统的一致性性能分析,这份matlab仿真资源提供了完整的验证方案。面向本硕博科研学习者,尤其适合研究多智能体协同控制、异构系统一致性算法的读者。资源共3个文件,包含可运行的main.m主程序、一张结果示意图(jpg)以及操作录像(avi),压缩包整体仅1.63MB,轻量易用。操作录像在matlab2021a环境下录制,详细演示了如何正确设置当前文件夹路径并运行程序,即便是初次接触该仿真的读者也能按图索骥,快速复现一致性性能结果。已有227人学习浏览,内容聚焦UGV与UAV混合阶一致性算法的性能评估,可帮助读者深入理解异构多智能体系统的动态行为,并为参数调整、算法改进及后续论文实验提供可靠基线。整个资源精炼实用,非常适合作为科研入门或方法验证的参考工具。

1. 异构混合阶多智能体一致性:UGV/UAV协同要从哪里建模

UGV 在地面的滚动运动学通常近似为一阶积分环节,UAV 的飞行内环则表现为带速度状态的二阶动态。让这两类设备协同巡检或编队,第一道坎不是通信,而是模型阶数不同:一阶智能体没有速度状态,二阶智能体的控制要同时消掉位置差和速度差。分析这类系统能否收敛到同一状态,就是异构混合阶多智能体一致性。反直觉的是,直接套用纯一阶或纯二阶一致性协议到混合系统,不是发散就是慢到不可用。做完这个仿真你能回答三个问题:混合阶一致性怎么定义、MATLAB 怎么建模型、参数和拓扑对收敛性能的影响边界在哪里。适合做多机器人协同的研究生、无人系统编队的控制工程师,以及想快速复现一条可验证仿真曲线的仿真岗从业者。

2. 图拓扑与增广系统状态空间:把UGV一阶和UAV二阶统一起来

先把数学模型写干净,再做 MATLAB 实现。处理混合阶系统的关键是找到一套统一的相位量和耦合规则,让一阶和二阶智能体在同一个微分方程框架下被积分。

2.1 一致性在混合阶系统里到底定义什么

无领导者一致性是最常见的设定。设智能体总数为 N,其中前 m 个是 UGV,动力学接近一阶积分环节:

x_i'(t) = u_i(t), i ∈ V1

后面 N-m 个是 UAV,采用带速度状态的双积分模型:

x_i'(t) = v_i(t), v_i'(t) = u_i(t), i ∈ V2

所有 x_i 都取一维位置,多维情形用 Kronecker 积扩展即可,不影响控制结构。混合阶一致性目标定义为:所有 N 个智能体的位置最终相等,且二阶智能体的速度归零,即 x_i(t) → x*,i = 1…N;同时 v_i(t) → 0,i ∈ V2。值得注意的是,这个定义没有要求一阶智能体收敛到某个物理速度,因为一阶 UGV 的速度就是输入量本身,没有独立状态。

控制协议按阶数分开写,这是整个仿真的核心。一阶 UGV 的位置误差反馈写为:

u_i = β Σ a_ij (x_j - x_i)

二阶 UAV 的反馈同时包含位置误差和速度误差:

u_i = β Σ a_ij (x_j - x_i) + γ Σ a_ij (v_j^v - v_i)

其中 v_j^v 是邻居速度项:如果邻居 j 属于 V2,取真实速度 v_j;如果邻居 j 属于 V1,该项直接置零。这样设计的原因很直接:一阶节点没有速度状态可供耦合,二阶节点面对一阶邻居时就只保留位置差分,避免凭空引入不可测量状态。β 和 γ 分别是位置增益和速度阻尼增益,也是后面调参最敏感的两个标量。

2.2 邻接矩阵、拉普拉斯矩阵与代数连通度

通信拓扑用无向图 G = (V,E) 描述。定义邻接矩阵 A_adj,a_ij = 1 表示节点 i 和 j 能通信,否则为 0。对角阵 D 存放每个节点的度数,拉普拉斯矩阵 L = D - A_adj。

对无向连通图,L 是半正定对称矩阵,特征值满足 0 = λ1 < λ2 ≤ … ≤ λN。λ2 被称为代数连通度,它直接决定一致性算法的收敛速度。对于一阶一致性协议 u_i = -Σ a_ij (x_j - x_i),闭环系统可以写成 x' = -L x,其收敛率由 -L 的第二小特征值决定:λ2 越大,位置差衰减越快。

混合阶系统里 λ2 仍然起主导作用,但不再那么直观。二阶 UAV 的速度阻尼项会把特征值分布变成一个复平面上的图案,实数部分主导收敛率,虚数部分主导振荡行为。后面第 4 章会专门用增广矩阵特征值来量化这一点。

2.3 用增广矩阵把混合阶闭环保成一个线性常微分方程

完整闭环是线性定常系统,只是不同节点位置行的结构不一样。定义增广状态向量:

z = [x1; x2; …; xN; v_{m+1}; …; vN] ∈ R^{N+N2}

其中 N2 = N - m 是二阶节点数量。整个闭环可以写成 z' = A_c z,A_c 分四块构建:

位置行部分:一阶节点的位置导数方程为 x_i' = -β Σ L(i,j) x_j,所以对应 A_c 行取 -β L(i,:);二阶节点的位置导数是 x_i' = v_i,所以对应行的位置列全 0,在速度列里对应自身位置放 1。

速度行部分:二阶节点的速度导数方程是 v_i' = -β Σ L(i,j) x_j - γ Σ L(i,j) v_j^v。由于一阶节点没有速度状态,速度耦合矩阵要缩掉一阶列,只保留 V2×V2 块。这个细节和上一小节协议里的 v_j^v 置零完全对应。

有了 A_c,就可以用数值线性代数的标准工具分析整个系统的稳定性,而不用每次靠肉眼盯曲线。接下来的 MATLAB 仿真先是直接解微分方程,再回头用 A_c 做特征值校验,两条路径对拍。

3. MATLAB下的异构混合阶一致性仿真核心代码与参数表

这一章给出可直接运行的 MATLAB 仿真框架。先把参数表和拓扑定下来,再写微分方程函数,最后通过一致性误差观测确认收敛行为。

3.1 先定参数:拓扑、初值与控制器增益

用一个 6 节点环状拓扑作为基准算例,其中节点 1 到 4 是一阶 UGV,节点 5 到 6 是二阶 UAV。环状拓扑是通信代价和连通性之间的中间选择,比链式收敛快,又不像全连接那样浪费通信带宽。邻接矩阵如下:

A_adj = [0 1 0 0 0 1; 1 0 1 0 0 0; 0 1 0 1 0 0; 0 0 1 0 1 0; 0 0 0 1 0 1; 1 0 0 0 1 0];

对应的拉普拉斯矩阵 L 由 degree 矩阵减邻接矩阵得到。初始位置故意拉开间距,让一致性过程有足够动态可看。初始速度只赋给两个 UAV,且带一个小扰动。

参数取值含义
N6智能体总数
V11:4一阶 UGV 节点编号
V25:6二阶 UAV 节点编号
β2.0位置误差反馈增益
γ2.5速度阻尼增益
T20 s仿真时长
x0[0; 0.8; 1.6; 2.4; 0.5; 1.2]初始位置
v0[0.1; -0.2]二阶节点初始速度

3.2 混合阶状态方程的实现:手写odefun

MATLAB 用 ode45 做自适应步长积分,核心是把混合阶微分方程写成一个向量输出函数。状态排列规则和 2.3 节保持一致:前 N 个是位置,后 N2 个是二阶速度。

function dy = consensus_ode(t, y, L, beta, gamma, V1, V2) % y: 前N个状态为位置x,后N2个状态为二阶速度v N = length(y) - length(V2); x = y(1:N); v = y(N+1:end); dx = zeros(N, 1); % 一阶UGV:位置导数等于位置误差反馈 dx(V1) = -beta * (L(V1, :) * x); % 二阶UAV:位置导数等于自身速度 dx(V2) = v; % 二阶UAV速度导数:位置耦合 + 速度阻尼 maskV = zeros(N, 1); maskV(V2) = 1; G = L .* maskV'; % 速度耦合矩阵,一阶列置零 dv = -beta * (L(V2, :) * x) - gamma * (G(V2, :) * v); dy = [dx; dv]; end

代码里最关键的是 G 矩阵的构造。L 是 N×N 拉普拉斯矩阵,maskV' 是一行向量,只有二阶节点位置是 1,一阶节点位置是 0。L 的每一列乘以 maskV' 的对应元素,相当于把一阶节点的速度耦合列全部清零。这样二阶 UAV 在算速度阻尼时,不会试图和一阶 UGV 的“速度”做差分,因为那个速度根本不存在。

调用脚本如下:

load adjacency.mat % 或直接粘贴上面的邻接矩阵 L = diag(sum(A_adj, 2)) - A_adj; beta = 2.0; gamma = 2.5; V1 = 1:4; V2 = 5:6; x0 = [0; 0.8; 1.6; 2.4; 0.5; 1.2]; v0 = [0.1; -0.2]; y0 = [x0; v0]; T = 20; [t, y] = ode45(@(t, y) consensus_ode(t, y, L, beta, gamma, V1, V2), ... [0 T], y0);

ode45 返回的 y 矩阵是 (N+N2) 列,前 N 列是位置轨迹,后 N2 列是 UAV 速度轨迹。后面做录像时要注意一个坑:ode45 的 t 不是均匀时间轴,直接对 t 做索引绘帧会造成前段密集后段稀疏,这是第 5 章要专门处理的问题。

3.3 一致性误差观测与三张必看绘图

一致性误差定义为位置最大偏差加二阶速度最大绝对值:

E(t) = max_i |x_i(t) - mean(x(t))| + max_{j∈V2} |v_j(t)|

E(t) 的衰减形态直接反映一致性性能。如果 E(t) 按指数快速下降并落到阈值以下,说明协议参数合理;如果 E(t) 震荡不降或先降后升,说明特征值有问题。

N = length(V1) + length(V2); x_all = y(:, 1:N); v_2nd = y(:, N+1:end); pos_err = max(abs(x_all - mean(x_all, 2)), [], 2); vel_err = max(abs(v_2nd), [], 2); consensus_err = pos_err + vel_err; figure; semilogy(t, consensus_err, 'LineWidth', 1.5); xlabel('t (s)'); ylabel('Consensus Error'); title('E(t) 半对数曲线'); grid on;

semilogy 的选择很重要,线性坐标下看不出指数衰减段和平台段的边界。半对数图里,如果曲线有一段明显的线性下降,那段就是一致性收敛的指数阶段。平台高度由数值积分容差决定,一般设在 1e-6 到 1e-8 量级就算达到一致。

除了误差曲线,位置-时间曲线和速度-时间曲线也要放在同一张 figure 里对比。位置曲线应当最终汇合到同一个水平线,UAV 速度曲线应当回落到 0 附近。如果位置曲线汇合但速度曲线停在非零值,说明混合阶协议里速度阻尼项失效,最常见原因是 G 矩阵没有正确置零一阶列。

4. 收敛性边界与代数连通度:参数怎么调才不跑飞

仿真跑通只是第一步,能解释为什么收敛、为什么发散,才算真正理解混合阶一致性。这一章通过增广矩阵特征值分析,给出参数调节的量化依据。

4.1 从增广矩阵特征值反推收敛上界

上一章的 ode 函数适合数值积分,但要看收敛边界还得显式构造 A_c。按照 2.3 节的结构,在 MATLAB 里拼接出完整的闭环矩阵:

N = 6; N2 = length(V2); Ac = zeros(N + N2, N + N2); % 位置行:一阶取 -beta*L,二阶取自身速度 Ac(1:N, 1:N) = -beta * L; for k = 1:N2 i = V2(k); Ac(i, N + k) = 1; end % 速度行:位置耦合 + 速度阻尼 maskV = zeros(N, 1); maskV(V2) = 1; G = L .* maskV'; Ac(N+1:end, 1:N) = -beta * L(V2, :); Ac(N+1:end, N+1:end) = -gamma * G(V2, :); eigs_Ac = eig(Ac); max_real = max(real(eigs_Ac)); max_imag = max(abs(imag(eigs_Ac)));

max_real 是判断稳定性的第一指标。全连通且参数合理时,max_real 通常为负,数值大约在 -0.5 到 -2 之间,取决于 β 和 λ2 的乘积。如果 max_real 接近 0 甚至大于 0,系统要么慢得离谱,要么直接发散。max_imag 反映振荡倾向,虚部越大,位置轨迹里能看到的过冲和摆动越多。

这个矩阵构造方法和上一章 ode 函数是对拍的:ode 函数跑出来的轨迹收敛,那么 Ac 的特征值必然全部落在左半平面;如果特征值有正实部,轨迹必然发散,不需要看完整条仿真曲线就能提前判断。

4.2 三个典型失效形态:发散、等幅振荡与慢收敛

特征值分析可以归纳出三类最常踩的坑。

第一类是速度阻尼 γ 过小。这时 β 主导位置反馈,γ 主导速度阻尼,γ 太小意味着 UAV 在接近目标位置时还有很大速度,容易冲过目标。特征值表现是 max_real 接近 0,max_imag 明显增大,轨迹上看到持续 4 到 6 个周期的大超调。这种情况把 γ 提高到 β 的 1.2 到 2 倍即可。

第二类是 β 过大而 γ 保持较小,位置误差反馈太强,系统进入过驱动状态。特征值仍然在左半平面,但虚部占比很高,误差曲线不是指数衰减而是带明显涟漪的锯齿形。这时候应当同时放大 γ,或者减小 β,让位置反馈和速度阻尼的比例维持在合理范围。

第三类是拓扑不连通,或者连通但一阶节点汇聚到某个孤立分量。只要拉普拉斯矩阵有多个零特征值,系统就无法形成全局一致。这类问题特征值分析是最快诊断手段:λ2 小于一个很小阈值比如 1e-6 时,直接检查邻接矩阵是否连成一片。

4.3 代数连通度与通信代价的折中

不改变 β 和 γ,只改拓扑,收敛速度会差一个量级以上。表 2 对比三种常见拓扑下 λ2 的量级差异,以及它们对一致性的影响。

拓扑代数连通度 λ2收敛速度量级通信链路数
链式(首尾不连)约 0.268慢,误差衰减被拉长5
环状1.0中等,适合基准测试6
全连接6.0快,但对通信压力大15

链式拓扑的 λ2 只有 0.268,如果 β 取 2,有效反馈系数只有 0.536,误差衰减时间常数接近 2 秒;全连接时同样 β 下反馈系数是 12,时间常数不到 0.1 秒。代数连通度是一个全局指标,但它不告诉你哪条链路关键,直接用 λ2 做优化目标也容易把拓扑改成一个高度数中心节点。实际工程里建议在环状和全连接之间取折中,比如在环上加两条冗余边,把 λ2 从 1 提升到 2 到 3,收益远大于继续提升 β。

5. 仿真录像与轨迹可视化:把一致性过程做成可验证的视频

仿真录像不是把几张图拼在一起,而是把时间连续的一整套动态过程压缩成几十秒的视频。做录像前先解决数据分辨率问题,否则会产生完全错误的动态观感。

5.1 先插值再录像:变步长输出的常见坑

ode45 是自适应步长积分器,t 数组的时间间隔不均匀:在状态变化快的阶段步长会缩得很小,在接近稳态的阶段步长会拉大。如果直接用 t 循环 frame,就会出现前半段每帧位移明显、后半段几帧之间几乎不动,整个录像节奏失真。

正确的做法是先对 y 做均匀时间轴插值,再逐帧写视频:

t_samp = linspace(0, T, 600); y_samp = interp1(t, y, t_samp, 'pchip'); x_samp = y_samp(:, 1:N); v_samp = y_samp(:, N+1:end);

pchip 插值比 linear 平滑,又不会像 spline 那样在端点产生明显过冲。600 帧配上 30 fps 的帧率正好是 20 秒视频,和仿真时长一致。

5.2 录像画面里叠加误差条的三行代码

面向一致性分析的录像,比轨迹动点更重要的是误差演化。在 figure 下方小窗叠加误差条,能一眼看出收敛时刻:

vw = VideoWriter('consensus_ugv_uav.avi'); vw.FrameRate = 30; open(vw); for k = 1:numel(t_samp) clf; plot(t_samp(1:k), x_samp(1:k, :), 'LineWidth', 1.5); hold on; subplot(2, 1, 2); semilogy(t_samp(1:k), consensus_err_samp(1:k), 'r', 'LineWidth', 1.5); title(sprintf('t = %.2f s', t_samp(k))); frame = getframe(gcf); writeVideo(vw, frame); end close(vw);

subplot 的布局要固定,不能让每一帧的 y 轴范围自动缩放。自动缩放会让误差条在前 2 秒看起来很大,后 5 秒看起来趋近于零,实际大小差异被掩盖。固定 y 轴范围后,才能从视觉上准确判断误差下降了几个量级。

5.3 用尾段几十帧判断录像是否可信

录像完成后,最好的验证办法不是从头播放,而是直接拖到最后 30 帧。一个合格的一致性录像,末段位置轨迹应该静止在同一个值附近,误差条应该保持水平且低于预设阈值,比如 1e-5。如果尾段的误差条还在缓慢下降,说明仿真时长不够,需要延长 T 而不是调整插值;如果尾段的误差条出现抖动甚至上升,基本可以断定参数已经越过稳定性边界,要回到第 4 章的 A_c 特征值检查 max_real 的符号,而不是怀疑录像代码。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询