1. 课程导入与船舶航行控制仿真概览

船舶在海上航行时,真正需要“控制”的并不是螺旋桨转速或舵角本身,而是船舶的位置、艏向和速度相对于期望航线的偏差。把这一层关系想清楚,是理解整门课程的前提。本节先建立三个基本认识:船舶航行控制到底在解决什么问题,MATLAB/Simulink 在其中扮演什么角色,以及后续 30 节内容如何串成一条可执行的任务链。

一、船舶航行控制的核心问题

船舶是一个大惯性、慢响应、欠驱动的水面运动体。所谓欠驱动,指控制输入通常只有两个——主机推力(或转速)与舵角,而需要被控制的运动量却包括纵向速度、横向漂移、艏向角以及平面位置。以最常用的三自由度平面模型为例,状态量取为 [x, y, ψ, u, v, r],分别表示北向位置、东向位置、艏向角、纵向速度、横向速度和艏摇角速度;控制量为推力 T 与舵角 δ。这里必须约定坐标系:本文统一采用北-东-地坐标系描述位置,艏向角 ψ 以正北为 0、顺时针为正,舵角 δ 以右舵为正。后续所有公式、仿真与图示都沿用这一约定,切换参照系时会明确说明。

在这个约定下,航行控制的核心问题可以归纳为三类典型任务。第一类是航向保持与航向改变:给定目标艏向 ψ_d,通过舵角使 ψ 稳定跟踪,并抑制风浪引起的偏航扰动。第二类是航迹跟踪:给定一条期望航线(直线或曲线),要求船舶在有限时间内收敛到航线上,同时把横向偏差压到允许范围内。第三类是动力定位与低速操纵:在低速甚至零速条件下,依靠推力分配维持位置,此时横向力和艏摇力矩的耦合更加突出。

这三类任务的共同难点在于:船舶响应存在明显滞后,舵效与航速强相关,且横向运动不可直接驱动。举例来说,一艘长约 50 m 的船舶在 8 m/s 航速下,舵角阶跃 10° 后艏向角往往需要数十秒才进入稳态,若控制器增益取得过大,很容易出现周期性偏航振荡。因此控制设计的重点不是“让船立刻转过去”,而是“在滞后与欠驱动的约束下,设计出既稳定又不过度操舵的规律”。

二、MATLAB 仿真在控制设计中的作用

实船试验成本高、风险大,而纯理论推导又难以直观看到参数变化对动态过程的影响。MATLAB/Simulink 正好填补两者之间的空白,它在本课程中承担四项具体职能。

其一是被控对象建模。可以用 Nomoto 一阶或二阶模型快速描述艏向响应,也可以用完整的三自由度操纵性模型描述位置与速度耦合。前者适合航向控制的教学与参数整定,后者适合航迹跟踪与推力分配。其二是控制器实现。PID、前馈补偿、视线制导(LOS)、模型预测控制等都可以在 Simulink 中以模块或 MATLAB Function 的形式搭建,便于对比不同结构的控制效果。其三是扰动与工况注入。通过风、浪、流的等效力和力矩叠加到模型输入端,可以观察控制器在非理想条件下的鲁棒性。其四是结果分析。利用 Scope、To Workspace 与绘图脚本,可以定量读取超调量、调节时间、稳态横向偏差和操舵频次等指标。

需要强调的是,仿真结果的可信度取决于模型与参数的合理性。课程中给出的船舶参数(如船长、质量、附加质量、阻尼系数、舵效系数)均属于教学示例或合理假设,用于演示方法与趋势,不能直接等同于某条实船的实测数据。学习者应养成“先说明参数来源、再解读仿真曲线”的习惯。

