ARTICLE DETAIL

资讯详情

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

欠驱动船舶航向控制中的二阶迭代滑模面设计与仿真

欠驱动船舶航向控制中的二阶迭代滑模面设计与仿真 简介面向欠驱动船舶航向控制研究者的MATLAB仿真资料包聚焦基于Lyapunov稳定性的自适应迭代滑模控制设计。资料以二阶迭代滑模面为切入点将航向偏差镇定转化为滑模面镇定并给出两种控制律一种是参数少、处理简单的等效迭代滑模控制另一种引入RBF神经网络逼近不确定项并结合自适应技术估计外界干扰界值从而提升海况扰动下的鲁棒性。压缩包共10个文件其中5个m脚本实现核心控制算法与绘图2个mdl模型用于Simulink仿真2个txt文件提供程序说明另有1个caj文献支撑理论推导。整体约3.63MB结构清晰便于对照论文复现实验已有461人学习。适合船舶运动控制、滑模控制或神经网络自适应控制方向的研究生与工程师快速上手。1. 欠驱动船舶航向控制里为什么要把滑模面做成二阶操舵只能直接产生转艏力矩横向速度无法直接控制这是欠驱动船舶区别于全驱动模型的核心矛盾。直接对航向偏差取一阶滑模面s ψ - ψd做出来的控制器往往在舵角上出现高频切换海况稍差就抖振放大实际舵机根本跟不住。把滑模面改成一阶微分形式构成二阶迭代滑模面相当于给切换项加了一层惯性约束航向偏差的镇定被转化为对滑模面本身的镇定Lyapunov 推导变得直接控制律的工程可调性也更好。这份资源里的sjwl_ctrl1.m和neurocircle.mdl走的正是这条路线一条是等效迭代滑模一条是引入 RBF 神经网络的自适应版本。适合正在做船舶运动控制、滑模控制理论验证或者 MATLAB/Simulink 仿真复现的从业者。2. 二阶迭代滑模面的构造与 Lyapunov 稳定性推导2.1 从航向偏差到滑模面为什么二阶形式更合适先定义航向偏差s1 ψ - ψd其中 ψ 为实际航向角ψd 为期望航向角。传统一阶滑模直接令s s1控制目标是让 s1 趋于零。问题在于 s1 的动态只包含航向角本身缺少对偏差变化率的约束收敛过程容易产生大超调切换项增益稍高就引起抖振。二阶迭代滑模面的常见构造方式为s2 s1_dot c * s1其中 c 为正常数s1_dot 是航向偏差变化率。这个式子有两层含义先让 s2 收敛到零再让 s1 沿一阶线性动态自然收敛。等效地控制任务从「镇定航向偏差」分解为「先镇定一个一阶滤波器再镇定航向偏差」。对 s2 求导得到s2_dot s1_ddot c * s1_dot船舶航向运动通常用一阶 Nomoto 模型近似资源中的sfun_ship5446.m实现的也是这类模型即T * ψ_ddot ψ_dot K * δ d(t)其中 T 为时间常数K 为舵效增益δ 为舵角指令d(t) 为外界干扰和模型不确定项。把 Nomoto 模型代入 s2_dot就能把控制量 δ 直接暴露出来这是后续设计控制律的基础。2.2 取 Lyapunov 函数推导渐近稳定条件取正定函数V 0.5 * s2^2对时间求导V_dot s2 * s2_dot要让系统渐近稳定需要保证 V_dot 负定。一个直接的做法是令 s2_dot 期指满足s2_dot -η * s2其中 η 为正常数这样 V_dot -η * s2^2 ≤ 0当且仅当 s2 0 时等号成立。由 LaSalle 不变集原理可知s2 渐近收敛到零随后 s1 沿 s1_dot -c * s1 收敛航向偏差最终趋于零。这里有个细节值得注意上述推导只证明了 s2 收敛真正保证航向收敛还依赖 c 的选择。c 太小航向偏差收敛慢c 太大等效地放大偏差变化率可能让初始舵角偏大。我一般把 c 放在 0.5 到 2 之间做初步调试再根据仿真曲线微调。将 s2_dot -η * s2 与 Nomoto 模型联立忽略干扰项 d(t) 后解出舵角得到的就是等效迭代滑模控制律的雏形。控制律中不含对不确定项和干扰项的显式补偿设计参数只有 c 和 η算法结构非常简洁。2.3 等效迭代滑模控制律的 MATLAB 实现资源中的sjwl_ctrl1.m实现了等效迭代滑模控制律核心逻辑如下。% sjwl_ctrl1.m 等效迭代滑模航向控制律求解 function delta sjwl_ctrl1(psi, psi_dot, psi_d, psi_dot_d, psi_ddot_d, T, K, c, eta) % 计算航向偏差及偏差变化率 s1 psi - psi_d; s1_dot psi_dot - psi_dot_d; % 二阶迭代滑模面 s2 s1_dot c * s1; % 由 s2_dot -eta * s2 反解舵角 % T * psi_ddot psi_dot K * delta psi_ddot_d psi_ddot_d; % 期望航向的二阶导数 s1_ddot psi_ddot - psi_ddot_d; % 其中 psi_ddot 由模型方程替换 psi_ddot (K * delta - psi_dot) / T; % 代入后求解 delta (T * (psi_ddot_d - c * s1_dot - eta * s2) psi_dot) / K; end代码的逻辑分三步。第一步由当前航向和期望航向算出 s1 与 s1_dot第二步组合出二阶滑模面 s2第三步把 s2_dot 的期望动态即-eta * s2代入模型方程反解出舵角。参数说明T 是船舶模型时间常数决定航向响应快慢大型商船通常在几十秒量级K 是舵效增益表示单位舵角产生的转艏角速度增量c 是滑模面系数影响偏差收敛速率eta 是滑模面趋近速率eta 越大滑模面收敛越快但舵角摆动也会更剧烈。在shipmodel5446.mdl中这个函数作为控制律模块嵌入 Simulink舵角输出直接送往船舶模型。3. 引入 RBF 神经网络的自适应迭代滑模控制律3.1 等效滑模解决不了的问题干扰和不确定项被忽略等效迭代滑模控制律推导时直接把干扰项 d(t) 丢掉了这在静水、模型参数准确的仿真里没有问题但在真实海况下会遇到两个障碍。第一模型不确定项和外部干扰会破坏 s2_dot -eta * s2 的成立条件滑模面无法严格收敛到零航向保持精度下降。第二为了对抗干扰工程师本能地加大 eta但这又放大了抖振。解决思路是分别处理这两类未知量用 RBF 神经网络逼近系统不确定项用自适应律估计外界干扰的界值。资源中neurocircle.mdl对应的就是这条技术路线。3.2 RBF 网络为什么要在这里使用RBF 神经网络是一种局部逼近网络隐藏层使用高斯径向基函数h_j exp(-||x - c_j||^2 / (2 * b_j^2))其中 x 为网络输入c_j 为第 j 个基函数中心b_j 为宽度。相比 BP 网络RBF 的局部特性让它更适合在线逼近变化较慢的模型不确定项训练速度快不容易出现全局权值耦合导致的震荡。在这套控制方案里网络的输入通常取航向偏差、偏差变化率、实际航向角速度等可测状态输出作为不确定项 f 的估计值。权值更新律由 Lyapunov 稳定性推导得出这样才能保证加入神经网络后整个闭环系统的稳定性分析不失效。3.3 神经网络自适应迭代滑模控制律的完整结构控制律由三部分组成等效项负责系统名义模型的动态调整神经网络项负责补偿不确定项鲁棒项用自适应干扰上界抵消外部扰动。具体实现代码如下。% 神经网络自适应迭代滑模控制核心更新律 function [delta, w_update, D_hat_update] neuro_ctrl(...) s2 s1_dot c * s1; % 二阶滑模面 % RBF 网络输出逼近系统不确定项 f(x) h exp(-sum((x - c_j).^2) ./ (2 * b_j^2)); f_hat w * h; % 自适应干扰上界估计 D_hat D_hat gamma * (abs(s2) - sigma * D_hat); % 期望滑模面动态s2_dot -eta * s2 - f_hat - D_hat * sign(s2) delta (T * (psi_ddot_d - c * s1_dot eta * s2 f_hat D_hat * sign(s2)) psi_dot) / K; % 权值更新律由 Lyapunov 推导保证系统稳定 w_update lambda_w * s2 * h; end这段代码的关键在权值更新律w_update lambda_w * s2 * h。它的含义是滑模面 s2 越大权值修正幅度越大h 是当前输入对应的基函数响应只有与当前输入临近的基函数参与权值更新这正是 RBF 局部逼近特性的体现。lambda_w 是学习率取值一般在 0.01 到 0.1 之间太大会导致权值发散太小则网络来不及跟踪不确定项变化。自适应干扰上界估计 D_hat 与常规观测器不同它不估计干扰的具体值只估计干扰的界。gamma 是自适应增益sigma 是泄漏项系数防止 D_hat 无限增长。这里的泄漏项很重要不加它D_hat 会在持续扰动下不断累积最终导致控制量饱和。与等效迭代滑模控制律相比自适应版本多出了五个可调参数网络中心 c_j、基函数宽度 b_j、权值学习率 lambda_w、自适应增益 gamma 和泄漏系数 sigma。参数越多意味着调参复杂度越高但换来的是对模型误差和海浪扰动的抵抗能力。我一般先把等效滑模调通再在此基础上逐个放开神经网络项和自适应项这样即使出现问题也容易定位是哪个环节引起的。两种控制律的设计参数和使用场合对比如下。控制方案设计参数抗扰能力计算复杂度适用场景等效迭代滑模c、eta弱低模型准确、海况平稳神经网络自适应迭代滑模c、eta、c_j、b_j、lambda_w、gamma、sigma强中模型不确定、海况复杂nn.m脚本的作用就是把这些网络参数初始化到基础工作区供neurocircle.mdl中的 S 函数模块读取。运行仿真前先执行nn.m再启动 Simulink 模型是这套资源的标准打开方式。4. Simulink 模型搭建与 S-Function 信号流配置4.1 模型文件与脚本文件的角色划分这套资源里的文件分工很明确。shipmodel5446.mdl是船舶运动学模型包含舵角输入到航向输出的完整 Simulink 模块neurocircle.mdl是带神经网络控制器的闭环仿真模型sfun_ship5446.m是配套的 S-Function 源文件由 mdl 模型调用nn.m负责初始化网络参数picture.m是仿真后的数据可视化脚本。打开模型之前先跑nn.m和各个控制律脚本把参数写入基础工作区S-Function 里通过assignin或直接读取工作区变量才能正常工作。4.2 S-Function 的输入输出与参数传递sfun_ship5446.m的标准写法是四个回调函数mdlInitializeSizes声明输入输出端口数量mdlDerivatives写船舶动力学微分方程mdlOutputs输出当前状态mdlTerminate做清理。舵角 delta 作为输入端口传入航向角 psi 和航向角速度 psi_dot 分别从选定的输出端口引出。这个结构决定了模型里各个模块的连接顺序。% sfun_ship5446.m S-Function 模型初始化 function [sys, x0, str, ts] sfun_ship5446(t, x, u, flag, T, K) switch flag case 0 % 初始化 sizes simsizes; sizes.NumContStates 2; % 状态为 psi 和 psi_dot sizes.NumDiscStates 0; sizes.NumOutputs 2; % 输出航向角与角速度 sizes.NumInputs 1; % 输入舵角 delta sizes.DirFeedthrough 0; sys simsizes(sizes); x0 [0; 0]; % 初始航向角与角速度 str []; ts [0 0]; % 连续系统 case 1 % 状态导数 psi x(1); psi_dot x(2); delta u(1); % 一阶 Nomoto 模型 psi_ddot (K * delta - psi_dot) / T; sys [psi_dot; psi_ddot]; case 3 % 输出 sys [x(1); x(2)]; case 9 % 结束 sys []; otherwise sys []; end end这段代码里Flag是 S-Function 的调度开关MATLAB 在每个仿真步长内依次调用不同分支。状态向量 x 保存 psi 和 psi_dot 两个连续状态形态上对应二阶微分方程。T 和 K 作为 S-Function 参数直接传入不用在多个文件里重复定义改模型参数时只需要修改 Mask 里的参数值。4.3 仿真参数设置与常见的调试排错仿真时长我建议先设 30 秒航向偏差设 10 度观察基本收敛过程后再延长到 100 秒测试航向保持能力。求解器用 ode45 变步长相对误差 1e-3最大步长限制在 0.01 秒防止滑模切换项被积分器跳过。神经网络模型里如果出现代数环报错多半是控制律模块直接读取了当前步长的输出需要在 S-Function 的 DirectFeedthrough 字段设为 1或者在信号路径上增加一个 memory 模块。仿真前做三件检查。第一确认 nn.m 或者初始化脚本已经执行工作区里有 c_j、b_j、w、gamma 等变量第二检查 mdl 模型的仿真步进参数是不是变步长固定步长下 S-Function 的连续状态更新容易触发零穿越警告第三看初始舵角是否超过模型允许的最大舵角限制如果初始舵角计算值超过 35 度系统会进入饱和非线性区控制器性能会明显下降。% 仿真启动前检查工作区变量是否存在 if ~exist(c_j, var) || ~exist(b_j, var) error(请先运行 nn.m 初始化 RBF 网络参数); end if ~exist(T, var) || ~exist(K, var) error(请先运行 sjwl_ctrl1.m 或等效初始化脚本设置船舶模型参数); end这段检查代码的价值在于把隐式的依赖关系显式化。每次打开新的 MATLAB 会话直接运行 Simulink 模型是最容易踩的坑因为模型里的 S-Function 在编译阶段就会尝试读取工作区变量一旦缺失就报 undefined variable 错误。把参数初始化脚本集中到一个入口或者放进模型 PreLoadFcn 回调函数里比手动逐个执行脚本可靠得多。4.4 模型文件中控制律模块的组织方式在neurocircle.mdl中我习惯把控制律模块单独封装成一个 Subsystem内部结构依次为信号准备层计算 s1、s1_dot、滑模面层组合 s2、控制量计算层输出 delta。每一层用注释标出对应的公式编号方便和论文里的公式对照。封装好的 Subsystem 输入端接入航向状态输出端直接连回船舶模型。仿真数据通过 To Workspace 模块存入sim_data结构体后续picture.m的画图脚本全部复用这同一个变量名避免在多个脚本间传参。模拟海况扰动时常见做法是在 S-Function 的状态导数方程里显式加上干扰项或者用 Simulink 的 Signal Builder 叠加舵角输入端。两种方式的效果差异在于加在状态方程内部会影响模型的稳定性分析加在输入端则更容易模拟外部风浪流的实际作用路径。资源里默认是在模型方程中处理干扰项与论文的 Lyapunov 分析保持一致。5. picture.m 绘图输出与航向保持效果的快速验证技巧仿真跑完不等于结果有效直接从 Scope 里截图没法量化控制精度。picture.m做的事就是把仿真数据变成可判读的曲线并给出几个关键指标的计算方法。先看画图前的数据整理。% picture.m 数据读出与性能指标计算 t sim_data.time; % 时间序列 psi sim_data.signals.values(:, 1); % 实际航向 psi_d sim_data.signals.values(:, 3); % 期望航向 delta sim_data.signals.values(:, 4); % 舵角 % 截取稳定段第 20 秒到仿真结束计算稳态误差 idx t 20; steady_error max(abs(psi(idx) - psi_d(idx))); % 计算航向超调量 overshoot max(psi - psi_d); % 计算舵角抖振幅度用相邻舵角差值的绝对值表示 delta_ripple mean(abs(diff(delta)));稳态误差反映控制器最终能把航向保持在什么精度水平超调量反映初始阶段的动态性能舵角抖振幅度是评价滑模控制实用性的核心指标。等效滑模的稳态误差通常大于神经网络自适应版本但舵角抖振幅度未必更大因为自适应版本的鲁棒项带有 sign(s2) 切换如果自适应增益 gamma 调得过大反而会在滑模面附近产生更明显的颤振。两个控制律对比验证时我一般把 psi、psi_d、delta 三个信号各画一张子图上下排列。第一眼先看航向曲线是否能在 5 秒内进入 2 度误差带第二眼看舵角曲线是否存在周期性高频摆动。如果舵角曲线出现接近正弦的高频分量优先减小 eta 或降低自适应增益 gamma而不是去改网络参数。一个常被忽略的检查点是滑模面 s2 本身的收敛轨迹。在模型里加一个输出端口直接引出 s2画出来之后拿它和理论预期的指数收敛做对比。如果 s2 在零点附近持续徘徊说明鲁棒项增益不足干扰上界估计偏小如果 s2 快速越过零点多处穿越说明切换增益偏大或者自适应律的 sigma 泄漏项设置过大。这套调整思路比单纯盯着航向曲线凭感觉调参更容易收敛到合理参数组合。最后提醒一点picture.m里如果绘制多条曲线记得在legend中标注控制律名称。等效迭代滑模和神经网络自适应迭代滑模的输出曲线在收敛速度上可能非常接近但舵角切换频率差异明显同一张图里不标注清楚后期做结果分析时很容易张冠李戴。本文还有配套的精品资源点击获取
返回列表