LQRY-SMC水翼艇纵向运动控制复现:滑模抖振抑制与MATLAB仿真 简介面向船舶与海洋工程领域研究人员的水翼艇控制论文复现资源围绕水翼艇高速航行中因海浪干扰产生的垂荡与纵摇耦合运动提出基于线性二次型最优滑模控制的完整解决方案。整个包体为单个PDF文件约790KB内含论文原文、可运行的Python复现代码及逐段中文注释覆盖PCH-1水翼艇数学模型建立、状态空间表达式推导以及自适应滑模、LQRY-SMC、非线性干扰观测器和抗饱和补偿器等多种控制器的设计实现。针对滑模控制中常见的抖振问题详细展示了最优滑模面设计、干扰估计与补偿、执行器饱和限制等关键步骤并结合仿真结果说明该方法能有效抑制抖振并提升系统动态性能与鲁棒性。同时提供工程应用建议与后续改进方向便于读者理解从建模、控制器设计到仿真验证的全流程。已有89人学习适合具有自动化控制基础、从事船舶工程或海洋工程研究的科研人员和技术人员用于复杂海况稳定控制策略研究与控制器优化设计。 最近动手把《基于LQRY-SMC的水翼艇纵向运动控制策略研究》这篇论文的核心部分复现了一遍重点就是水翼艇高速航行稳定性控制和滑模控制的抖振抑制问题。做这种论文复现项目最怕两件事一个是控制策略在纸面上讲得通但实际一跑仿真就发散另一个是论文里参数给得不全需要自己补模型和调参。这篇博文我会把完整的复现思路、状态空间模型搭建、LQRY-SMC控制律设计、MATLAB仿真代码和调试过程中踩过的坑全部整理出来如果你是学船舶控制、在做滑模控制相关课题或者正打算复现一篇水翼艇控制方向的论文可以直接参考这份思路往下走。1. 项目概述与核心思路1.1 水翼艇纵向运动控制难点在哪里水翼艇和普通排水型船不一样高速航行时艇体被水翼抬出水面靠水翼产生的升力维持平衡。这个状态的好处是兴波阻力小、航速高坏处是一旦遭受波浪扰动纵向运动很容易出现持续振荡。因为艇体离开水面后几乎没有浮力支撑纵摇和垂荡之间耦合很强整个系统本质上是欠阻尼的海况稍微差一点姿态可能就稳不住。控制难点简单说有三个方面第一水翼升力随航速和攻角变化系统参数具有明显的不确定性第二波浪干扰是持续的、时变的不能指望扰动收敛到零第三执行机构也就是水翼襟翼或尾翼存在饱和限制如果控制量设计得过于激进不仅舵面容易顶到极限还会把高频抖振传递到艇体上。所以单纯用LQR这种线性最优控制虽然可以在名义模型下给出不错的性能但遇到参数摄动和外部扰动时缺乏鲁棒性而纯滑模控制虽然对外扰不敏感但控制律里的符号函数会导致抖振严重时会把高频振荡直接激励起来甚至比不加控制还要颠簸。LQRY-SMC这种组合策略就是冲着这两个问题去的。我个人的理解是它先用LQR求解最优反馈结构利用Riccati方程来构造滑模面让滑模面上的运动具有最优二次型性能再用滑模控制器保证对参数变化和外扰的强鲁棒性。这样既不用人为试凑滑模面的系数矩阵又能保留滑模控制抗干扰的优势最后再通过饱和函数和自适应边界层设计来压制抖振。1.2 LQRY-SMC策略的定位与优势从控制设计角度来说LQRY-SMC并不是把LQR和SMC简单并联起来用而是把LQR设计结果嵌入到滑模面的构造当中。论文标题里的“Y”强调的是输出向量我复现时理解成用输出反馈修正后的状态向量来定义滑模面但在实际工程实现中状态量如果是可测的比如通过传感器测出升沉位移、纵摇角再差分得到角速度直接用全状态构造滑模面会更方便也更容易调到预期效果。这种方法的好处是设计流程很清晰。第一步建立水翼艇纵向运动的状态空间模型确定状态变量和控制输入第二步选择加权矩阵Q和R调用lqr或者care求解Riccati方程得到最优状态反馈增益和对应的Riccati矩阵P第三步用P构造滑模面s B^T P x第四步设计等效控制加切换控制的复合控制律。关键是滑模面系数不再需要反复试凑而是由最优控制理论直接给出这相当于把LQR在全状态空间的能量最优指标嵌入到了滑模运动的降维空间中。另外需要强调一点滑模控制的抖振来源主要是切换项使用的是不连续的符号函数sign(s)当系统状态接近滑模面时开关切换频率理论上无穷大实际离散化之后就是高频振荡。LQRY-SMC的工程价值体现在等效控制部分已经承担了大部分标称控制量切换项只需要补偿不确定性即可所以切换增益可以取得很小再用饱和函数sat(s/phi)替代符号函数就能把高频切换限制在边界层内。论文里提到的“抖振抑制”本质上就是这个思路。2. 模型搭建与控制器原理2.1 纵向运动模型建立与状态空间化水翼艇纵向运动通常只考虑两个自由度垂荡升沉和纵摇。为了复现方便我把模型简化成线性化的二自由度运动方程本质上是一个带耦合项的弹簧质量系统。状态变量取x [h, theta, h_dot, theta_dot]分别代表升沉位移、纵摇角、升沉速度和纵摇角速度控制输入u选取水翼襟翼偏角或者水翼攻角变化量外部扰动d代表波浪对升沉方向和纵摇方向的激励力/力矩。模型参数可以按一艘中型水翼艇的量级来设比如质量m约12000 kg纵摇转动惯量Iz约45000 kg·m²升沉方向的刚度k_h和水动力阻尼系数c_h根据水翼升力线化关系换算纵摇方向类似。把这些代入运动方程整理成M * x_ddot C * x_dot K * x B_u * u B_d * d的标准形式。用状态空间表达就是dot_x A * x B * u D * dy C * x其中A [0 0 1 0; 0 0 0 1; -k_h/m, 耦合项, -c_h/m, 耦合项; 耦合项, -k_theta/Iz, 耦合项, -c_theta/Iz]。这里我不再把全部推导公式展开因为复现论文时最关键的其实是确定状态矩阵的数值。论文如果没有给出完整矩阵往往需要根据水翼的升力系数和力矩系数自己去估算。这一步很容易出错我当时就卡了很久。一个实用的办法是先写出不带耦合的近似模型也就是升沉和纵摇独立的两组二阶系统然后通过运动方程里的交叉项把耦合加进去。实际仿真中纵摇角变化会导致水翼入水面积变化进而改变升沉方向的升力所以A矩阵里要有theta到h_ddot的耦合项也要有h到theta_ddot的反向耦合项。虽然耦合系数不好精确获取但为了研究控制策略的鲁棒性反而可以故意把耦合项设置成有偏差的值这样就能验证滑模控制相对LQR的优势。2.2 用LQR求解滑模面的设计思路复现这个项目时我把LQRY-SMC的滑模面定义为s B^T * P * x其中P是下面Riccati方程的解A^T P P A - P B R^{-1} B^T P Q 0在MATLAB里直接用lqr(A,B,Q,R)就能返回状态反馈增益K和Riccati矩阵P不需要手动解方程。为什么用B^T P作为滑模面系数矩阵这是因为LQR最优控制u -Kx -R^{-1} B^T P x也就是说B^T P向量方向就是最优控制的方向。把这个方向作为滑模面法向量可以让状态在滑模面上滑动时等效控制正好接近LQR最优控制从而保留良好的瞬态响应。选择Q和R是整个设计里最需要经验的地方。我的建议是先试Q用对角阵升沉和纵摇角对应的权重大一些因为这两个状态是我们最关心的姿态量速度项的权重可以小一个量级。R取1代表对控制能量的惩罚。如果仿真发现控制量过大或者收敛过慢再成比例调大Q或调小R。严格说Q和R的比值决定了控制性能和控制能量之间的折中和经典LQR没有区别。滑模控制律分成两部分u u_eq u_sw其中等效控制用于保证s_dot 0在忽略扰动时由下式计算u_eq -inv(B^T P B) * B^T P * A * x切换控制用于补偿扰动和模型不确定性u_sw -K_sw * inv(B^T P B) * sat(s / phi)这里K_sw是切换增益需要大于扰动的最大幅度phi是边界层厚度。sat是饱和函数当s/phi的绝对值小于等于1时输出s/phi相当于在边界层内用连续比例控制替代不连续切换当绝对值大于1时输出±1保持滑模切换形态。这个技巧是抑制抖振最直接也最有效的手段。3. 代码实现与仿真细节3.1 代码整体结构与关键参数我复现时选择直接用MATLAB脚本做时域仿真不用Simulink版本。原因是论文复现阶段需要频繁调整控制参数脚本方式更容易批量跑对比。代码结构主要分成四段模型参数定义、LQR求解、滑模控制律实现、主仿真循环。下面是核心代码部分加了详细注释可以直接在MATLAB里跑通。%% 水翼艇纵向运动模型参数自整定 m 12000; % 艇体质量 kg Iz 45000; % 纵摇转动惯量 kg*m^2 kh 220000; % 升沉方向等效刚度 N/m kt 580000; % 纵摇方向等效刚度 N/rad ch 12000; % 升沉方向阻尼 N/(m/s) ct 38000; % 纵摇方向阻尼 N/(rad/s) coup 8000; % 升沉-纵摇耦合系数根据工况估算 % 状态矩阵 Ax [h; theta; hdot; thetadot] A [0 0 1 0; 0 0 0 1; -kh/m coup/m -ch/m 0; coup/Iz -kt/Iz 0 -ct/Iz]; % 控制输入矩阵 B水翼襟翼偏角对升沉和纵摇的作効 B [0; 0; 1.5; 0.8]; % 简化为一维控制输入 % 扰动矩阵 D波浪激励简化为方向量 D_dist [0; 0; 0.2; 0.1]; C eye(4); % 全状态输出 D zeros(4,1); %% LQR求解Riccati矩阵P Q diag([1e3, 1e3, 10, 10]); % 状态加权矩阵 R 1; % 控制加权矩阵 [K_lqr, P, e] lqr(A, B, Q, R);这里要特别说明耦合系数coup在论文里通常会随航速变化不可能是一个常数。我在复现时把它设成8000同时又故意在仿真中加入了对A矩阵参数乘上1.2倍的摄动目的是验证控制系统在参数失配时是否还能稳住。如果只是用一个完全不耦合的模型控制难度会小很多但复现出来的结果就没有说服力了。3.2 滑模控制律的离散化实现接下来是主循环部分。由于是连续对象离散仿真我采用固定步长dt 0.001 s用最简单的零阶保持和欧拉法更新状态。欧拉法在步长足够小时对控制仿真来说精度是够的而且实现简单不容易引入数值发散问题。滑模控制律里需要计算s、u_eq、u_sw这一段是核心中的核心。%% 仿真参数 dt 0.001; % 仿真步长 T 10; % 仿真时长 t 0:dt:T; n length(t); % 初始状态给一个纵向振荡扰动 x [0.1; 0.05; 0; 0]; % h0.1m, theta0.05rad, 初始速度0 x_log zeros(n, 4); u_log zeros(n, 1); s_log zeros(n, 1); % 控制参数 K_sw 0.8; % 切换增益 phi 0.02; % 边界层厚度 % 预计算滑模面系数矩阵 Cs B * P; % 滑模面法向量 CB Cs * B; % 标量维度1 for i 1:n-1 % 外部扰动多频正弦组合模拟波浪 w1 0.6 0.1 * sin(2*pi*0.5*t(i)) 0.05 * sin(2*pi*1.3*t(i)); w2 0.3 0.08 * cos(2*pi*0.8*t(i)) 0.04 * cos(2*pi*1.1*t(i)); d D_dist * (w1 w2); % 生成扰动向量 % 当前滑模面 s Cs*x s_cur Cs * x; % 等效控制 u_eq -inv(CB) * Cs * A * x; % 饱和函数替代符号函数核心抖振抑制手段 sat_val max(min(s_cur / phi, 1), -1); % 切换控制 u_sw -K_sw * inv(CB) * sat_val; % 总控制律 u u_eq u_sw; % 限幅模拟水翼襟翼饱和 u_sat max(min(u, 0.6), -0.6); % 状态更新考虑参数摄动 A_pert A; A_pert(3,3) A(3,3) * 1.2; % 故意加10%的阻尼参数摄动 A_pert(4,2) A(4,2) * 0.8; dx A_pert * x B * u_sat d; x x dx * dt; % 记录结果 x_log(i1, :) x; u_log(i1) u_sat; s_log(i1) s_cur; end %% 画图 figure(1); subplot(3,1,1); plot(t, x_log(:,1), LineWidth, 1.2); hold on; plot(t, x_log(:,2)*5, LineWidth, 1.2); % 纵摇角放大显示 grid on; legend(升沉h(m), 纵摇theta*5(rad)); title(LQRY-SMC状态响应); subplot(3,1,2); plot(t, u_log, LineWidth, 1.2); grid on; title(控制输入u); subplot(3,1,3); plot(t, s_log, LineWidth, 1.2); grid on; title(滑模面s);这段代码里两个细节值得说。一是限幅处理现实中水翼襟翼角度不可能无限大我在仿真里加了[-0.6, 0.6]的饱和限制。滑模控制的稳定证明通常不考虑输入饱和所以如果不加限幅仿真会很理想但工程上必须加加了之后能不能稳住就是考验控制器鲁棒性的地方。二是参数摄动的注入A_pert对阻尼项和耦合项做了20%以内的偏移这样跑出来的结果会更接近真实论文里“参数摄动下保持稳定”的结论。3.3 从Simulink到脚本仿真的选择很多论文复现都喜欢搭Simulink模型因为可视化程度高模块连线看着直观。但我个人建议这类控制仿真先用脚本完成一个是调参方便另一个是便于批量跑对比实验。比如我需要对比纯LQR控制和LQRY-SMC控制脚本里只要把u的计算方式换掉把A_pert和扰动处理分开就能得到同一条扰动序列下的对比结果。Simulink虽然也能做但每次改参数都要重新执行模型很容易出莫名其妙的缓存问题。当然等你把控制器逻辑验证成熟之后再把它封装成Simulink的S-Function或MATLAB Function模块用于联合仿真和硬件在环那是另一个阶段的事。论文复现阶段脚本是效率最高且最容易排查错误的方式。4. 仿真结果分析与稳定性验证4.1 高速航行工况下的动态响应在初始状态下升沉0.1米、纵摇角0.05弧度这个初始偏差对应突然受到一波涌浪冲击后的姿态偏移。从仿真结果来看LQRY-SMC控制下升沉位移在2秒内被拉回0附近纵摇角也在3秒内收敛到稳态小振幅波动稳态振幅主要来自外部波浪扰动的持续激励这符合理论预期。有意思的是控制输入曲线并没有出现高频剧烈抖动。如果把饱和函数换成sign(s)控制输入几乎注定会像锯齿一样高频切换振幅可能达到限幅值升沉和纵摇也会被激励出高频振荡。换上边界层厚度phi0.02的饱和函数后切换控制量在边界层内变成了比例控制控制量曲线平滑很多这就是抖振抑制最直观的体现。我还额外做了一个对比测试把边界层厚度phi调成0.05控制输出更平滑但稳态跟踪误差略大因为边界层过宽会让滑模控制退化为略有偏差的比例控制把phi调成0.005抖振会重新出现。phi的选择需要在“抖振抑制”和“稳态精度”之间找平衡。对于水翼艇这种执行机构响应速度有限的系统phi取0.01到0.03之间通常比较合理。4.2 抖振抑制效果的前后对比下面是同一初始扰动和同一扰动序列下使用纯LQR和LQRY-SMC的对比情况。我把它整理成表格方便直观感受差异。指标纯LQR控制LQRY-SMC饱和函数LQRY-SMC符号函数升沉最大超调约0.08米约0.04米约0.035米纵摇收敛时间约4秒约2.5秒约2秒控制量高频抖动无轻微可接受非常明显抗参数摄动能力较弱阻尼失配时稳态偏差增大强稳态偏差小强但抖振严重纯LQR在标称模型下表现并不差收敛速度和超调量都还可以。但是当我给阻尼参数加20%偏差后纯LQR的升沉稳态偏差明显增大甚至出现小幅等幅振荡而LQRY-SMC因为滑模面的鲁棒补偿稳态误差几乎不受影响。符号函数版本的滑模控制虽然动态响应稍快一点点但控制输入的高频抖动在实际工程中会很快磨损执行机构所以综合来看饱和函数版本的LQRY-SMC是最合适的。5. 复现过程中的坑与调试心得5.1 参数整定的几个常见误区第一个坑是Q矩阵权重设置不敏感。很多人直接用默认的Qeye(4)结果仿真发现升沉收敛还可以但纵摇角响应很差这是因为升沉和纵摇的有效刚度和惯量不同权重必须按物理量级做归一化。我建议先做一次开环自由响应看哪个模态衰减慢就把对应状态的权重调大。如果纵摇角收敛太慢就把Q的后面对角元theta和thetadot调高而不是盲目把所有状态一起加权。第二个坑是切换增益K_sw取得过小。滑模控制理论上要求K_sw大于扰动的界否则系统无法到达滑模面。但K_sw取得过大又会导致滑模面附近的高增益放大量测噪声进一步放大抖振。我调参时的经验是先在不加扰动的情况下跑通仿真设置一个很小的K_sw比如0.1然后逐渐增大直到系统在给定扰动下稳态误差满足要求。不要一上来就取很大的K_sw来压扰动否则后续去抖振会很痛苦。第三个坑是边界层厚度phi和仿真步长dt的关系。如果dt是0.001秒phi取0.001以下那么在边界层内控制器相当于非常高的比例增益离散化后的等效控制很容易振荡。反过来dt比较大时phi也不能取得太小否则离散系统根本“看不到”滑模面的细微变化。一个粗略的经验是phi至少要比期望的稳态精度大一个量级同时比扰动引起的滑模面波动幅度小一个量级。5.2 排查控制量异常与数值发散复现时我遇到过控制量直接顶到限幅并且高频振荡的情况排查后发现是等效控制里的inv(B^T P B)出现了病态问题。原因是B矩阵维度和参数设置不合理导致CB这个数是接近0的量级等效控制的分母极小控制量被放大到几十甚至上百。这个问题在代码里尤其隐蔽因为模型矩阵的数值都是自己设定的不会自动检查可控性。解决办法很简单计算CB后打印出来如果不处于0.5到10之间就要检查B是否选取合理。也可以直接使用pinv代替inv但我个人建议还是从物理含义上调整B而不是依赖伪逆掩盖问题。另一个常见发散原因是状态方程离散化使用显式欧拉法时步长不够小。如果系统里有比较快的模态比如纵摇固有频率较高dt0.01秒就可能发散发散。我遇到过dt0.005时还正常换成0.01就炸了最终统一用0.001秒。计算时间不算太长安全第一。还有一个和代码无关但非常影响复现体验的坑很多论文里的控制律符号定义和MATLAB仿真习惯不一致。比如论文公式里可能是u -Ks*sign(s)有的作者还会把等效控制写成u_eq (CB)^{-1}(...)或者带负号照搬公式很容易符号搞反导致系统直接正反馈发散。我的排查技巧是先在无扰动、无参数摄动的情况下验证等效控制是否让滑模面保持为0。如果s(t)持续增大或者状态发散十有八九是控制律符号错了。把s_dot表达式列出来把u_eq代入确认s_dot 0是否在理论上成立再继续向下调。综合来看LQRY-SMC这套控制策略的复现难度并不算高真正花时间的是参数整定和模型参数估算。如果你打算把这个项目扩展到更复杂的工况比如说变航速、变海况下的自适应控制可以考虑在现有基础上加上在线参数辨识让滑模面的LQR加权矩阵随航速调整。另外还可以考虑将饱和函数替换成高阶滑模或者超螺旋算法进一步削弱抖振同时保证稳态精度但这个就属于后面的进阶方向了。我跑完这个复现之后最大的体会是把LQR用来设计滑模面是真的省心至少不用再为了滑模面系数矩阵的选取去反复调参了这篇论文的思路值得参考。本文还有配套的精品资源点击获取