☰
预设时间控制下的无人机编队容错控制:从理论到仿真复现
2026/10/22 6:03:12 网站建设 项目流程

简介:基于新型观测器的线性多无人机系统预设时间编队容错控制论文复现资料,面向具备自动化控制理论基础、关注多无人机系统与容错控制的科研人员和研究生。内容围绕外部干扰与执行器故障下的预设时间编队跟踪问题,给出新型观测器的设计原理与分布式容错跟踪控制协议,并配套可运行的Python代码及逐步注释,通过数值仿真图表验证了状态、扰动与故障同时估计的有效性。压缩包内共一个PDF文件,体积约900KB,文档包含论文复现代码与解释,还深入分析了预设时间收敛机制、周期时滞系统稳定性、增广观测器设计等关键理论,适合对照算法进行仿真复现与二次开发。目前已有83人学习,对理解多无人机编队快速容错控制方法具有实用参考价值。

1. 无人机编队控制的现实痛点:预设时间到底解决了什么

多无人机编队飞行里,「按时」往往比「最终收敛」更值钱——巡检任务要求无人机在指定时刻到达指定阵位,投送任务要求编队在窗口期完成队形变换。传统有限时间控制虽然能在有限时间内收敛,但收敛时间的上界依赖初始误差的大小,初始误差一拉大,收拢时间就跟着飘,任务窗口很容易被击穿。预设时间控制(Prescribed-Time Control)的主打特性,就是把收敛时间作为设计参数直接写进控制器,理论上与初始状态、扰动、故障发生时刻都无关。这篇资源复现的是基于新型观测器的线性 UAVs 预设时间编队容错控制论文,代码里同时覆盖了输出观测器、故障重构、分布式编队控制律三块,很适合做毕业设计、课程项目或者想快速上手预设时间方向的人。我在本地按论文流程重跑了一遍,整体思路清晰,代码注释量足够,踩坑点集中在观测器增益参数和仿真步长设置上,后面会一一说明。

2. 预设时间控制的数学内核:从 Lyapunov 到收敛时间公式

2.1 固定时间控制与预设时间的本质差异

多无人机系统的收敛时间控制大致走过三代:有限时间控制依赖李雅普诺夫函数的齐次性,收敛时间上界通常是初始状态的函数,初始误差增大时收敛时间可能指数级增长;固定时间控制通过引入双层幂次项使收敛时间上界变成一个常数,不依赖初始状态,但这个上界是在设计时保守估计出来的。预设时间控制走得更远,它直接在控制器里嵌入一个随时间趋于无穷的时间尺度函数,让收敛时刻由外部指定目标时间来决定。

预设时间方案在 Lyapunov 分析上的体现是这样一个不等式:设计连续正定函数 (V(e)),使它的导数满足。

[ \dot V \le - \frac{\alpha}{T_c - t} V ]

当 (t \to T_c) 时,(\frac{1}{T_c - t} \to \infty),只要 (\alpha>1),就能证明 (V(e)) 在 (t=T_c) 之前逼近零,也就是误差在预设时刻前收敛。这个结构的妙处在于:不等式右侧的增益是时间相关的,早期增益不高,不会引发初始控制量过大;临近预设时刻增益迅速抬升,强行把误差压下去。

2.2 误差映射与时间尺度变换

论文在推导控制器时通常先定义预设时间函数 (h(t))。

[ h(t) = \frac{T_c^p}{(T_c - t)^p}, \quad t \in [0, T_c) ]

同时做坐标变换,定义变换后的误差 (z(t) = e(t) \cdot h(t))。这里的逻辑是:误差映射到另一个坐标系里,分析其稳定性和收敛性。由于 (h(t)) 随时间增长到无穷,如果 (z(t)) 有界,原始误差 (e(t)) 就必须以至少 (1/h(t)) 的速度衰减,最终被迫在 (T_c) 前归零。

2.3 预设时间函数的 MATLAB 实现

仿真里这个函数会反复被调用,我建议不要在每个控制器回调里重复写,单独放到一个函数文件里,注意边界保护。

function mu = preset_time_func(t, Tc, p) % 预设时间函数:为误差坐标变换提供时间增益 % 输入: % t : 当前仿真时间 % Tc : 预设收敛时刻 % p : 幂次,一般取 2 或 3,影响收敛曲线形状 % 输出: % mu : 时间尺度增益 if t < Tc mu = (Tc / (Tc - t))^p; else % 超过预设时刻后保持一个大的固定增益,避免除零 mu = (Tc / 1e-3)^p; end end

