简介:面向无人船、无人水下航行器与水面舰艇控制方向的学习者和研究开发者,这份MATLAB仿真资料围绕全驱动船舶在模型不确定、传感器误差和流体动力学干扰下的轨迹跟踪问题,给出融合自适应动态面滑模控制与扰动观测器的实现方案。压缩包共20个文件,约56KB,以15个m脚本为核心,配合2个mdl仿真模型、2个txt说明及1个r2012a文件,便于直接运行、修改与对照学习。内容包含圆轨迹和直线轨迹两类仿真程序,可据此复现船舶数学模型、控制器设计、扰动观测器构建、参数调节与跟踪效果分析,理解滑模鲁棒性、自适应参数调整和扰动补偿之间的配合方式,并观察不同轨迹下的跟踪误差变化。已有1313人学习,适合课程设计、科研入门、论文复现和算法对比时参考,对全驱动推进器独立调节与高精度导航场景也具有一定借鉴价值。
1. 先把结论摆在前面:让轨迹跟踪出问题的,往往不是滑模面
做船舶轨迹跟踪的人,多半有过这样一段经历:滑模面反复推、增益反复调,位置误差就是压不到零,控制器输出却已经开始高频抖动。把扰动项人为关掉再跑一遍,误差立刻塌下去——问题根本不在滑模面,而在那个被当成小量随手扔掉的 d(t)。这几年这类方案几乎都长成同一个形状:动态面 DSC 拆掉反步法的微分爆炸,扰动观测器把 d(t) 估出来前馈掉,自适应滑模兜住剩下的残差,三者各管一段。这套 MATLAB 实现值得逐行拆,就是因为它把这三段的分界线划得比较清楚。
2. 三自由度模型:为什么所有推导最后都要退回船体坐标系
2.1 η 和 ν 不是同一套坐标,J(η) 只做旋转不改变长度
轨迹跟踪的误差定义在地球坐标系里最直观:你在海图上画一条期望航线 η_d(t) = [x_d, y_d, ψ_d]ᵀ,船的实际位置 η = [x, y, ψ]ᵀ 与它相减就是误差。但船受到的推力、水动力、阻尼全部作用在船体上,动力学方程只有在船体坐标系里才写得干净,速度 ν = [u, v, r]ᵀ 中 u 是纵向、v 是横漂、r 是首摇角速度。两套坐标靠一个旋转矩阵连起来:
η̇ = J(ψ)·ν,J(ψ) = [[cosψ, −sinψ, 0], [sinψ, cosψ, 0], [0, 0, 1]]
这个 J 有两个性质必须记住,后面每一章都要用到。第一,它只依赖 ψ 一个角度,不存在六自由度欧拉角那种万向锁问题,ψ 在整个 (−π, π] 上都是良定义的,这让全驱动三自由度模型的推导格外省心。第二,J 是正交矩阵,JᵀJ = I,所以 J⁻¹ = Jᵀ,代码里既可以用J'也可以用J\,结果完全一样,但前者快得多。
真正容易踩坑的地方在于:很多人把误差 e = η − η_d 直接拿去做控制,又直接把 τ 当船体坐标系的力用,中间忘了这一步转换。表现出来就是船往期望点的反方向偏,或者航向收敛了位置却越跑越远。判断方法很简单,给定一个正的 r、其余为零,看 ψ 是不是单调增加;给定正的 τ_v,看船是不是往右舷横漂。这两个方向对了,坐标系才算接对。
2.2 M、C、D:三个矩阵各管一件事,缺一个稳定性证明就断
三自由度动力学写成 M·ν̇ + C(ν)·ν + D(ν)·ν = τ + d,三个矩阵的物理角色完全不一样,混着填参数是仿真结果看起来合理、稳定性却莫名其妙崩掉的主要原因。
M 是惯性矩阵,包含刚体质量和附加质量。左右舷对称的船,M 可以写成 [[m₁₁, 0, 0], [0, m₂₂, m₂₃], [0, m₂₃, m₃₃]] 这种形式,其中 m₁₁、m₂₂ 是含附加质量的纵向、横向质量,量级通常是船体质量的 1.1 到 2 倍——水被船带着一起动,所以“惯性”永远比称出来的排水量大。m₂₃ 这一项对应重心不在船中时横漂与首摇的耦合,很多简化处理直接把它抹成零,做定性验证没问题,做定量对比就会差出十几个百分点。
C(ν) 是科氏-向心矩阵,最关键的性质是反对称:C(ν) = −C(ν)ᵀ。这条性质不是数学上的装饰,它是李雅普诺夫函数 V = ½νᵀMν 求导时能把 νᵀC(ν)ν 整项消掉的唯一理由。如果手工把 C 填成任意非反对称矩阵,闭环里就凭空多出一股“自己给自己加速”的能量,仿真上表现为速度缓慢爬升、控制量越来越小却压不住——这类奇怪现象十有八九是 C 填错了。
D(ν) 是阻尼矩阵,正定,负责耗散。低速时它近似线性,高速时平方项开始主导,很多实现只保留线性部分并在 d 里把差异当作未建模动态吃掉,这正好给了后面扰动观测器存在的理由。
| 矩阵 | 维度 | 数学性质 | 填错时的典型表现 |
|---|---|---|---|
| M | 3×3 | 对称正定 | 加速度量级不对,控制增益整体系数偏 |
| C(ν) | 3×3 | 反对称 | 能量缓慢注入,速度自己往上爬 |
| D(ν) | 3×3 | 正定 | 稳态误差偏大,减速过程拖沓 |
2.3 扰动项 d 放在等式哪一边,决定了观测器长什么样
d 里装的是风、浪、流的一阶二阶漂移力,加上未建模水动力和执行器的推力偏差。把它写在船体坐标系下,得到的是 M·ν̇ = τ + d − C(ν)ν − D(ν)ν,等价于 d = M·ν̇ + C(ν)ν + D(ν)ν − τ。这个恒等式是整个观测器章节的起点,也是黑匣子:d 明明就在等式里,但 ν̇ 测不出来,所以你没法直接算它。
几乎所有扰动观测器的共同前提都是一句话:d 变化得比观测器收敛得慢,即 ḋ 有界。这句话对常值海流和二阶漂移力成立,对一阶波浪力就不成立——波浪力的主频通常在 0.5 到 1.5 rad/s,周期几秒量级,观测器带宽必须高于这个频率才能跟得上。可带宽一高,速度信号里的噪声就被成倍放大,前馈通道立刻变成噪声放大器。这就是为什么实船上常见的做法是只补偿低频分量,高频部分留给滑模的鲁棒项去压,而不是指望一个观测器把整个 d 全吃掉。
下面这段是三自由度模型的完整实现,把运动学和动力学分开写,是为了让后面的控制器按同样的顺序调用:
function [eta_dot, nu_dot] = ship3dof(~, x, tau, d, P) % x = [x; y; psi; u; v; r],前三个是地球坐标系位姿,后三个是船体坐标系速度 eta = x(1:3); nu = x(4:6); psi = eta(3); % 运动学:船体坐标系 -> 地球坐标系,只有前两行参与旋转 J = [cos(psi), -sin(psi), 0; sin(psi), cos(psi), 0; 0, 0, 1]; eta_dot = J * nu; % 动力学:M*nu_dot + C(nu)*nu + D(nu)*nu = tau + d % 用左除而不是 inv(M),数值上更稳,也避免每次求逆 nu_dot = P.M \ (tau + d - P.C*nu - P.D*nu); end注意P.C*nu和P.D*nu都是时变量,但在这套实现里它们被当作常矩阵处理。这是一个刻意的取舍:三自由度低速工况下,C 和 D 随速度的变化远小于 d 的量级,把非线性项挪进 d 里,观测器能一并估掉,控制器却省掉了大量实时计算。要不要保留非线性,取决于你的速度包线有多宽。
3. 动态面 DSC:反步法的微分爆炸是怎么被一阶滤波器掐掉的
3.1 反步法的两步走:虚拟控制量 α₁ 是怎么冒出来的
反步法的思路是“一次只处理一层积分”。第一层是运动学 η̇ = J(ψ)ν,这里 ν 不是真正的控制量,但可以把它当作虚拟控制量来设计。定义位置误差 z₁ = η − η_d,希望 z₁ 指数收敛,就令 J(ψ)ν 等于 η̇_d − K₁z₁,于是得到虚拟控制律:
α₁ = Jᵀ(ψ)·(η̇_d − K₁z₁)
K₁ 是正定对角阵,量纲是 1/s,决定了位置误差的收敛速率。这一步没有任何近似,纯粹是代数变换。第二层才是真正的动力学:定义速度误差 z₂ = ν − ν_d,其中 ν_d 应该等于 α₁,然后对 z₂ 求导代进动力学方程,解出 τ。到这里一切都很好,问题出在下一步。
3.2 对 α₁ 求导这一步,具体碰到了什么困难
反步法要求你在 τ 的表达式里用到 α̇₁,因为 ν_d 的导数要出现在控制律里。把 α₁ 展开求导,得到的是这么一串:
α̇₁ = (∂α₁/∂η)·J(ψ)ν + (∂α₁/∂η_d)·η̇_d + (∂α₁/∂η̇_d)·η̈_d
三项各有各的麻烦。第一项里 ∂α₁/∂η 包含对 ψ 的偏导,而 Jᵀ 对 ψ 求导又会产生一个新的旋转矩阵,写出来是六七项乘积;第二项要把参考轨迹的一阶导也代进去;第三项最致命,它需要 η̈_d,也就是期望轨迹的二阶导数。如果你的期望轨迹是解析的圆或者正弦线,勉强能求;如果是航路点插值出来的折线,η̈_d 在拐点处是冲激,数值上直接炸。
更麻烦的是即使你把解析式推出来了,α̇₁ 里仍然含有 ν。实船上的速度要么来自多普勒计程仪(噪声大、更新率低),要么由位置差分得到(噪声更大),把它塞进一个已经被求导放大的表达式里,等于直接把噪声灌进执行器。这就是所谓的“微分爆炸”,不是比喻,是真的会在 τ 上炸出高频毛刺。
3.3 一阶低通滤波:把不可测的 α̇₁ 换成可算的 (α₁ − ν_d)/τ_f
DSC 的处理办法极其务实:不去求 α̇₁,而是让 α₁ 通过一个一阶低通滤波器,用滤波器的输出 ν_d 代替 α₁:
τ_f·ν̇_d + ν_d = α₁,ν_d(0) = α₁(0)
这个式子一移项,就得到了一个完全由已知量构成的导数估计:ν̇_d = (α₁ − ν_d)/τ_f。控制律里原本要放 α̇₁ 的地方,全部换成这个商。τ_f 是滤波器时间常数,单位是秒,它同时也是这个“数值微分器”的步长尺度:τ_f 越小,ν_d 越贴 α₁,导数估计越接近真值,但放大倍数 1/τ_f 越大,噪声进来得越猛。
% ---- 第一步:位置误差与虚拟控制量 ---- e1 = eta - eta_d; alpha1 = J' * (eta_d_dot - K1*e1); % J 正交,J' 就是 J 的逆 % ---- 第二步:DSC 一阶低通滤波,用积分形式推进,避免代数环 ---- nu_d = nu_d + h*(alpha1 - nu_d)/tau_f; % 滤波器的离散实现 alpha1_dot = (alpha1 - nu_d)/tau_f; % 用滤波值代替真实微分 % ---- 第三步:滑模面定义在滤波误差流形上 ---- z2 = nu - nu_d; s = z2 + Lambda*e1; % ---- 第四步:控制律,d_hat 来自观测器,W_hat 来自自适应律 ---- tau = P.M*( alpha1_dot - Lambda*(J*nu - eta_d_dot) - K2*s ... - W_hat*tanh(s/phi) ) ... + P.C*nu + P.D*nu - d_hat;这段代码里有几个参数值得单独说清楚。h是仿真步长,nu_d的更新用的是前向欧拉,所以tau_f必须显著大于h,否则h/tau_f接近 1,滤波器会失稳振荡。Lambda是滑模面的斜率矩阵,量纲 1/s,它决定误差在滑模面上衰减的快慢,值越大收敛越快,但也会把噪声更多地引到 s 里。phi是边界层厚度,tanh(s/phi)在 |s| 远大于 phi 时近似 sign,在 |s| 小于 phi 时线性过渡,稳态误差的量级就被限制在 phi 附近。
3.4 τ_f 怎么选:滤波误差界与噪声放大之间的权衡
DSC 的稳定性证明里有一个绕不开的量,叫滤波误差 y₂ = ν_d − α₁。对它求导,利用滤波器方程可以得到 τ_f·ẏ₂ = −y₂ − τ_f·α̇₁,两边积分后有 |y₂| ≤ τ_f·sup|α̇₁|。也就是说滤波误差是 O(τ_f) 的,τ_f 越小,ν_d 越接近 α₁,闭环越接近理想反步。
但这不是让你把 τ_f 调到 1e-6 的理由。α̇₁ 的界 B₁ = sup|α̇₁| 本身依赖参考轨迹的加速度和执行器的饱和程度,船舶的闭环带宽通常在 0.1 到 1 rad/s 量级,滤波器的截止频率 1/τ_f 必须明显高于这个带宽,否则滤波器会把有用的控制信号也滤掉,表现为跟踪滞后、转弯时切内道。我的经验取值是 τ_f 在 0.01 到 0.05 s 之间,大约相当于仿真步长的 5 到 20 倍。
提示:先用 τ_f = 0.02 跑一遍,把 ν_d 和 α₁ 画在同一张图上。如果两条曲线几乎重合,说明滤波器没起到作用,可以再放大一点;如果 ν_d 明显滞后于 α₁ 且跟踪误差里出现与转弯同周期的偏差,说明 τ_f 太大,要往小调。
4. 观测器加自适应滑模:把“硬扛”换成“先估后补”
4.1 NDO 的构造:辅助变量 ζ 是怎么想出来的
回到那个恒等式 d = M·ν̇ + C(ν)ν + D(ν)ν − τ。右边只有 ν̇ 不可用,所以不能直接算。非线性扰动观测器的做法是引入一个辅助状态 ζ,并令估计值具有 d̂ = ζ + K·M·ν 的形式,其中 K 是正定对角增益矩阵。这样 d̂ 的导数里会出现 K·M·ν̇,正好可以用动力学方程替换掉:
d̂̇ = ζ̇ + K·M·ν̇ = ζ̇ + K·(τ + d − C(ν)ν − D(ν)ν)
接下来是关键一步:我们希望估计误差 d̃ = d − d̂ 满足 d̃̇ = ḋ − K·d̃,也就是让 d̂̇ = −K·d̂ + K·d。把上面两式对起来,含 d 的项正好互相抵消,剩下的是一个完全不含 ν̇、也不含 d 的 ζ 更新律:
ζ̇ = −K·ζ + K·(C(ν)ν + D(ν)ν − τ − K·M·ν)
这一步是整个观测器能工作的核心:d 之所以被消掉,是因为它同时出现在“真实动力学”和“期望的误差动态”里。代价是你必须相信 M、C、D 这三个矩阵是准的,模型误差会直接变成估计偏差。
% ---- 非线性扰动观测器 ---- % d_hat = zeta + K*M*nu;zeta 是内部状态,更新律里不含 nu_dot zeta = zeta + h*( -K*zeta + K*( P.C*nu + P.D*nu - tau - K*P.M*nu ) ); d_hat = zeta + K*P.M*nu; % 初始化:zeta0 = -K*M*nu0,可保证 d_hat(0) = 0,避免首拍冲击误差动态 d̃̇ = ḋ − K·d̃ 的解是 d̃(t) = e^{−Kt}d̃(0) + ∫e^{−K(t−s)}ḋ(s)ds,稳态下 |d̃| ≤ sup|ḋ| / λ_min(K)。这个式子直接告诉你两件事:K 越大收敛越快、残差越小;但 K 大到一定程度,d̂ 就会开始跟踪速度信号里的高频噪声,因为 ν 是通过 K·M·ν 这一项进入估计值的。
4.2 观测器一上,滑模增益为什么能降一个量级
没有观测器时,滑模面的到达条件要求切换增益大于扰动的上界:|s|·(Ŵ − |d|) ≤ 0,所以 Ŵ 必须压过 sup|d|。船舶模型里未建模的横荡水动力加上常值海流,等效到加速度上通常是 0.2 到 0.5 m/s² 的量级,这意味着切换增益至少要在 0.5 以上,抖振幅值也就跟着这个数走。
有了观测器之后,需要被滑模项压住的只剩残差 d̃,它的界是 sup|ḋ|/λ_min(K),量级能降到 0.01 上下。切换增益从 0.5 降到 0.05,抖振幅值跟着降一个数量级,这就是“观测器 + 小增益滑模”比“纯大增益滑模”更好用的原因。反过来说,如果你加了观测器却发现抖振没改善,八成是 d̂ 根本没收敛——常见原因是 ζ 的初始化没做,或者 C、D 的符号填反了,导致观测器在给自己造一个正反馈。
注意:调试观测器时先把自适应滑模关掉,让 τ 里只有 DSC 项和 d̂ 前馈项,单独看 d̂ 跟设定的 d 是否吻合。两个回路同时开,出了问题根本分不清是谁的锅。
4.3 自适应律:增益自己长大,但必须装一个泄压阀
即使有观测器,残差的上界也不是事先精确知道的,所以切换增益仍然需要一个自适应律来自动标定。最朴素的形式是积分型:Ŵ̇ = Γ·|s|,|s| 不为零就往上加,直到压住为止。这个形式在理论上很漂亮,在仿真里却经常翻车——只要 s 因为边界层或者采样误差存在一个永远消不掉的小残差,Ŵ 就会单调上涨,最后顶到你设的上限,抖振反而比固定增益更严重。
实用的写法是加一个泄漏项:Ŵ̇ = Γ·(|s| − σ·Ŵ),σ > 0 是泄漏系数。稳态下 |s| 小时,−σŴ 占主导,增益会缓慢回落;|s| 大时,第一项占主导,增益快速上升。Γ 是学习率,量纲决定了增益变化的速度,太大时增益突变本身就会激励抖振,太小时扰动突变跟不上。再加上一层硬投影,把 Ŵ 限制在 [W_min, W_max] 之间,就得到了一个既会自己长大、又不会失控的增益。
% 自适应切换增益:|s| 大时快速上升,|s| 小时靠 -sigma*W_hat 缓慢回落 W_hat = W_hat + h*Gamma*( norm(s) - sigma*W_hat ); W_hat = min(max(W_hat, W_min), W_max); % 投影算子,防止无界增长和负值4.4 抖振抑制的四层手段:从 sign 到 super-twisting
滑模的抖振不是单一原因造成的,至少有三层:切换函数的硬跳变、离散化带来的准滑模、以及观测器前馈通道引入的噪声。对应的手段也不同,选错了层次等于白费力气。
| 手段 | 稳态误差 | 抖振强度 | 适用场景 |
|---|---|---|---|
| sign(s) | 理论上为零 | 最强 | 连续系统理论验证 |
| sat(s/Φ) | 约等于 Φ | 中等 | 边界层外仍是硬切换 |
| tanh(s/Φ) | 平滑过渡带 | 弱 | 大多数工程实现 |
| super-twisting | 有限时间收敛 | 最弱 | 需要知道扰动梯度界 |
需要提醒的是,sat 和 tanh 本质上是把滑模“软化”成准滑模,代价是放弃了渐近收敛,换来的是有界收敛。如果你的指标要求是稳态误差小于某个值,选边界层厚度 phi 就等于直接选定了这个值,不存在“既要零误差又要零抖振”的免费方案。
5. 常见问题与排查:仿真跑不出结果,先看这五处
5.1 现象:误差从第一步就指数发散,控制量瞬间打满
原因几乎总是坐标系或者符号接错了。最常见的是 J 用了转置、v 的正方向定义反了、或者 τ_v 的符号与 D 矩阵里的对应项不一致。这类错误的特点是发散得非常快,通常几十个步长内就能看出来,不会给你“慢慢调”的机会。
解决办法是先做开环测试再闭环。给定常值 τ_u,看 u 是否单调增;给定常值 τ_r,看 r 是否单调增、ψ 是否随之积分;给定常值 τ_v,看 y 坐标是否往右舷偏。三个方向都对上之后再闭合控制环,能省掉大量瞎调参数的时间。
5.2 现象:控制量高频抖动,执行器模型完全跟不上
原因有三个层次,要逐层排除。最外层是切换增益太大,Ŵ 远大于实际扰动上界,sign 或者窄边界层的 tanh 在每一步都做硬跳变;中间层是仿真步长太大,离散化本身就在滑模面附近制造了准滑模振荡;最内层是观测器前馈通道把速度噪声放大后灌进了 τ。
解决顺序建议从内到外:先关自适应、固定一个小增益,看抖振是否消失;再单独看 d̂ 的频谱,如果有明显的高频分量,就把 K 调小;最后再调边界层 phi。把步长从 1e-2 降到 1e-3 如果抖振明显变化,说明你的问题主要是离散化而不是控制律本身。
5.3 现象:d̂ 一直有偏,或者干脆发散到无穷
有偏通常来自模型不准:M、C、D 里的参数与实际被控对象差得太多,观测器把模型误差当成了扰动的一部分,估出来的 d̂ 里混进了一个常值偏置。这个偏置其实不影响闭环稳定性(因为滑模项会把它一起压掉),但会让你误以为观测器没工作。
发散则多半是符号问题。ζ 的更新律里 −K·ζ 和 +K·(Cν + Dν − τ − K·M·ν) 这两项的符号必须严格对上,任何一处反了都会让误差动态变成 d̃̇ = ḋ + K·d̃,指数发散。排查方法是把 d 人为设成零跑一遍,此时 d̂ 应该收敛到零附近;如果它跑飞,就是符号错了,跟参数大小无关。
5.4 现象:自适应增益单调涨到上限再也不降
这是积分型自适应律的经典毛病。只要 |s| 存在一个消不掉的稳态小残差(边界层内的误差、参考轨迹拐点处的跳变、采样量化误差都算),Ŵ̇ = Γ|s| 就永远是正的,增益只会往上爬。爬到上限之后,抖振比你不用自适应还严重。
解决办法是加泄漏项和死区。泄漏项前面已经写过,σ 取值通常是 Γ 的百分之一量级;死区更直接,把更新律改成只在 |s| > ε 时才累加,ε 取边界层厚度的一半左右。两个手段可以叠加,代价是增益会略微偏保守。
5.5 现象:改小仿真步长,跟踪结果就变了
这不是 bug,是准滑模的正常表现。滑模控制在连续时间下是理想切换,在离散实现下每一步的切换都会带来一个 O(h) 的稳态抖振,边界层和步长是耦合的:步长变小,同样的 phi 相对变宽,稳态误差的行为就变了。
要让结果对步长不敏感,一是用定步长求解器(四阶龙格库塔,步长固定),二是把 phi 设成明显大于 sqrt(h) 的量级,三是把控制器和对象放在同一个步长下更新,不要出现控制器步长是对象步长整数倍这种错配。做完这三件事,步长从 1e-2 改到 1e-3,误差曲线的形状应该基本重合。
6. 设计取舍:这套结构什么时候该拆,什么时候不该拆
把三段拆开看,每一段都对应一个明确的取舍,而这些取舍之间是互相牵制的。
观测器带宽 K 与噪声是第一条线。K 大,d̂ 收敛快、残差小,滑模增益可以压得更低;但 K 大到接近速度信号的噪声频带,d̂ 就开始跟踪噪声,前馈通道从“补偿”变成“激励”。实船上速度测量更新率往往只有几赫兹,K 的可用范围比仿真里窄得多,这也是为什么纯仿真调出来的参数搬到硬件上经常失效。
DSC 的 τ_f 是第二条线。它同时在扮演两个角色:滤波器和数值微分器。作为滤波器,τ_f 越大越干净;作为微分器,τ_f 越大误差越大。这两者不可能同时最优,只能根据你的参考轨迹有多“光滑”来折中——轨迹是解析曲线,τ_f 可以取小;轨迹是航路点插值出来的折线,τ_f 取小反而会把拐点处的冲激放大成控制量的尖峰。
自适应增益是第三条线,而且是最容易高估收益的一条。理论上自适应能免去手工标定切换增益,实际上它换来的是收敛速度和稳态抖振之间的持续拉锯,还得额外引入泄漏项、死区、投影三套保护机制。如果扰动上界事先能估个大概(船舶工况通常是可以的),固定增益加观测器前馈往往比自适应更省心,代码也短一半。
验证方法我一般会看三条曲线,而不是只看跟踪误差。第一条是位置误差的时域曲线,看有没有稳态偏置和转弯处的超调;第二条是 d̂ 与人为设定的 d 的对比,看观测器的相位滞后有多大;第三条是 τ 的频谱,看能量是不是集中在低频段。前两条决定“对不对”,第三条决定“能不能上硬件”。
还有一个容易被忽略的边界条件:全驱动。这套推导从头到尾假设了推力分配矩阵可逆,三个自由度都能独立驱动。一旦进入欠驱动工况(比如某个推力器故障),M⁻¹ 那一步就不再能任意配置,整个反步结构需要重写,滑模面也得重新定义。把全驱动当成前提而不是结论,是做这类方案时最基本的一条纪律。
从那以后我每次搭这类控制器,都强制先只开 DSC 跑一遍、再单独开观测器跑一遍、最后才三段全开,宁可多花半天,也不愿意在三段耦合的曲线上猜是谁的问题。希望帮到你。
本文还有配套的精品资源,点击获取