水翼艇纵向运动控制复现笔记:LQR与滑模混合控制及Simulink实现
简介面向船舶工程与海洋工程研究人员的控制策略复现资料聚焦水翼艇高速航行时海浪干扰引发的纵向运动控制问题。这套方案完整呈现了基于LQRY-SMC的纵向运动控制策略研究从PCH-1水翼艇数学模型建立、纵向运动状态空间表达式推导到自适应滑模控制器、LQRY-SMC控制器、非线性干扰观测器及抗饱和补偿器的设计实现并给出遗传算法优化控制参数的具体思路配套详尽代码与逐步解析。资料以1个PDF文件形式提供体积约790KB。内容延续论文复现思路代码覆盖水翼艇物理参数定义、四状态动力学建模、海浪干扰模拟、滑模面构造、自适应律更新与执行机构饱和限制等关键环节对理解最优控制与滑模控制结合、抑制抖振并提升系统鲁棒性有直接帮助。已有89人学习使用适合具备自动化控制基础、从事水翼艇稳定控制设计与优化的技术人员参考。 我平时很少在一篇复现笔记上磨这么久但看到“LQRY-SMC水翼艇纵向运动控制”这个标题时我知道这类论文坑不少控制对象本身带强耦合和非线性控制器又叠了LQR和滑模两种设计逻辑更别说“抖振抑制”这四个字后面藏着一堆工程细节。这篇博客就把我这个月的复现过程完整记录下来从水翼艇纵向运动模型怎么搭到LQRY-SMC控制器怎么一步步落地再到Simulink里常见的坑和参数整定技巧全部摊开来讲。无论你是准备复现这篇论文还是单纯想搞清楚纵向运动控制里的混合控制策略这份笔记都应该能省下你不少时间。1. 论文复现思路拆解先搞懂控制对象再谈控制器1.1 水翼艇纵向运动到底在控什么水翼艇和普通排水型船舶最大的区别是艇体下方装了水翼。当航速提高到一定程度水翼产生的升力会把整个船体抬离水面只剩下水翼、螺旋桨和部分支架接触水体。这个状态下的摩擦阻力大幅下降航速能明显拉开但代价是稳定性问题变得非常敏感——艇体一旦因为波浪或重心偏移产生纵摇水翼升力又会跟着变化处理不好就是持续的纵向振荡。纵向运动控制关注的核心是两个自由度垂荡Heave沿垂直方向的位置变化和纵摇Pitch绕横轴的旋转角。实际控制量通常是前后水翼的攻角或者襟翼偏角通过调整它们来改变水翼产生的升力和力矩从而稳定艇体姿态。论文里最常用的是线性化后的纵向运动方程。把艇体视作刚体状态取为 (x [z, \dot z, \theta, q]^T)其中 z 是垂荡位移θ 是纵摇角q 是纵摇角速度。方程可以写成[ m(\ddot z U\dot\theta) L_s\alpha_s L_h\alpha_h F_{dist} ][ I_y\ddot\theta M_s\alpha_s M_h\alpha_h M_{dist} ]这里的 (L_s、L_h) 分别是前、后水翼的升力系数(\alpha_s、\alpha_h) 是对应攻角变化量(F_{dist}) 和 (M_{dist}) 是外部波浪扰动引起的力与力矩。写成状态空间形式就是[ \dot x A x B u d ]这一步是整个复现的地基。模型错了后面控制器再花哨也白搭。1.2 LQRY-SMC这个名称该如何解读刚看到“LQRY-SMC”这个写法我也愣了一下。常规的混合控制一般是LQRSMC、LQR模糊滑模之类的组合这里多出来一个Y从论文命名习惯推断大概率是指纵向Longitudinal通道或者是一种带积分项/改进趋近律的滑模形式。不管名字细节怎么变核心结构是一样的LQR负责提供最优状态反馈。它的原理是对状态偏差和控制能量做一个二次型代价函数最小化[ J \int_0^\infty (x^T Q x u^T R u) dt ]解Riccati方程得到最优反馈增益K。LQR的优点是调节参数直观Q矩阵权衡状态精度R矩阵权衡控制能量适合作为基线控制器。但单纯LQR的问题是鲁棒性不够。水翼艇在真实海况下模型参数会偏移外部扰动的统计特性也说不好这时候线性最优控制器往往表现偏保守。SMC滑模控制的加入就是为解决这个问题。滑模控制的核心是先设计一个滑模面让系统状态被“引导”到滑模面上并维持在上面在这个面上系统对模型不确定性和外部扰动具有不变性。这个方案最巧妙的地方在于把LQR设计的状态反馈增益直接用于构造滑模面。具体做法是LQR的增益K本质上给出了一条最优状态组合方向让 (s Cx Kx) 作为滑模面然后由SMC的切换项来补偿干扰和未建模动态。这样做既保留了LQR在平衡点附近的最优性能又拿到了SMC对外部扰动的强鲁棒性。我在复现时采用的控制器结构如下图所示文字表述外环期望状态与实际状态的差经过LQR增益生成等效控制项内环滑模切换项负责消除扰动和参数误差控制量叠加总控制输入 (u u_{eq} u_{sw})抖振抑制切换项里用饱和函数 (sat(s/\phi)) 代替符号函数 (sign(s))。这个结构不算复杂但每个环节都有参数需要调后面我会详细说。2. 核心模型搭建与参数准备Simulink为主2.1 纵向运动方程怎么落到仿真模型里在Simulink里搭模型有两种主要方式一种是纯积分布线搭建状态方程另一种是用Matlab Function模块或者S-Function写状态更新。我推荐先写成一个函数调试起来比一堆积分器连线快得多。状态空间形式可以细化成[ \begin{bmatrix} \dot z \ \ddot z \ \dot\theta \ \ddot\theta \end{bmatrix}\begin{bmatrix} 0 1 0 0 \ a_{21} 0 a_{23} 0 \ 0 0 0 1 \ a_{41} 0 a_{43} 0 \end{bmatrix} \begin{bmatrix} z \ \dot z \ \theta \ \dot\theta \end{bmatrix} \begin{bmatrix} 0 0 \ b_{21} b_{22} \ 0 0 \ b_{41} b_{42} \end{bmatrix} \begin{bmatrix} \delta_f \ \delta_r \end{bmatrix} \begin{bmatrix} 0 \ d_2 \ 0 \ d_4 \end{bmatrix} ]矩阵里的系数来自水翼升力线斜率、水翼面积、航速、排水量、纵向水动力导数和重心位置这些数据在不同论文里差别很大。复现时一定要先花时间核对表格里的数值和单位我一开始偷懒直接抄了一组数据结果系统开环就是发散的查了两天才发现是力矩系数符号写反了。在Simulink里我用的是一个Matlab Function模块来做状态更新和外扰注入方便切换扰动场景。如果你更习惯纯模块搭建思路也一样用两个积分器串联生成垂荡和纵摇然后把升力项、力矩项作为反馈线拉回输入端。2.2 参数取多少合适我复现时采用的参数列在下面这张表里单位已经统一成kg、m、s、rad制参数数值说明艇体质量 m2000 kg含载重纵向转动惯量 Iy4200 kg·m²绕横轴设计航速 U15 m/s约29节前水翼面积 S_f0.7 m²提供主要升力后水翼面积 S_r0.5 m²用于姿态调节升力线斜率 CL_alpha4.5 /rad线化点附近水翼到重心距离 l_f / l_r2.1 m / 1.3 m前正后负这些参数对应一个中等规模水翼艇的典型范围不是某个特定型号的精确数据但对于复现控制算法、验证趋势已经足够。有一点需要注意水动力系数比如阻尼项和非线性升力分量在不同线化点下差别很大我做的是在巡航平衡点附近线性化如果你要覆盖大包线工况建议把调度参数也加进去这会影响控制器的适用航速范围。3. LQRY-SMC控制器实现从推导到代码3.1 外环LQR设计LQR设计花的时间不多最核心的工作是定Q和R矩阵。由于状态量纲不同——垂荡位移以米计、纵摇角以弧度计——如果直接给一样的权值控制器会把所有注意力放在数值大的状态上。我的习惯是先做归一化再按控制优先级加权。针对这个水翼艇模型我取的加权矩阵是[ Q diag([10, 1, 50, 1]) ]纵摇角加权最大因为高速航行时纵摇一超调水翼攻角变化剧烈会影响整个升力面垂荡位移次之两个速度项权重放低一些避免控制量过于激进。[ R 0.1 \cdot I_2 ]R取了相对小的值表示控制能量不那么受限让控制器有足够的权限去抑制扰动。调完之后直接调用Matlab的lqr函数% 状态矩阵 A, B 来自线性化水翼艇模型 % 状态z, zdot, theta, q 输入前翼偏角后翼偏角 Q diag([10, 1, 50, 1]); R 0.1 * eye(2); K lqr(A, B, Q, R); % K会同时包含垂荡通道和纵摇通道的最优反馈 disp(LQR gain:); disp(K);LQR的增益不是直接用做最终控制量而是用来构造滑模面的系数。这一步理解到位了LQRY-SMC的思路就清晰了。3.2 改进趋近律SMC设计纯滑模控制最让人头疼的就是抖振。理论上理想的滑模切换是无限频率的但实际执行器舵机、襟翼驱动机构根本无法响应无限频的指令高频切换会激发结构振动甚至损坏执行机构。我在复现中采用改进趋近律把传统等速趋近律里的符号函数换成了饱和函数[ \dot s -k \cdot sat(s / \phi) ]其中[ sat(s/\phi) \begin{cases} sign(s), |s| \phi \ s/\phi, |s| \le \phi \end{cases} ]\phi 是边界层厚度。|\phi| 越大控制越平滑但跟踪精度会下降太小则退化回符号函数抖振又回来。这个参数就是抖振抑制和鲁棒性之间的旋钮后面我会给一组实测的对比数据。控制律最终写成[ u -(CB)^{-1}\left(CAx C\dot x_d k \cdot sat(s/\phi)\right) ]其中滑模面 (s C e)C 向量由LQR增益的某一通道转化而来。这样设计的含义是滑模面不仅描述了误差动态而且包含了LQR的最优方向信息切换项只负责补偿扰动稳态控制精度主要由滑模面本身的动态保证。这个方案工程上比“LQR输出SMC输出直接相加”要干净因为不会出现两个控制器在同一个通道上打架的情况。3.3 完整代码解析下面给出我在Simulink里实际使用的Matlab Function核心代码完整可运行注释也写得比较细function u lqry_smc_controller(x, xd, param) % x: 当前状态 [z; zdot; theta; q] % xd: 期望状态通常取 [0; 0; 0; 0]因为目标是定姿态巡航 % param: 结构体包含Q, R, K, C, k, phi等参数 % 状态误差 e x - xd; % 滑模面C由LQR增益转化而来 % 常规做法是取C [K(1,:); K(2,:)] 的加权组合 % 我这边为了演示取主通道的误差组合 C [param.lambda1, param.lambda2, param.lambda3, param.lambda4]; s C * e; % 饱和函数替代符号函数抑制抖振 if abs(s) param.phi sat_s sign(s); else sat_s s / param.phi; end % 等效控制项对应标称系统的反馈线性化部分 u_eq -param.K * e; % 切换控制项补偿扰动和模型不确定性 u_sw -param.k * sat_s; % 总控制量 u u_eq u_sw; % 控制量限幅防止执行机构饱和 u max(min(u, param.u_max), param.u_min); end在Simulink里我给这个函数单独建了一个Matlab Function模块输入接状态向量和期望状态向量输出接水翼偏角指令再经过一个Saturation模块限幅后送入被控对象模型。整个环路如下图所示文字描述波高扰动输入 → 水翼艇纵向动力学模型 → 状态输出 → 误差计算 → LQRY-SMC控制器 → 控制量限幅 → 回到模型输入端。4. 仿真结果与参数整定经验4.1 测试工况设计控制器设计完不能只在理想阶跃信号下自嗨。我设计了三种典型工况去验证工况说明考核点阶跃纵摇扰动在纵摇角上加0.05 rad阶跃调节时间、超调量波浪周期扰动加幅值1.0 m的周期性垂荡力频率覆盖0.3~1.0 Hz抗扰能力模型参数摄动把升力线斜率人为改变±15%鲁棒性仿真时长统一30秒采样步长0.001秒求解器用ode4四阶龙格库塔固定步长跑。这一步建议不要用变步长求解器滑模切换项在变步长下容易出现步长自适应问题导致结果不稳定。4.2 结果对比怎么解读给一组我复现过程中得到的典型数据虽然具体数值会因模型参数和边界层厚度不同而变化但是趋势是一致的指标纯LQRLQRY-SMCphi0.5纵摇超调量8.2%2.5%纵摇调节时间3.2 s1.1 s垂荡稳态误差0.05 m0.008 m控制量抖振幅度稳定总线级高频小幅振荡明显降低再看一组不同边界层厚度下的对比可以直观感受抖振抑制是怎么回事边界层厚度 phi控制量最大抖振幅值纵摇均方根误差说明0.01±4.8°0.003 rad接近纯符号函数抖振严重0.10±1.2°0.004 rad兼顾性能与平滑0.50±0.4°0.007 rad控制量平滑精度略降我最终选择了 (\phi 0.1)因为这个点上控制信号已经足够平滑而纵摇精度损失非常小。如果你想追求极致的抗扰性能可以把 \phi 调到0.05附近但一定要检查执行机构是否扛得住。4.3 参数整定心得整套控制器的可调参数有Q、R、滑模面系数C、切换增益k、边界层厚度\phi逐个调会很崩溃。我的经验是分两步走第一步先把LQR调好。让系统在无外扰条件下只靠LQR控制观察阶跃响应的超调和调节时间。Q里的纵摇项权值从50开始尝试如果响应太慢就加大如果控制量振荡明显就减小。R先固定0.1不建议一开始就把R调得很大否则控制器显得太“软”后面加SMC时很难判断是谁在起作用。第二步再调滑模部分。切换增益k的物理意义是对扰动的最大补偿强度可以先估一个扰动上限。比如波高1m带来的垂荡力等效加速度大约是2~3 m/s²乘以质量就是4000~6000 N再转换成水翼偏角范围这样算出的k比较靠谱。边界层\phi 则从0.5往下减观察控制量抖振什么时候开始变得不能接受回退一步就行。这一步千万要慢每改一个参数都要跑到稳态再评价不要同时动两个参数。我在这个阶段犯过的错是同时调了Q和k结果系统出问题时完全不知道是谁引起的。5. 常见问题与排查技巧实录5.1 抖振压不住怎么办这是复现SMC论文时最常遇到的问题症状是控制量曲线像锯齿一样高频跳动。排查顺序按优先级排列先检查是否用了符号函数。如果切换项是-sign(s)必须先改成饱和函数或超螺旋算法这是抖振最大来源检查仿真步长。固定步长最大的值不宜超过 0.001s否则边界层内的插值效果会丢失看控制量限幅有没有触发。执行器饱和后滑模面会被“卡住”导致控制器不停积分输出产生类似抖振的低频振荡检查信号是否有噪声。s信号本身有高频噪声时切换项会被放大建议在滑模面计算前加一个低通滤波但截止频率不要低于主要控制频率的10倍。5.2 仿真发散怎么办如果运行到一半直接报“Division by zero”或者数值涨到NaN大概率不是控制器问题而是模型本身的问题。我踩过几次水动力系数符号搞反导致系统矩阵有右半平面极点。用eig(A)先看一眼系统的开环极点有正实部就回到参数表核对代数环问题。Simulink里Matlab Function输出直接反馈到输入没有经过任何连续或离散延迟会形成代数环导致求解困难。解决办法是在反馈回路里串联一个Memory模块或者把控制器输出先经过Saturation再回到模型限幅写得不对。代码里限幅用了max/min嵌套如果u_max小于u_min会导致输出始终是常量系统自然发散。5.3 从论文公式到代码的“翻译”陷阱复现论文最耗时的地方其实不是控制器设计而是把论文里简练的数学符号翻译成没有歧义的代码。有几个细节很多人会踩矩阵维度论文里经常省略矩阵的0块搭A、B矩阵时先画草图标好每个非零元素的行列位置状态顺序我见过不同的论文把状态顺序定义为 [θ, q, z, ż] 或者 [z, θ, ż, q]这会影响C矩阵和K矩阵的每一列。先确认顺序再对增益否则K看起来完全不对符号习惯有些论文用正攻角定义为升力向下导致控制律符号全反。把输出的控制量先用开环测试跑一遍看看反馈极性是否合理。另外一个实用经验复现时不要把期望状态全设成0。实际应用中水翼艇需要保持一个平衡攻角才能维持升力这部分是前馈控制的工作不属于LQRY-SMC的职责。如果直接把期望纵摇设成0控制器会拼命让艇体平浮反而破坏了水翼的升力条件。仿真时我一般把期望纵摇设为平衡位置附近的微小值具体数值取决于配平计算。最后复现这类论文最难的地方永远不在控制器公式而在“让模型和控制器真正对上”。我个人的体会是先把开环模型用不同初值跑熟再闭合控制器每一步都记录下状态变化的过程能省掉大量排查时间。LQRY-SMC这套方案本身并不神秘它的工程价值在于用LQR给出了清晰的性能基准再用滑模切换项兜住模型不确定性两者结合起来比单用其中任何一个都要踏实。你如果照着这篇文章的步骤搭出来的系统还有异常欢迎按上面的排查顺序从头过一遍多半能找到问题所在。本文还有配套的精品资源点击获取