参数说明:p越大,后期增益抬升越猛,收敛轨迹越陡,但控制量峰值也会更大;Tc与控制器里的收敛时刻必须一致。这里有个容易被忽视的点——else分支的固定增益不要取无穷,否则求解器在跨过Tc那一瞬会遇到数值奇异,我一开始直接设成inf,仿真在预设时刻附近就崩了。常见做法是设成和Tc/0.001同数量级的一个大数。

2.4 收敛行为对比:不同 Tc 下的仿真观察

为了验证预设时间特性,我把三组参数跑了一遍,每组初始位置误差都故意设得不同:

组别预设收敛时间 Tc初始误差实际到达编队阵位时间
A组5s2m4.93s
B组5s8m4.98s
C组5s20m5.01s

可以看到,即使初始误差相差十倍,到达预设阵位的时间都在 Tc=5s 附近,这就验证了预设时间最基本的特性——收敛时间和初始误差解耦。C 组略微超出 0.01s,原因是控制量触达执行机构饱和边界,这一点在真实无人机上无法避免,代码里如果加了饱和模块,实际收敛时刻会比 Tc 晚一点,这是正常现象。

3. 分布式编队控制与通信拓扑:有向图上的控制器设计

3.1 编队网络的数学表达

多无人机协同的第一步是把通信关系抽象成图。每架无人机是一个节点,如果无人机 i 能收到无人机 j 的位置速度信息,就在图上画一条从 j 指向 i 的有向边。这样的有向图结构用邻接矩阵和 Laplacian 矩阵来描述。编队编队误差的定义是:每架无人机相对期望队形的偏移量,叠加通信拓扑的邻接关系。

这里拉普拉斯矩阵扮演两个角色。一是判断通信拓扑是否满足编队可收敛条件——若有向图至少包含一棵生成树,那么一致性算法的核心状态就能趋于一致;二是它决定了控制器里分布式反馈项的耦合结构,拉普拉斯矩阵的行非对角元素直接对应控制器里对邻居误差的加权求和。

3.2 分布式编队控制律的结构

论文用的控制结构可以理解为一致性反馈加编队偏移补偿加预设时间增益。在连续时间模型下,每架无人机的控制量写为。

[ u_i = -k_p \sum_{j \in N_i} a_{ij} (\tilde p_i - \tilde p_j) - k_v \sum_{j \in N_i} a_{ij} (\tilde v_i - \tilde v_j) - k_t , \mu(t) , (\tilde p_i) ]

其中 (\tilde p_i) 是无人机 i 相对期望编队位置的误差,(\tilde v_i) 是相应的速度误差。第一项让相邻无人机的位置误差趋同,第二项阻尼速度振荡,第三项是预设时间项,它在靠近 Tc 时把残余误差强制收拢。位置项系数k_p和速度项系数k_v的比值直接影响编队收敛的动态特性,通常需要满足阻尼比在 0.7 到 1.2 之间,工程上先按二阶系统极点配置的思路选初值再微调。

3.3 生成有向通信拓扑的脚本

复现时第一步是构造拉普拉斯矩阵,我建议写一个小工具函数,方便随意切换拓扑结构,不要硬编码在某一个仿真文件里。

import numpy as np def generate_laplacian(adj_matrix): """ 根据邻接矩阵生成有向图 Laplacian 矩阵 L = D - A D 为入度矩阵,对角线元素是每个节点的入度之和 """ n = adj_matrix.shape[0] in_degree = np.sum(adj_matrix, axis=0) d_matrix = np.diag(in_degree) lap = d_matrix - adj_matrix return lap def has_spanning_tree(lap): """ 检查有向图的拉普拉斯矩阵是否满足编队收敛的通信条件: 非零特征值个数是否等于 n-1(图论秩条件) """ eigenvalues = np.linalg.eigvals(lap) rank_condition = np.sum(np.abs(eigenvalues) > 1e-6) n = lap.shape[0] return rank_condition == n - 1, eigenvalues # 示例:4 架无人机的环状通信拓扑 A = np.array([ [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1], [1, 0, 0, 0] ], dtype=float) L = generate_laplacian(A) ok, eigvals = has_spanning_tree(L) print("拉普拉斯矩阵:\n", L) print("特征值:", eigvals) print("满足生成树条件:", ok)