船舶航行控制仿真:从对象到验证的任务链 ① 被控对象 三自由度船舶模型 状态 x,y,ψ,u,v,r ② 制导律 期望航线 → ψ_d LOS 视线法 ③ 控制器 PID / 前馈 / MPC 输出舵角 δ、推力 T ④ 扰动注入 风、浪、流 等效力与力矩 控制量作用于对象 ⑤ 仿真运行与数据记录 Scope 观察曲线 · To Workspace 保存时序数据 ⑥ 性能判读 超调量 · 调节时间 横向偏差 · 操舵频次 ⑦ 参数整定与迭代 调整增益 / 制导参数 回到 ③ 重新仿真 ⑧ 结论与交付 控制方案 + 仿真报告 可复现的脚本与模型

三、课程整体任务链与学习路径

上图把本课程的主线压缩成一条闭环:被控对象 → 制导律 → 控制器 → 扰动注入 → 仿真运行 → 性能判读 → 参数整定 → 结论交付。它不是一次性的线性流程,而是“设计—仿真—判读—再设计”的迭代回路。理解这条回路,比记住某个具体公式更重要,因为后续每一节都在强化其中某一环。

从学习路径看,课程大致分为四个阶段。第一阶段打基础:建立船舶运动数学模型,明确坐标系、状态量与操纵性参数的含义,并学会在 MATLAB 中写出可运行的三自由度仿真脚本。第二阶段做航向控制:从 Nomoto 模型出发,搭建 PID 航向保持回路,观察比例、积分、微分项对超调与稳态误差的影响,并引入积分限幅与舵速限制。第三阶段做航迹跟踪:引入 LOS 制导,把横向偏差转换为期望艏向,再与航向控制器级联,重点处理前视距离与收敛速度的矛盾。第四阶段做综合与进阶:加入风浪流扰动、推力分配、模型预测控制等内容,并对控制方案做对比评估。

为了让第一阶段就具备可操作性,下面给出一个最小可运行的航向仿真骨架,用于建立“模型—控制器—结果”的直观联系。示例参数为教学假设:船舶质量 m = 1.2e6 kg,舵效系数 K = 0.08 1/s,时间常数 T = 12 s,采用一阶 Nomoto 模型 T·ṙ + r = K·δ,初始艏向 0°,目标艏向 20°,舵角限幅 ±35°。

% 航向控制最小示例(教学假设参数)
T = 12; K = 0.08; dt = 0.1; tEnd = 300;
t = 0:dt:tEnd; n = numel(t);
psi = zeros(1,n); r = zeros(1,n); delta = zeros(1,n);
psi_d = deg2rad(20);
Kp = 1.2; Ki = 0.02; Kd = 0.8;   % 待整定的 PID 参数
eInt = 0; ePrev = 0;
for k = 2:n
    e = psi_d - psi(k-1);
    eInt = eInt + e*dt;
    dE = (e - ePrev)/dt; ePrev = e;
    u = Kp*e + Ki*eInt + Kd*dE;
    delta(k) = max(min(u, deg2rad(35)), -deg2rad(35));
    r(k) = r(k-1) + dt*(K*delta(k) - r(k-1))/T;
    psi(k) = psi(k-1) + dt*r(k);
end
plot(t, rad2deg(psi)); yline(20,'--'); grid on;
xlabel('时间 / s'); ylabel('艏向角 / deg');

运行后应重点观察三条信息:艏向角是否在合理时间内进入 20°±1° 的稳态带,过程中是否出现明显超调,以及舵角是否长时间贴住限幅。若超调过大,通常先减小 Kp 或增大 Kd;若稳态误差迟迟不消,则适当增大 Ki,但要防止积分饱和引起二次振荡。这一“看曲线—调参数—再看曲线”的过程,正是整门课程反复训练的核心动作。

建议在开始后续章节前,先在自己的 MATLAB 环境中跑通上面的脚本,并把 Kp 从 0.6 改到 2.0 观察曲线变化。亲手看到超调与振荡的出现,比记住结论更有助于理解后续的控制器设计方法。

最后需要建立一种工程心态:仿真不是“跑出漂亮曲线”就结束,而是要用可复现的模型、明确的参数来源和清晰的判读指标,支撑控制方案的选择。当你能说清楚“为什么选这组增益、它把哪个指标改善了多少、在什么扰动下会失效”,才算真正完成了从理论到仿真的闭环。