
简介这是一份基于LQRY-SMC的水翼艇纵向运动控制论文复现资源面向具备自动化控制基础、从事船舶与海洋工程的研究人员或技术人员解决高速航行时海浪干扰引起的垂荡与纵摇剧烈变化问题。压缩包共1个文件为PDF文档大小约790KB文本在复现水翼艇数学模型的同时给出了从状态空间推导、控制器设计到仿真的完整代码注释覆盖自适应滑模控制、LQRY-SMC滑模面、非线性干扰观测器和抗饱和补偿器等关键环节。读者可对照代码逐一理解PCH-1模型的力与力矩计算、滑模趋近律参数影响、以及抑制抖振的执行机构饱和限制处理。资源着重呈现工程实现细节与参数设置思路能帮助相关人员快速搭建水翼艇纵向运动控制仿真评估不同控制策略并开展后续改进。已有89人学习下载适合作为水翼艇控制器设计与复现的入门参考。 先说句实在的水翼艇这玩意儿跑起来确实帅船体一离水速度直接上一个台阶但你要是真去碰它的控制系统就是另一回事了。我在复现基于LQRY-SMC的水翼艇纵向运动控制策略时前后磕了大半个月最深的体会是——线性控制器在标称模型上做得再漂亮一旦把波浪扰动接进去劣势立刻现形。这篇复现笔记会把从建模、LQRY参数设计、滑模控制律落地到抖振抑制处理的全过程写清楚代码给到能直接跑的版本适合正在做船舶运动控制、刚接触滑模控制或者卡在论文复现里很久的同学参考。1. 复现前先拆思路水翼艇的纵向稳定性问题为什么值得用非线性控制1.1 高速航行时的海豚运动到底指什么水翼艇在高速状态下艇体被水翼产生的升力整个托出水面浸水面积大幅缩减兴波阻力随之骤降这是它速度优势的主要来源。但代价也很直接支撑面积只剩几块水翼任何纵向扰动都会同时引起垂荡和纵摇的耦合运动。这个耦合在文献里有个很形象的名字叫海豚运动——船头一会儿仰起来一会儿压下去整个艇像海豚反复入水出水那样跳。早期水翼艇设计翻车大部分都翻在这上面。纵摇角稍微大一点前后水翼的入水深度就发生明显变化升力重新分配又反过来加剧纵摇形成一条自激振荡链。从控制模型的角度看纵向通道就是垂荡位移 z 和纵摇角 θ 的强耦合系统状态必须取成 [z, θ, ż, θ̇]不能把两个通道拆开单独看。1.2 线性控制器为什么会在实际工况里掉链子如果只做标称点上的线性控制器比如经典LQR在固定航速、固定载重、零波浪干扰的仿真里表现确实可以洗得很干净。但要注意水翼艇的实际工况远没有这么友好航速范围跨度大水动力系数随航速明显变化波浪外侧扰动不可测还存在建模误差和参数摄动。这些因素叠加在一起就是咱们常说的集总扰动。LQR在设计点附近的自稳裕度是有的但它的鲁棒性是建立在模型相对准确的前提下的。模型一偏增益就未必是最优的甚至可能让系统提前进入振荡发散。更麻烦的是这类系统的性能指标通常很苛刻高速时纵摇角波动超过两三度舒适性和结构载荷都受不了。所以论文里普遍会往对模型误差和扰动不敏感的滑模控制方向走。滑模控制的核心思想是状态一旦被拉到滑模面上后续行为主要由滑模面自身的方程决定原系统参数不确定性的影响被大幅削弱。这就是它在水翼艇纵向控制里被反复使用的原因。2. LQRY-SMC的完整设计链路从输出加权LQR到滑模面参数2.1 输出加权LQR不直接压全部状态而是压你想管的量我复现时对LQRY的理解是输出加权形式的LQRY 指的就是被控输出。代价函数写成J ∫ ( yᵀ Q_y y uᵀ R u ) dt其中 y C_y x通常只取垂荡位移 z 和纵摇角 θ 这两个真正关心的量。相比直接对全部状态加权输出加权的好处是你不需要纠结位置、角度和速度这几个物理量纲完全不同、数值范围差异很大的状态怎么一起配权重直接按控制目标来就好。我按允许误差来反推权重这个方法在工程上特别稳假设垂荡允许 0.08 米纵摇允许 2 度那么两个加权系数分别取 1/z_allow² 和 1/θ_allow²。换算下来垂荡权重大约 156纵摇权重则要大一个量级因为 2 度对应的弧度值是 0.035数值很小想要把它压住就得给更大权重。R 我取 0.01表示允许控制输入适度活动。2.2 用LQR增益构造滑模面一个省事的组合技巧滑模面怎么选是这类控制器设计里最玄学的环节。很多入门资料都在讲 s c·e ė就一个常数 c调来调去全凭手感。论文里广泛采用的一种做法是用 LQR 的反馈增益 K 直接充当滑模面系数矩阵也就是令s Kx为什么不违和因为 K 本身是由 Riccati 方程求解出来的最优反馈增益它已经包含了目标权重和水翼艇模型的动力特性决定了状态空间中哪些方向的误差该以多快的速度收敛。把 K 放进滑模面相当于给滑模运动提前选好了一个最优收敛方向所以这类设计在论文里通常叫最优滑模面。复现的时候不需要重新推导数学证明直接令 C_s K 即可后面一切照常。2.3 等效控制加切换控制鲁棒性的真正来源标准的SMC控制律拆成两块u u_eq u_sw其中等效控制 u_eq -(C_sB)⁻¹ C_sAx作用是把系统维持在滑模面上让它沿着 s0 滑动。它完全依赖标称模型模型一偏等效控制就会算偏。切换控制 u_sw 就是来补这个窟窿的传统形式是 -α·sign(s)其中 sign(s) 在 s0 两侧跳变。α 必须大于集总扰动在滑模面上投影的上界太小会让状态穿出滑模面控制性能明显变差太大则抖振剧烈。这一项既是SMC鲁棒性的真正来源也是后边所有抖振抑制问题的根源。3. 标称模型与扰动建模复现第一步先让系统像水翼艇3.1 状态空间模型的量级设定与耦合关系复现的第一步是把被控对象搞得像回事。状态变量定义我直接用下面这个表格变量含义单位z垂荡位移mθ纵摇角radż垂荡速度m/sθ̇纵摇角速度rad/s本文按单输入等效襟翼控制展开控制量是水翼等效襟翼角 u单位 rad。前后两个水翼之间的控制分配问题会在后边单独提一句这里先把纵向主控制律跑通。标称线性化模型直接写成 ẋ Ax Bu。复现时我采用的参数如下不是某条实船的精确辨识结果但量级和水翼艇文献中常见线性方程的特征是一致的A [0 0 1 0;0 0 0 1;-1.96 -3.14 -1.10 0.55;0.80 -4.29 0.35 -1.60]B [0; 0; 1.2; 2.4]跑一下 eig(A) 就能看到系统存在一对阻尼偏弱的耦合振荡模态对应纵向运动中垂荡和纵摇的耦合。这部分阻尼就是控制器要重点加强的地方。注意垂荡方程里同时出现 z、θ、ż、θ̇ 的系数纵摇方程里也混有 z 和 ż 的项这就是两个通道耦合的直接体现。3.2 波浪扰动怎么加才贴近高速航行场景光做单频正弦扰动测试说服力很弱。复现中我给扰动加了两个频率叠加主波频率 w1 0.8 rad/s 和 w2 1.3 rad/s大致对应七八秒和五秒左右的波浪周期属于水翼艇高速航行时经常会遇到的中长波。等效扰动力作用在垂荡通道和纵摇通道上幅值分别取 0.6 m/s² 和 0.25 m/s²。这个量级是我调出来的经验值足够让纯 LQR 在仿真里明显震荡但又不至于让滑模控制器完全没有还手之力。扰动直接以强迫力形式加在状态导数的后两个分量上实现起来也很方便。4. 可直接跑通的MATLAB代码模型、控制律与主循环拆分讲解下面这段代码我拆成三段讲连起来保存成一个脚本就能运行文件名随意比如 hydrofoil_LQRY_SMC.m。第一段解决模型和 LQR 求解第二段是控制器和扰动子函数第三段是固定步长 RK4 主循环和绘图。4.1 模型参数与LQR求解%% 水翼艇纵向运动控制复现LQRY-SMC % 状态 x [z; theta; z_dot; theta_dot] % z 垂荡位移(m), theta 纵摇角(rad), u 等效襟翼角(rad) clear; clc; close all; % 标称线性化模型 A [0 0 1 0; 0 0 0 1; -1.96 -3.14 -1.10 0.55; 0.80 -4.29 0.35 -1.60]; B [0; 0; 1.2; 2.4]; % 输出加权矩阵只看垂荡位移和纵摇角 Cy [1 0 0 0; 0 1 0 0]; % 按允许误差换算加权 z_allow 0.08; % 垂荡允许 0.08 m theta_allow 2.0 * pi / 180; % 纵摇允许 2 deg Qy diag([1/z_allow^2, 1/theta_allow^2]); R 0.01; % 转换成状态加权形式并求解LQR Q Cy * Qy * Cy; [K, P, ~] lqr(A, B, Q, R); % 用LQR增益作为滑模面系数 C_s K; s_K C_s * B; % 标量用于等效控制 alpha 0.8; % 切换增益 phi 0.02; % 边界层厚度这里把输出加权 Qy 转成状态加权 Q是因为 MATLAB 的 lqr 函数标准接口接收的是状态权重。转换方式就是 Q Cy·Qy·Cy数学上等价于在代价函数里对输出做二次型惩罚。K 得到后直接把 C_s 赋成 K是整个复现里最省事也最关键的一步。4.2 控制律和局部函数function u smc_controller(x, A, B, C_s, s_K, alpha, phi) % 滑模面 s C_s * x; % 等效控制 u_eq -(s_K)^(-1) * (C_s * A) * x; % 饱和函数形式的边界层 sat max(min(s / phi, 1), -1); u_sw -alpha * sat; u u_eq u_sw; end function d wave_disturbance(t) w1 0.8; w2 1.3; f1 0.60 * sin(w1 * t) 0.35 * sin(w2 * t 0.5); f2 0.25 * sin(w1 * t 1.2) 0.18 * sin(w2 * t 0.9); d [0; 0; f1; f2]; % 只对两个运动通道施加等价波浪力 end这两个函数在 MATLAB 里作为脚本局部函数放在脚本末尾。smc_controller 里那个 sat 就是边界层处理把理想的 sign(s) 换成 s/phi 的饱和值是抖振抑制的关键。wave_disturbance 返回的是状态导数层面的扰动不是直接加在位移上这更符合力的物理属性。4.3 固定步长RK4主循环与绘图dt 0.001; T 20; N round(T / dt) 1; t linspace(0, T, N); x zeros(4, N); x(:, 1) [0.08; 0.03; 0; 0]; % 初始垂荡/纵摇偏差 u_hist zeros(1, N); s_hist zeros(1, N); for k 1:N-1 tk t(k); xk x(:, k); uk smc_controller(xk, A, B, C_s, s_K, alpha, phi); u_hist(k) uk; s_hist(k) C_s * xk; k1 A * xk B * uk wave_disturbance(tk); k2 A * (xk 0.5*dt*k1) B * smc_controller(xk 0.5*dt*k1, A, B, C_s, s_K, alpha, phi) wave_disturbance(tk 0.5*dt); k3 A * (xk 0.5*dt*k2) B * smc_controller(xk 0.5*dt*k2, A, B, C_s, s_K, alpha, phi) wave_disturbance(tk 0.5*dt); k4 A * (xk dt*k3) B * smc_controller(xk dt*k3, A, B, C_s, s_K, alpha, phi) wave_disturbance(tk dt); x(:, k1) xk dt / 6 * (k1 2*k2 2*k3 k4); end u_hist(N) smc_controller(x(:, N), A, B, C_s, s_K, alpha, phi); s_hist(N) C_s * x(:, N); % 绘图 figure(Name, LQRY-SMC 纵向运动响应); subplot(3, 1, 1); plot(t, x(1, :) * 1000, b, LineWidth, 1.2); ylabel(垂荡 z (mm)); grid on; subplot(3, 1, 2); plot(t, x(2, :) * 180 / pi, b, LineWidth, 1.2); ylabel(纵摇 \theta (deg)); grid on; subplot(3, 1, 3); plot(t, u_hist, b, LineWidth, 1.0); ylabel(控制输入 u (rad)); xlabel(时间 (s)); grid on;这里必须多说一句主循环我用的是固定步长 RK4而不是很多人习惯的 ode45。滑模控制的右端项在滑模面附近导数不连续变步长积分器会不断缩小步长去凑精度20 秒仿真经常卡到怀疑人生。固定步长 0.001 秒在边界层方案下完全够用这也是论文复现里一个非常隐蔽的坑我当初在这里浪费了整整一个下午。5. 抖振抑制的实际处理三组对比结果与调参经验5.1 抖振的本质理想切换与离散积分的冲突理想滑模要求 sign(s) 做无穷频率的切换但实际仿真和数字控制器都是离散的采样步长有限状态只能在滑模面两侧来回穿越。反映到控制量上就是一路高频抖动。如果直接把这种控制量接到实物水翼襟翼上液压舵机大概率当场报废。边界层饱和函数的思路是在滑模面附近划出一层厚度为 φ 的缓冲带当 |s| 小于 φ 时切换项从 α 连续变化到 0不再瞬间跳变。代价是损失了一点稳态精度s 不会精确到零而是在边界层内部波动。工程上这就是在抖振和精度之间做交易不是非黑即白的事。5.2 三组仿真对比无边界层、有边界层、纯LQR复现的时候强烈建议把三组放一起对比感受会非常直观A 组纯 LQR把控制律换成 u -K·xB 组标准 SMC把 smc_controller 里的 sat 改回 sign(s)C 组完整版 LQRY-SMC用饱和函数加边界层。按我这套参数跑出来的典型结果大致是这样纯 LQR 在波浪进来后垂荡峰峰值接近 0.1 米纵摇角起伏逼近 4 度勉强稳定谈不上性能标准 SMC 的幅值明显压下来了但控制输入几乎是在正负几个 rad 之间高频切换曲线看起来就是一根毛刺带根本没法直接用换成完整版后垂荡峰峰值能压到 0.04 米以内纵摇角基本在 1 度以内浮动控制量变成 0 到 3 弧度之间的缓变曲线这个输出对执行机构友好得多。5.3 调参与避坑心得最后分享几条我反复踩出来的经验论文里不会写这么细φ 的取值建议从大到小试。先取 0.05波形不抖了再慢慢降到 0.01一旦开始出现高频毛刺就回调。φ 取得太小边界层就名存实亡跟 sign 函数没区别。α 至少要比集总扰动在滑模面上的投影大。判断标准很简单看 s_hist 有没有在 0 附近收敛如果 s 曲线一直来回穿透不收敛大概率是 α 给小了。权重配比一定要做量纲归一化。z 是米θ 是弧度两个数值差两个数量级直接按 1/允许误差² 去配 QyLQR 才能给出合理的 K控制输入也不容易饱和。初始状态别给太大。这套控制器定位是维持稳定而不是大范围调姿初始垂荡 0.08 米、纵摇 0.03 弧度已经是相当强的扰动了再大仿真容易触发控制器饱和反倒看不出算法优势。在我后来换过几组模型参数再回来跑这套代码时体会越来越明确LQRY 负责把滑模面的形状选好SMC 负责兜住模型误差和波浪扰动边界层决定这套方案是停在纸面上还是能真正跑起来。论文里的公式永远是简洁的复现过程从来不是。希望这份笔记能帮你少走几天弯路。本文还有配套的精品资源点击获取