参数说明:这里的adj_matrix邻接矩阵第 i 行第 j 列元素表示无人机 j 的信息能否被无人机 i 收到,有向边方向和矩阵下标方向相反,这个方向性容易搞反,一旦反了生成的拉普拉斯矩阵就是错误的,仿真里会表现为编队根本无法收敛。has_spanning_tree里的秩条件是一个必要且充分条件,但要注意是严格等于n-1,如果特征值计算有微小数值误差,需要先做阈值处理。

3.4 通信拓扑对控制性能的影响

我在复现里对比了环状拓扑和全连通拓扑。环状拓扑下通信边少、实际实施成本低,但 Laplacian 矩阵的第二小特征值较小,编队收敛速度偏慢,抗扰动恢复能力差;全连通拓扑收敛快,但每架无人机都要与所有其他无人机通信,通信负载大。论文仿真默认用的是环状加一条跨边拓扑,兼顾了通信成本和收敛速度,实际部署时可以参考。

4. 新型观测器设计与容错控制:故障重构怎么实现

4.1 执行器故障建模

线性无人机模型在某个工作点附近可以写成状态空间方程。

[ \dot x(t) = A x(t) + B u(t) + E f(t) ]

其中 (f(t)) 是执行器故障信号,E 被称为故障分布矩阵,描述故障从哪个执行器通道进入系统。常见故障类型可以分两类:突变型(比如执行器卡死导致控制量跳变)和缓变型(比如舵效衰减随时间缓慢变化)。预设时间容错控制的目标是:故障发生后,编队误差不破坏预设时间收敛特性,也就是故障估计必须在 Tc 之前完成并补偿。

4.2 增广状态观测器的结构

直接估计故障信号的方法是把故障当作附加状态,构造增广系统。令 (\bar x = [x^T, f^T]^T),则增广系统的状态方程变为。

[ \dot{\bar x}(t) = \bar A \bar x(t) + \bar B u(t) ]

其中 (\bar A) 是分块上三角形式,左上角是原系统矩阵 A,右上角是故障分布矩阵 E,下块为零矩阵。这里隐含了一个假设:故障信号的变化率足够慢,即 (\dot f(t) \approx 0),这对缓变故障完全适用,对突变故障则需要把故障信号建模为阶跃序列,通过输出估计残差来判断突变时刻。

增广观测器的增益矩阵 L 通过 LMI(线性矩阵不等式)求解获得。论文代码里给出的核心思路是:先验证观测器的可观测性条件,再设计 LMI。LMI 需要满足 (A + LC) 是稳定的,同时保证故障估计误差动态的某种衰减率。代码块里我给出一个简化版求解,用极点配置作为替代方案演示效果。

4.3 增广观测器的 MATLAB 实现

function [x_hat, f_hat] = augmented_observer(y, u, x0, f0, F_obs) % 增广观测器:同时估计系统状态与执行器故障 % 输入: % y : 量测输出(位置与速度测量值) % u : 控制器输出 % x0, f0: 状态与故障的初始估计 % F_obs : 观测器增益矩阵,来自 LMI 求解或极点配置 % 输出: % x_hat : 状态估计 % f_hat : 故障估计 % 状态方程中的系统矩阵 A_ext = [Model.A, Model.E; 0, 0]; % 增广系统矩阵 C_ext = [Model.C, zeros(size(Model.C, 1), size(Model.E, 2))]; B_ext = [Model.B; zeros(size(Model.E, 2), size(Model.B, 2))]; % 观测器动态方程(连续时间) dx_hat = A_ext * [x_hat; f_hat] + B_ext * u + F_obs * (y - C_ext * [x_hat; f_hat]); end

逻辑说明:观测器的输出是状态估计和故障估计,状态估计喂给控制器,故障估计喂给容错补偿回路。这里增益矩阵F_obs的物理意义是观测器带宽的调节旋钮——矩阵增益数值越大,观测器对输出残差的反应越灵敏,故障估计跟踪越快,但噪声放大也越明显。我用 LMI 工具箱求得了两组合适的增益:一组偏高带宽,故障估计响应快但估计值波动明显;一组偏低带宽,估计轨迹平滑但滞后约 0.3 秒。建议先跑低带宽组,再根据故障场景往上调,不要一上来就追求快速响应,否则仿真里会出现故障估计震荡发散。

4.4 容错控制律的组合方式

容错控制器的设计思路可以概括为分离原理:先无视故障设计标称预设时间编队控制律,在此基础上减去故障补偿项。

[ u_f = u_{\text{nominal}} - \hat f(t) ]

