十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

预设性能与事件触发结合的航天器编队姿态跟踪控制

预设性能与事件触发结合的航天器编队姿态跟踪控制 我最早被这个方向吸引其实是源于一次很挫败的仿真。当时手头做一个四星编队的姿态协同任务按传统周期控制的路子控制器每一拍都勤勤恳恳地算姿态精度也确实达标但一统计星间通信量就傻了眼姿态同步数据几乎挤掉了任务数据的大半。后来我认真去啃“预设性能约束下的航天器编队事件触发姿态跟踪控制”这个题目第一反应也就是两个控制圈热词拼在一起可真把预设性能Prescribed Performance ControlPPC和事件触发Event-triggered ControlETC放进同一个回路里才发现它们正好打在两个要害上预设性能把“误差收敛速度和稳态精度”写成硬约束事件触发把“控制量什么时候更新”从周期节拍改成按需触发。这篇文章想把我在这个探索过程中的设计思路、公式细节和仿真踩坑都摊开讲一讲给同样在研究航天器编队控制或者其它资源受限下的高性能控制问题的同好做个参考。1. 通信与指标的双重挤压预设性能和事件触发为什么必须一起上1.1 编队姿态跟踪到底在跟踪什么先得把场景说清楚。航天器编队不是“一颗星自由指向哪里就指哪里”而是多颗星在空间里构成一个精密几何构型合成孔径雷达干涉、分布式光学观测、引力波探测这类任务动辄要求厘米级的相对位置和角秒级的相对姿态同步。姿态跟踪控制在编队这一层通常以虚拟领航者或者某颗主星的期望姿态为基准每颗从星跟踪各自的期望姿态轨迹。这句话听起来简单但放在编队语境里它天然带上两层含义一层是单星层面从星实际姿态要跑到期望姿态上去另一层是协同层面各星之间不能各跑各的相对姿态差必须受控。工程上经常用期望姿态规划器给出主参考轨迹其余从星通过星间链路共享参考信息再做分布式跟踪。1.2 周期控制在星上为什么吃亏周期控制是本领域最成熟、健壮性也最好的方案姿态确定、制导、导航与控制GNC里的姿控回路长期都是固定周期运行。固定周期的好处是简单、可预测、上舰上星验证充分坏处是它完全不看“外面有没有事”。举个我在仿真里遇到的例子编队进入一段姿态快速机动控制周期是0.1秒四颗星各自以10Hz的频率刷新控制量同时星间链路还得分发姿态误差、参考姿态、协作中间量。算下来姿态协同链路每秒钟要传40次数据包。到了任务密集观测阶段下行/星间传输带宽被同步数据占掉一截这个代价在方案论证时很容易被低估。当然提高周期或者降低增益可以缓解一部分但代价是控制精度下降或者对扰动的响应变慢。也就是说采用固定周期这条路本质上是在“性能底线”和“资源占用”之间做一次静态妥协。所谓的事件触发想改变的正是这个静态妥协。1.3 预设性能承诺了一种显式的硬指标预设性能约束不是某个具体的控制器而是一整套“约束变换”的处理方式。它的核心表述是要求跟踪误差的每个分量或者某个范数始终落进一个随时间收缩的边界里写成公式就是-δ·ρ(t) e_i(t) ρ(t)或|e_i(t)| ρ(t)其中ρ(t)是指数衰减的性能函数ρ(t) (ρ_0 - ρ_∞)·e^(-l·t) ρ_∞三个参数的意义非常工程化ρ_0是初始允许误差上界ρ_∞是最终允许误差上界l是误差收敛速度的下界。换句话说设计者把“收敛速度不低于多少、稳态误差不大于多少”直接写进约束不等式然后让控制器在满足这些不等式的条件下运行。这和传统PD/PID通过调增益间接得到性能完全不同它给的是显式保证。1.4 事件触发负责回答“控制量什么时候更新”事件触发控制的思想一句话就是不出问题不更新。控制器计算出的力矩值并不立刻送去执行而是先存进一个零阶保持器只有当实际状态与保持值之间的“测量误差”超过阈值系统才重新计算一次控制量并把新值刷进保持器。这个逻辑在工业软件里非常常见上位机里扫码枪到位才触发一轮数据读取ERP报表里字段被修改才触发重算而不是每毫秒都在轮询。姿态控制里的事件触发也沿用同样的直觉只是它必须在数学上回答两个问题第一这样“懒”更新会不会破坏闭环稳定第二会不会出现无限次连续触发也就是Zeno现象1.5 两套机制凑在一起到底图什么如果把预设性能和事件触发分开用各有什么短板只做预设性能控制量照常每个周期刷新星间通信压力和计算压力一点没少只做事件触发虽然触发频率降下来了但“误差漂到阈值附近”这件事没有硬约束控制品质没有保证不小心还会出现大超调。两个工具组合在一起预设性能负责守住误差的收敛过程和最终精度事件触发负责把控制量的更新次数降下来。两者不是谁替代谁而是在同一个控制器里各管一段性能约束管“演化轨迹”事件触发管“执行方式”。2. 误差怎么“锁”进性能边界性能函数、误差变换与四元数处理2.1 性能函数三个参数ρ0、ρ∞、l 怎么定这一节开始进入具体设计。性能函数ρ(t)虽然看起来只是一条指数曲线参数取值却有讲究。我习惯在仿真里先用一张表把参数和它的物理含义对应起来参数物理含义取值经验ρ_0初始时刻允许的最大误差必须略大于初始误差否则约束在 t0 就失效ρ_∞稳态允许误差上界与传感器测量噪声、执行机构分辨率匹配l误差收敛速度下界受执行机构饱和限制过大会导致初段力矩饱和ρ_0是最容易被低估的一个。控制从仿真第一步开始就要判断约束是否满足如果ρ_0选得比初始误差还小那么误差从一开始就越界后面一切收敛性分析都失去前提。通常我会留20%~30%的裕量比如初始姿态误差向量范数大约0.3ρ_0就给到0.4~0.5。ρ_∞和系统噪声强相关。星上的姿态确定精度如果只有0.02度你非要把ρ_∞设到0.001度那控制器为了追逐不可能达成的精度只会让事件触发持续饱和触发次数高得惊人。ρ_∞取工艺要求与测量能力之间的折中理性一点。l的物理意义是“保证误差至少以这个速率收敛”但它和燃料、力矩饱和强耦合。l设得太大会让误差初期收缩极快控制器被迫输出很大的力矩一旦超过动量轮输出上限约束照样保不住。2.2 误差变换把不等式约束变成无约束控制问题有了性能函数另一个关键问题是怎么让控制器“知道”误差不能碰边界一种朴素做法是把约束当成硬限幅误差接近边界就强行拉回但这样会出现抖振甚至极限环。预设性能控制的巧妙之处在于利用误差变换把带约束的误差变量映射成一个定义在全实数域上的新变量ε。最常用的对称变换是y e/ρε (1/2)·ln((1 y)/(1 - y))如果|y| 1成立那么误差e就满足|e| ρ而ε在实数轴上是自由的。控制器只需要让ε收敛到0就能保证y远离 ±1自然也就守住了性能边界。这样做的收益是约束控制问题被转化为无约束镇定问题可以直接套用反步、滑模、自适应这些成熟方法。代价是变换之后系统方程更复杂尤其是ρ的导数项会进入控制器表达式设计遗漏时会引入额外的扰动项。2.3 姿态误差用四元数时的三个坑航天器姿态跟踪误差通常用四元数构造。给定期望姿态q_d和实际姿态q误差四元数定义为q_e q_d^(-1) ⊗ q控制目标是让q_e的向量部分q_ev收敛到0。第一个坑是四元数的双值性。q_e和-q_e表示同一个姿态但向量部分符号相反。如果从星初始时刻的误差四元数落在符号相反的那一支控制器可能走一条“绕大圈”的路径路径上误差明显增大性能约束很容易被挤爆。工程上通常约定取q_e0 ≥ 0的那一支来避免这个问题。第二个坑是性能约束的维度选择。姿态误差向量部分有三个分量你可以对每个分量分别设性能函数和误差变换也可以对向量范数||q_ev||设一个标量约束。前者给出的是每轴精度指标物理意义直观但三个性能函数带来的交叉耦合项会让稳定性分析重不少后者实现简单分析省力但保证的是整体范数可能出现“某个轴已经明显偏了但范数还在界内”的情况。我自己的仿真经验是如果任务书给了三轴独立指向精度就别偷懒用范数约束。第三个坑是角速度误差也要进约束。姿态误差收敛得再好如果角速度误差在机动结束后还震荡实际指向依然会缓慢漂移。更完整的做法是对姿态误差分量和角速度误差分量分别定义性能函数姿态回路的性能函数管“位置误差”角速度回路的性能函数管“动态过度”两者配合才能锁住整个瞬态过程。但也意味着仿真里至少要写六条性能约束参数整定工作量明显上升。3. 什么时候才该动控制量触发条件、最小间隔与Zeno幽灵3.1 零阶保持器下的控制模型事件触发控制的第一步是把“连续计算的控制量”变成一个“只在触发时刻更新的分段常值信号”数学上写作τ(t) τ(t_k)当t ∈ [t_k, t_{k1})这里τ(t_k)是第k次触发生成的控制力矩它被零阶保持器锁存一直到下一次触发时刻t_{k1}才被新值替换。这个模型和数字控制系统里的采样保持非常像区别只在于采样时刻不是等间隔的而是由触发条件动态决定。设计者必须定义一个“测量误差”来度量保持值和当前期望值之间的差距。最常见的是控制量误差m(t) τ(t) - τ(t_k)其中τ(t)是虚拟在线计算得到的连续控制信号τ(t_k)是实际作用于执行器的保持值。当m(t)变大说明保持值已经明显偏离了控制器此刻的意图该触发更新了。3.2 触发条件为什么是“相对阈值绝对阈值”的组合我常用的触发条件是这个形式t_{k1} inf { t t_k : ||m(t)|| ≥ σ·||τ(t_k)|| μ }σ是一个相对阈值典型取0.01~0.1μ是一个绝对阈值常取到1e-4量级。为什么要两个阈值只留相对阈值σ||τ||控制量很小的时候触发条件会异常敏感噪声就能触发大量事件只留绝对阈值μ大机动时又显得迟钝控制力矩已经明显偏离了还不更新。相对阈值意味着“大动作时允许更大误差小动作时更精细”绝对阈值则提供一个最低触发量化门限两者配合更符合工程直觉。还有一类触发条件直接基于状态误差例如||x(t) - x(t_k)|| ≥ σ||x(t)||。它更适合决定“什么时候广播状态给邻居”而控制量触发更适合决定“什么时候更新执行器指令”。编队场景里两种触发可以分开设计星间通信靠状态事件触发星上执行靠控制量事件触发。3.3 Zeno现象理论上的幽灵和工程上的防线Zeno现象指的是事件触发控制在有限时间内触发无限多次触发时刻没有下界。这样的系统在数学上定义不完整在实际数字平台中更是致命因为硬件根本没法处理无限次中断。排除Zeno现象不能只靠仿真里“好像没发生”要有理论论证。常用的思路是反证法假设存在Zeno那么在极限时刻附近相邻两次触发的时间间隔会无限缩小但触发条件要求||m(t)||从0增长到阈值而m(t)的动态又是有界的这个界限可以从系统状态有界性和控制信号的导数上界推出来所以从0到阈值必定需要至少一个正常数时间。这个正常数下界存在Zeno就被排除了。工程上的另一个防御是直接加最小触发间隔比如程序里保证t_{k1} - t_k ≥ τ_minτ_min取0.01秒或一个控制周期。加了保护时间之后系统分析时需要考虑它带来的附加误差不能分析一个、实现另一个。3.4 触发参数和性能参数会互相“打架”这是我最想强调的部分。很多人把性能函数的ρ∞、l和触发阈值σ、μ当成两组独立参数调实测下来它们根本不是独立的。ρ∞设得越紧控制器的在线修正欲望越强m(t)长期偏大触发次数应激式上涨l设得越大机动初期的误差变化越猛烈触发事件会向初始段集中。反过来σ取得过大虽然触发次数降下来了但每次触发之间的性能边界余量被压缩一旦扰动叠加误差可能瞬间顶到ρ(t)边界。所以整定参数的顺序我建议固定下来先按任务要求把ρ_0、ρ∞、l定住让连续控制下的姿态误差曲线完整落在性能边界内然后才去调σ、μ在触发次数和性能裕量之间找平衡点。顺序颠倒的话你很难判断系统超调到底是哪一组参数引起的。4. 控制器如何把两套机制拧在一个回路上编队姿态跟踪的整体架构4.1 领航者-跟随者结构与信息流编队姿态协同控制的拓扑有很多种领航者-跟随者是最容易落地的一种设定一个虚拟领航者或主星产生期望姿态轨迹跟随者通过邻居状态协同跟踪。每颗从星的控制器输入包括自身姿态、自身角速度、邻居姿态/角速度、期望姿态轨迹。这些信息在固定周期控制里是逐个时间步同步广播的而在事件触发框架下星间通信也可以做成事件触发只有当某颗星的误差变化超过一定量才向外广播一次。这样一来不仅星上执行器更新次数降低星间通信量也大幅下降。通信事件触发和执行器事件触发可以共用同一个误差阈值也可以分开设计后者更复杂但灵活性更高。4.2 反步控制器里预设性能和事件触发分别卡在哪一层编队姿态跟踪控制器我采用反步法分两层设计。第一层针对姿态误差四元数通过性能函数和误差变换把有约束的q_ev变成无约束变量然后设计“虚拟角速度指令”让这个变量收敛第二层针对实际角速度误差设计真实力矩让角速度跟踪虚拟指令。预设性能约束就在第一层起作用虚拟角速度指令的构造要保证变换后的变量稳定同时通过误差变换的结构保证原姿态误差不碰边界。事件触发则作用在第二层输出端反步法实时算出的τ(t)并不直接执行只在触发条件满足时更新为零阶保持器里的常值信号。这两层一拆开设计的复杂度就下来了你不需要在触发机制和性能约束之间做复杂耦合分析它们分别作用在控制器链路的不同位置最后在稳定性证明环节汇合。4.3 扰动自适应项以及触发保持期里的角色航天器在轨受到的扰动力矩包括重力梯度、气动、太阳光压、剩磁和轨道机动残留等等很难精确建模。一个实用做法是把这些因素视为集总扰动假设其上界未知但有限通过自适应律在线估计。在事件触发框架里自适应律也需要重新审视。如果自适应参数只在触发时刻更新分析上更干净但可能导致扰动估计跟不上实际变化如果自适应律保持连续运行尽管控制量是保持值扰动估计也会在触发间隔内有微小调整——这在实现上没问题但Lyapunov分析里要额外处理自适应项在触发间隔内的行为。我建议第一版先采用“连续自适应事件触发执行器更新”的混合配置仿真调通后再逐步推向全事件触发。4.4 Lyapunov稳定性分析的主线稳定性分析是整个方案的理论基础。大致的思路是构造一个包含如下几项的Lyapunov函数变换后的姿态误差项、角速度误差项、自适应估计误差项。求导后把触发保持产生的测量误差m(t)作为额外扰动项放进导数表达式。触发条件||m(t)|| ≤ σ||τ(t_k)|| μ的价值在这里体现它把不可控的m(t)上界转化为可用设计参数表示的量。再利用Young不等式处理交叉项最终得到类似V̇ ≤ -αV β的形式说明系统是一致最终有界的。编队场景下各星的Lyapunov函数需要汇总。如果信息流里有领航者状态还需要对通信误差、星间相对误差设约束项。这部分推导细节比较多但核心逻辑不算特别偏预设性能保证几何收敛通道事件触发保证触发误差有界合并之后系统稳定。5. 仿真里的真实状态参数整定、触发频次与几个典型意外5.1 仿真对象与初始条件理论设计得再完整最后还是靠仿真说话。我的第一版仿真配置如下设置项取值编队规模1个虚拟领航者 4颗从星从星转动惯量diag(18, 15, 12) kg·m²各星加5%~10%偏差初始姿态误差向量部分0.15~0.3 随机生成初始角速度误差0.02 rad/s期望姿态轨迹正弦机动幅度0.3 rad周期50s性能函数ρ_0 0.6ρ_∞ 0.02l 0.4触发参数σ 0.05μ 1e-4仿真步长1e-3 s这里我特意把初始误差设得比ρ_0小不少留了裕量。转动惯量加偏差是为了测试自适应项鲁棒性。5.2 参数整定顺序以及为什么这个顺序不能乱整定顺序是我在失败里学到的。第一步关掉事件触发让它退化成连续控制先调性能函数的三个参数。看姿态误差曲线是否始终落在±ρ(t)边界内收敛速度是否符合预期。这一步不满足后面加了事件触发只会更糟。第二步把σ、μ调大让事件触发先生效统计触发次数和误差曲线。这时候最常出现的现象是误差曲线整体变“毛糙”因为控制量只在某些时刻更新。如果误差曲线逼近边界先别急着缩小σ先看是不是ρ∞相对噪声定太紧了。第三步固定参数跑蒙特卡洛改变初始误差、转动惯量偏差、扰动幅值统计最坏情况下的触发次数和性能边界余量。到这一步方案才有底气。5.3 三个典型意外第一个意外是初始时刻触发过密。仿真第0秒开始大初始误差让测量误差迅速涨到阈值控制量几乎以最小时间间隔连续触发看起来和周期控制没区别。原因是μ设太小初始段误差大触发阈值太敏感。后来我把触发条件里加了初始段的时变阈值或者直接引入最小触发间隔保护初始段的事件才被压下来。第二个意外是性能边界在机动切换瞬间被短暂突破。正弦机动的峰值区间里期望角加速度最大反步控制在线计算的τ(t)变化很快但零阶保持器锁存的值跟不上。虽然理论上稳定性证明要求最终一致有界但瞬态过程确实可能超界。解决办法是让ρ∞留一定裕量同时把σ从0.05压到0.03触发更勤快一点。第三个意外是触发次数对ρ∞极其敏感。ρ∞从0.05压缩到0.01触发总次数大概翻了一倍多。这个现象反过来验证了前面说的耦合关系性能指标越紧事件频率越高。如果任务对通信链路有硬上限就需要反过来调整性能函数的稳态指标这是一个工程权衡不是纯控制问题。6. 这个方向后续还能怎么延伸6.1 动态事件触发进一步压低触发次数固定阈值触发虽然简单但在误差已经很小、扰动也很小的时候它还是会因为绝对阈值μ的存在继续触发。动态事件触发引入一个内部动态变量来调整触发阈值触发阈值本身会随着系统靠近稳态而逐渐收紧余量这样系统越接近目标越“难”触发可以在保证性能的同时把触发次数再往下压一截。代价是需要证明动态变量的有界性数学上麻烦一些。6.2 输入饱和、执行器故障与预设性能的兼容前面提到性能函数参数l和力矩饱和的矛盾这是实际工程绕不开的问题。严格的预设性能控制器可能要求大初段力矩而动量轮、喷气推力器都有输出上限。考虑输入饱和的控制律设计往往要在性能函数里加入“慢启动”设计或者把性能约束从误差域映射到控制力域执行器故障重构再叠加事件触发则要额外处理故障估计和触发条件之间的交互。这些方向都还没有完全收敛探索空间很大。6.3 通信时延、丢包与异步触发下的编队协同真实星间链路不是理想信道。时延、丢包、不同步都会让邻居状态信息变形触发时机也跟着错位。在高时延下事件触发比周期控制更容易出现“事件风暴”一颗星的状态跳变沿着通信拓扑在网络里级联放大。可对这一块目前成熟的方法还不多大多数论文只是假设了理想通信。这个方向值得继续挖。最后再分享一点个人的体会。把预设性能和事件触发放进一个框架里最容易被低估的是参数之间的耦合。很多论文把ρ∞、l和σ、μ当成独立的旋钮来调实际仿真实测下来它们是一条链上的ρ∞设得太紧控制器的修正欲望强触发次数应激上窜l设得太大事件全部堆到机动初始段。所以我建议的调参顺序是先定ρ_0、l让误差主轴在连续控制下稳稳落在性能边界里再缩ρ∞最后才拧σ和μ。别一上来就追求精致的触发间隔先把性能底线站稳再谈节省资源。这个顺序救过我好几版仿真应该对你也用得上。
返回列表