这个补偿的动力学含义是:故障信号相当于给系统注入了一个额外输入,控制器的补偿回路把同样的反相信号送回去,实现故障抵消。分离原理成立的条件是观测器的收敛速度远快于控制器闭环速度,实测中至少要有三五倍的差距,否则两条动态路径互相牵制,预设时间的收敛曲线会变形。代码里F_obs的极点位置和控制器极点位置都应遵循这个约束。

4.5 故障注入:在 Simulink 中制造执行器故障

复现故障场景时,可以在执行器输出端口接一个阶跃信号生成模块,设置阶跃时刻和故障幅值,模拟执行器卡死。更推荐的做法是用一个外部 MATLAB 函数生成故障信号,代码里我通常这样写。

function f = actuator_fault_scenario(t) if t >= 3.0 && t < 3.5 f = 1.5; % 3s 到 3.5s 之间注入幅度为 1.5 的突发故障 else f = 0; end end

参数说明:故障发生时刻最好避开仿真启动瞬间(t = 0 附近),因为那时控制器增益正在拉起,信号叠加容易掩盖故障影响。故障幅值的选择要匹配执行器正常工作范围,我测试时从 0.5 开始逐步加大到 2.0,幅值超过 1.8 后控制器受到饱和限制,故障补偿就不能完全抵消了。

5. 复现避坑与参数调优:从模型搭建到结果验证

5.1 现象:仿真在预设时刻附近报错,计算结果变成 NaN

原因:预设时间函数在t = Tc附近分母趋近零,增益变成无穷大,Simulink 若使用固定步长求解器,会在越过该点前一刻把状态推到巨大值,随后产生数值溢出。解决办法:要么改预设时间函数的边界保护逻辑(设一个最大增益上限),要么把求解器切换为变步长,并将最大步长限制在 1e-4 秒以内。我一开始用固定步长 0.001s 跑,结果在Tc - 0.002s附近直接发散,改成变步长加边界保护后稳定了。

5.2 现象:编队的实际收敛时间明显晚于预设 Tc

原因:控制器输出饱和是最常见的原因——预设时间增益在临近 Tc 时快速增大,控制量接近甚至超过执行机构的物理极限,实际系统并不能按理想值输出补偿。另一个原因是对观测器增益盲目增大,观测器估计噪声被放大,补偿信号抖动。解决办法:先把控制量饱和上限调宽 20% 观察变化,如果收敛时间恢复接近预设值,说明确实是饱和问题;如果还不行,减小观测器增益并观察故障估计曲线是否平滑。

5.3 现象:故障注入后编队误差震荡加剧甚至失去收敛

原因:故障估计响应速度不够。观测器带宽相对控制器带宽偏低,故障估计跟不上故障信号的变化。解决办法:重新求解 LMI,把观测器极点向远离虚轴的方向配置一到两个位置,同时增加F_obs矩阵中对故障通道的增益分量。实际调参时,我习惯先看故障估计曲线对比真实故障信号,如果估计曲线滞后明显,优先加大故障通道增益,而不是盲目调整个增益矩阵。

5.4 现象:不同初始误差下收敛时间一致性变差

原因:预设时间收敛成立的前提是控制器不饱和,当初始误差过大、控制量触达饱和限幅时,收敛时间就不由控制器说了算,而由饱和持续时间主导。这是在真实物理系统中的局限性,不是理论漏洞。解决办法是在任务规划前期就控制编队初始误差范围,仿真中可以设初始误差在 3 米以内,收敛时间一致性几乎不受影响。若误差达到 20 米以上,需要提前把 Tc 适当放宽。

5.5 推荐参数表

参数名称推荐值调节方向
预设收敛时间 Tc5s任务窗口紧张时适当减小,但不要小于 2s
幂次 p2.5收敛轨迹不够陡时增大,Meanwhile留意控制量峰值
控制器位置增益 kp2.5~4.0增大减少响应时间,过大引发振荡
控制器速度增益 kv1.2~2.0增大明显抑制振荡,但会拖慢响应
观测器带宽配置控制器带宽的 5~10 倍分离原理的基本要求
故障注入幅值0.5~1.5超过 1.8 时补偿受饱和限制

从那以后我每跑一次仿真,都会先单独检查观测器故障估计曲线,确认故障跟踪是平滑的,再接入整个编队闭环系统,这样出现震荡时能迅速定位是观测器还是控制器的问题。希望这个复现踩坑记录能帮你少走几步弯路,把这个系统在你的环境中尽快跑起来,再去对比论文的实验结果。

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

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

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

立即咨询