☰
神经网络观测器与递归滑模:全驱动船舶轨迹跟踪输出反馈控制解析
2026/10/19 12:24:52 网站建设 项目流程

做船舶控制这些年,我经常被问到一个问题:如果船模里的水动力系数根本测不准,船上又没有高精度的速度传感器,那全驱动轨迹跟踪是不是只能靠PID配重试?我的回答是,你完全可以走另一条路——用“基于神经网络观测器的全驱动船舶轨迹跟踪自适应递归滑模动态面输出反馈控制”这一整套框架,把看起来需要昂贵设备和高精度模型才能做的事,拆成一条工程上真正跑得通的路线。

这里面的关键词没有一个是白放的:神经网络观测器负责在只测位置和航向的前提下,把速度状态和模型误差一起在线估出来;自适应递归滑模负责在参数不确定、风浪干扰一直存在的情况下,把跟踪误差压到可接受范围;动态面控制负责解决反步法里最让人头疼的“微分爆炸”,让控制律不只停留在论文里,还能写进控制器里实时跑;而输出反馈这个前提,决定了整套方案不需要依赖高精度速度传感器,这对很多实际项目来说是致命的成本优势。

这篇内容适合谁?做船舶运动控制、动力定位、无人船开发的工程技术朋友,还有正在啃鲁棒控制和自适应控制的硕士博士。我会把模型怎么搭、观测器怎么用、控制律怎么设计、参数怎么调、仿真怎么测,以及我踩过的坑,一条条讲清楚。

1. 从“全驱动”说起:船舶运动模型和为什么不能只用简单PID?

1.1 全驱动船舶的3自由度动力学模型拆解

在海洋工程里,全驱动船舶指的是水平面三个自由度——纵荡、横荡、艏摇——都有主动执行器可以独立控制。船上有主推进器提供纵向推力,有侧推提供横向推力,再加上舵或者全回转推进器控制偏航,这样船才能实现任意方向平移和原地旋转。这个硬件前提非常关键,因为三个自由度都能直接施加控制力矩,我们才能奢侈地谈轨迹跟踪;要是欠驱动船,控制设计就完全是另一套打法了。

数学模型上,做轨迹跟踪一般用3自由度模型就够了,水平面运动用惯性坐标系下位置和艏向角描述,船体坐标系下速度用纵荡速度、横荡速度、艏摇角速度描述。运动学关系写成:

η̇ = R(ψ)ν

这里的R是从船体坐标系到惯性坐标系的旋转矩阵,只跟艏摇角有关,写开就是:

R(ψ) = [cosψ, -sinψ, 0; sinψ, cosψ, 0; 0, 0, 1]

动力学方程用经典的刚体加水动力模型:

Mν̇ + C(ν)ν + D(ν)ν + g(η) = τ + τ_d

M是惯性矩阵,包含刚体惯量和附加质量项,一般近似对称正定;C(ν)是科氏力和向心力矩阵,跟速度有关;D(ν)是阻尼矩阵,包含线性项和非线性项;g(η)是回复力力矩,在水平面如果只做轨迹跟踪通常可以忽略;τ是控制输入,τ_d是环境干扰,包括风浪流的作用。

我第一次做这个仿真的时候,还犯过一个很低级的错误:直接把论文里的参数搬进Simulink,结果系统刚启动就发散。查了半天发现是附加质量系数符号取反了,M矩阵不再正定。后来我给自己定了个规矩,模型矩阵必须先单独验证再进控制回路。C矩阵还应该满足反对称性,这些数学性质不是摆设,它们直接影响系统能量特性和稳定性分析,更直接影响仿真是跑得稳还是跑两秒就飞。

1.2 轨迹跟踪和动力定位的区别,以及为什么要输出反馈

动力定位的传统任务是把船稳在一个固定位置和艏向,强调的是对抗干扰、保持位置,参考轨迹基本是常值;而轨迹跟踪要求船跟随一条随时间和空间变化的路径,比如从A点按指定速度曲线开到B点,中间还有转向操作,这对控制器的动态性能要求高一个量级。轨迹跟踪的误差不只是位置偏差,还有速度偏差,甚至需要预判参考轨迹的曲率和加速度变化。

那为什么要强调输出反馈?这是工程现实决定的。大型船只可能装备完善的姿态传感器、声学多普勒测速仪,能拿到比较可靠的速度信息;但很多实际项目,特别是无人船、小型作业船,速度传感器要么没装,要么噪声大到没法直接用。我自己见过不少团队在仿真里假设全状态可测,控制律设计得很漂亮,一到湖试发现横荡速度和艏摇角速度根本没有可用的直接测量信号,整个算法当场瘫痪。与其花大价钱补传感器,不如换一个思路:既然位置和艏向可以测得很准,那就把速度和模型不确定性全部丢给观测器去在线估计,这就是输出反馈控制的核心动机。

这种设计选择对成本和可靠性影响是决定性的。输出反馈框架下,硬件需求降到了“位置航向传感器+执行器”这个最基本组合,系统越简单,故障点越少,海上长期运行的可靠性越高。从项目角度说,这通常意味着省掉一大笔设备预算和安装调试时间,对预算敏感的项目来说价值极大。

2. 为什么是“神经网络观测器”?把传感器的钱省下来

2.1 动力学模型的破绽:参数不确定性和海况干扰

理想模型写得再漂亮,拿到实际海上工况里就会被现实打脸。附加质量系数、阻尼系数、惯性参数,每一类都很难精确获取。一条船在不同吃水、不同航速、不同海况下,这些参数动辄变化百分之二三十。再加上浪和流带来的环境干扰,完全没法预先建模。你如果用一个固定参数的模型去做控制器设计,那模型误差部分会被控制器当成扰动来处理,到底压不压得住,全看控制器鲁棒性有多强。

传统的状态观测器,像大家常用的扩展卡尔曼滤波或龙伯格观测器,在处理噪声模型可信的情况下表现不错;但海况一变,过程噪声和量测噪声的统计特性全变了,滤波器性能会明显恶化。更麻烦的是,这类观测器只做状态估计,它不关心模型不确定性的补偿。也就是说,状态估出来是估出来了,但模型里那些“不知道”的部分依然存在,控制器留着一个很大的未知项需要硬扛。

神经网络观测器的意义就在这里。它不是在传统观测器旁边加一个神经网络做装饰,而是把“状态估计”和“不确定性逼近”这两个问题放进一个框架里同时解决。神经网络是一个在线逼近器,它不断根据输出去修正自己对未知动态的估计,这样观测器输出的不只是速度估计,还带着对模型误差和环境干扰的估计值,控制器可以把这部分直接用来补偿。

2.2 神经网络观测器的角色:既是状态观测器又是未知干扰逼近器

我仿真里一般用RBF神经网络,也就是径向基函数网络。它的数学基础很简单也很稳:任何足够光滑的非线性函数,在一个有界区域内,都可以用一组基函数的加权组合来逼近,写成:

f(x) = W*T h(x) + ε(x)

W* 是理想权重,h(x) 是高斯径向基函数,ε 是逼近误差,工程上通常可以被一个未知上界约束住。在观测器里,这个网络做的事情就是:接收可测输出(位置和艏向)的残差信号,在线更新权重,同时输出未测速度的估计和无模型不确定性的估计。

把分工说透一点。观测器本身解决“状态不可测”的问题,神经网络解决“模型不精确”的问题。二者配合,控制器拿到的信号质量约等于一个精确模型加全状态反馈的理想情况,但硬件成本只是传感器加处理器,这种省钱的方案在工程上实在太有吸引力了。

这里有一个实操细节,我用了很久才总结出来:观测器里的神经网络输入,不推荐只放位置误差。最好是位置误差和位置误差变化率都放进去。理由很直接,船舶系统的主导动态在速度层,神经网络需要足够丰富的输入信息才能把未测速度估计到位。如果只给位置误差做输入,网络学习速度会非常慢,观测器收敛慢,控制器自然跟着遭殃。动态性能上不去,很多人以为是控制器参数问题,实际是观测器输入设计的锅。

3. 核心控制算法拆解:递归滑模加动态面到底在解决什么?

3.1 先从滑模说起:为什么是“递归”滑模?

滑模控制的经典思路是用误差构造一个滑模面,把系统的行为引导到滑模面上,然后让等效控制和切换控制把误差压在这个面上。经典滑模面一般写成:

s = ė + λe

一旦系统进入滑模面,误差按指数收敛,而且对匹配扰动表现出不敏感性,这是滑模控制最大的优点。但代价也很实在:切换控制增益不能太小,太小了抗不住未知扰动;增益太大,控制量高频抖振,执行器剧烈频繁动作,看起来像有人在船上疯狂打舵,实际是控制律高频切换造成的。抖振不但损耗设备,还会激发未建模高频动态,反而把系统搞坏。

递归滑模的结构比经典滑模高一层。它不是在单层误差面上做文章,而是把前面设计出来的滑模变量继续向后面递归,形成嵌套的滑模结构。每一层都在分流一部分不确定性压力,系统对未建模动态的鲁棒性会更强,同时允许滑模增益选得比经典滑模温和一些,抖振问题就会减轻。

用生活化一点的类比:经典滑模像一扇沉重的防火门,靠蛮力把火拦在外面;递归滑模像走廊里层层设防的多道门,每一层都分担压力,关起来既轻松又可靠。实际调参的时候,递归滑模确实比经典滑模更容易在收敛速度和鲁棒性之间找到平衡点,这也是我做过一次对比之后再也不想退回普通滑模的原因。

3.2 “动态面”的妙处:解决“微分爆炸”这个工程拦路虎

反步法在自适应控制圈子里几乎算是标配,步骤是逐层设虚拟控制,把系统拆成一阶一阶处理。但它有一个公认的痛点:每一步要求对虚拟控制量求导,而虚拟控制本来就包含多项状态和参数,求导一次公式长度翻倍,继续下一层又是一次更恐怖的展开,这就是“微分爆炸”。论文里一个控制器光公式能写两页A4纸,仿真里勉强能忍,到了嵌入式实时环境根本跑不完,每一控制周期那点时间全拿去算导数展开式了。

动态面控制(DSC)是对这个问题的聪明修法。它的做法是:不再对虚拟控制直接求解析导,而是让虚拟控制先通过一个一阶惯性滤波器,得到滤波后的虚拟控制及其导数。控制器拿到的导数是滤波器算出来的,表达式复杂度大幅降低,代码量和出错率同时下降。而且滤波过程本身对虚拟控制有平滑作用,高频噪声不太容易灌进控制律里,控制量会干净不少。

动态面控制引入了一个新的可调参数,就是一阶滤波器的时间常数T_f。这个参数非常值得花时间调:太大,滤波平滑但系统响应滞后,船追参考轨迹时一直慢半拍;太小,滤波作用消失,微分爆炸和噪声问题又回来了。工程上一般从0.05秒附近起步,根据仿真响应情况逐步调整。我用下来的经验是,把T_f设计在控制器带宽对应的频率范围内,系统既快又稳,调参目标的优先级应该是先保证稳定,再追求快速。

3.3 自适应机制:在船上实时适应环境变化

自适应三个字放在标题里不是装饰。船舶水动力参数时变、海况变化无常,固定增益的控制方案很难同时满足起步阶段和稳态阶段的性能需求。自适应机制在这里做的事情主要有两件。

第一,对控制律中的神经网络权重进行在线更新。模型逼近器不能静态固定,它要随着工况变化不停修正,让补偿效果始终贴近当前的真实动态。第二,对滑模切换增益做自适应整定。误差大的时候需要足够强的鲁棒项来压制干扰,误差收敛后就应该放掉增益,别让系统为了“不必要的强壮”付出持续抖振的代价。这种增益调度如果做成真自适应,比定时切换要顺滑得多,系统响应也更平稳。

实测下来,自适应增益的调节要克制。神经网络的学习率设得过高,权重会在几个控制周期内剧烈跳动,控制量出现毛刺,船在参考轨迹附近高频抖动;设得过低,适应速度太慢,工况突变时系统半天反应不过来。我一般从0.001左右起步,一边跑仿真一边观察跟踪残差和权重范数的变化,等系统平稳了再逐步调大。整个调参过程很像烧菜,火候太小菜不熟,火候太大直接糊锅,中间那个度得自己一点点试出来。

4. 系统集成:控制律是如何一步步被设计出来的?

4.1 从误差面到控制输入的通用设计步骤

整套控制律设计可以拆成清晰可执行的步骤。第一步定义位置跟踪误差:

e1 = η - η_d

η_d是参考轨迹,这一步很直观,就是要让船的位置航向往参考上靠。第二步定义虚拟速度误差:

e2 = ν - α_f

这个α_f是对虚拟控制率做动态面滤波后的输出,它代替了反步法里需要对虚拟控制求解析导的环节。虚拟控制率取经典的:

α = -k1 e1 + η̇_d

这里k1是位置误差增益,决定船往参考轨迹靠近的力度。α经过动态面滤波得到α_f,它的导数也回来了。第三步,把速度误差和动力学方程连起来构造控制律。控制输入的最终形式是三项之和:反馈线性化项用于抵消已知的动力学部分;神经网络观测器的输出用于补偿模型不确定性和环境干扰的估计;递归滑模面驱动的鲁棒项用于保证系统在未知干扰下的最终抑制能力。

每一项都有明确的工程含义,调试的时候可以分别看它们的贡献。如果神经网络残差一直很大,说明网络逼近能力不够,或者中心点覆盖范围有问题;如果鲁棒项输出一直很大,说明干扰比预期强或者自适应增益不够;如果反馈线性化项占了绝大部分控制量,说明模型质量还可以,控制器主要工作在“模型已知”的状态。这样拆着看,问题定位要容易得多。

4.2 系统的稳定性论证:为什么这套结构安全?

控制理论里的李雅普诺夫稳定性分析很多工程朋友会跳过,但我觉得这个环节恰恰是保证你在调参时不翻车的重要依据。整体李雅普诺夫函数通常拆成三块:位置跟踪误差项、速度误差项(含滤波后的虚拟控制误差)、神经网络权重误差项。对时间求导并代入控制律和更新律之后,经过整理可以得到类似:

V̇ ≤ -cV + C

这里c是正数决定收敛速度,C是一个有界常数,由神经网络逼近误差上界和环境干扰幅值决定。这个不等式传达了两个关键信息:第一,系统的收敛速度由c决定,c越大收敛越快;第二,系统不是一致收敛到零,而是收敛到一个有界邻域内,最终跟踪误差的大小由逼近误差和干扰上界决定。这意味着工程实现中稳态跟踪误差不会为零,但只要参数选得合理,稳态误差可以被压到很小。

这个理论结论还给了调参一个方向性指引。如果仿真里稳态误差一直偏高,我会先检查神经网络逼近误差上界是不是被低估了,或者网络中心点覆盖范围不够,而不是盲目抬高滑模切换增益。抬高切换增益确实能压稳态误差,但抖振会跟着来,代价太大。先解决模型逼近能力,再谈鲁棒增益,这个顺序很重要。

4.3 调参顺序和参数选择的原则

这套系统的参数确实不少,但调参顺序有规律可循,不用乱试。

先调动态面滤波器时间常数T_f,它决定虚拟控制的平滑程度,一般从0.01到0.1之间试,我习惯从0.05起步,等系统稳定下来再逐步减小。然后调位置误差增益k1和速度误差增益k2,k1决定位置跟踪响应速度,k2决定速度偏差的惩罚力度,一般k1从0.5到2起步,k2从2到5起步,避免一上来就给高增益把系统顶爆。第三步调递归滑模的增益和切换增益,先设小增益验证收敛,再逐步提升鲁棒性。最后调神经网络学习率和观测器增益。

这里有个很重要的时间尺度原则:观测器的收敛速度应该比控制器快一个数量级。如果观测和控制的动态时间尺度接近,控制律拿到的状态估计会明显滞后,整个系统像个反应迟钝的人,怎么调都别扭。我做观测器增益整定时,会先单独测观测器的估计误差收敛曲线,确保观测器能在控制器完成一轮动作之前把状态估准,再联调整个闭环。

下面是我做过很多次仿真后沉淀下来的一套初始参数参考表,不同船型需要按比例缩放:

参数初始值调试范围
动态面滤波时间常数 T_f0.05 s0.01~0.1
位置误差增益 k11.00.5~2.0
速度误差增益 k23.02.0~8.0
递归滑模增益 λ2.01.0~5.0
神经网络学习率 γ0.0010.0001~0.01
观测器增益 L5.02.0~10.0

这套参数不是死规矩,但它是一个很好的起点,让你不用从零开始盲调。每次调整只动一个参数,观察它对系统的影响,这个习惯能让调参效率提高很多。

5. 实操:在Matlab/Simulink中完完整整复现这套系统

5.1 船舶参数和基础模型搭建

仿真第一步是把船模建对。拿一艘中型无人船作为例子,船长大概40米,排水量450吨。我会把惯量和阻尼系数写在初始化脚本里,方便统一修改。

建模时有三个原则必须守住:M矩阵对称正定,C矩阵满足反对称性,阻尼系数用线性加非线性的组合。Matlab代码大致长这样:

m = 450e3; % 质量,单位kg I_z = 15e6; % 艏摇转动惯量 X_u = -70e3; % 纵荡附加质量 Y_v = -100e3; % 横荡附加质量 N_r = -120e6; % 艏摇附加转动惯量 M = diag([m - X_u, m - Y_v, I_z - N_r]); % 惯性矩阵 % 用assert检查正定性 assert(all(eig(M) > 0), 'M矩阵必须正定');

这个assert检查帮我在建模阶段就拦住了一大批低级错误,强烈建议你们也加上。动力学的Simulink模型里,我用S-Function或者MATLAB Function模块来写核心方程:

function [eta_dot, nu_dot] = shipDynamics(eta, nu, tau, disturbance) % 旋转矩阵 psi = eta(3); R = [cos(psi), -sin(psi), 0; sin(psi), cos(psi), 0; 0, 0, 1]; % 动力学 nu_dot = M \ (tau - C(nu)*nu - D(nu)*nu + disturbance); eta_dot = R * nu; end

这里的C和D矩阵要根据你选的船模参数来写,不要用统一的简化版本,否则耦合特性会丢。我见过很多人图省事把C矩阵设成对角,结果仿真出来的横荡响应完全对不上实际运动规律,控制器设计再完美也没用。

5.2 神经网络观测器的Simulink搭建

观测器子系统是整个框架里信息流动的中枢。输入是可测的η,也就是位置和艏向,输出是ν的估计值nu_hat和不确定性总和的估计f_hat。

内部实现分几块:积分器对nu_hat_dot积分得到nu_hat,再通过运动学方程对eta_hat积分,构造观测残差;网络权重由一个MATLAB Function块在线更新,输入是观测残差和网络基函数向量。基函数中心点的选择直接影响逼近效果,我会把状态空间的工作区域覆盖住,中心点数量控制在20到50之间。数量太少逼近精度不够,稳态误差压不下去;数量太多计算量上来,实时性受到挑战。这个数量选择跟你的计算平台性能直接相关,跑强实时系统时可以少一些,做离线仿真可以多一些。

权重更新律的实现有一个安全红线:只能使用可测输出和观测器估计值,绝对不能让真实的未测量速度直接进入更新律。否则整个输出反馈的前提就被破坏了,系统在理论上就不闭环。仿真里看不出来问题,到实物上才暴露,那时候排查成本就高了。

5.3 参考轨迹设计和仿真结果解读

轨迹跟踪仿真别用一条直线从头走到尾,那样太简单,很多问题测不出来。我一般生成一条带变速和转向的参考轨迹,比如先直行加速,再转一个大弯,接着反向转向,最后减速靠泊。这样控制律需要同时响应位置跟踪和艏向变化,抗干扰性和动态性能都能被充分考验。

仿真结束以后,重点看三个信号。第一个是位置跟踪误差曲线,看收敛速度和稳态误差,误差稳定在一个有界范围内说明整体结构是成立的。第二个是速度估计误差曲线,重点观察它的时间尺度是否和位置误差匹配,如果速度估计一直存在明显的稳态偏差,多半是观测器增益不够或者神经网络输入选择有问题,这时候该回看观测器而不是动控制器。第三个是控制输入曲线,关注的点不是幅值大小,而是有没有高频抖振。看到抖振,先别急着动滑模增益,可以试着把动态面滤波器时间常数调大一点点,很多抖振问题这样处理反而更有效。

我实测下来,这套系统对百分之十量级的水动力参数摄动和幅值较大的持续风浪干扰,能比较稳地收敛到参考轨迹附近。相比不带观测器、不带自适应的控制方案,最明显的提升在瞬态阶段——起步超调量小很多,稳态震荡幅度也明显降低,整体运动轨迹平滑得多。

6. 常见问题与排查技巧实录

6.1 常见问题速查表

现象可能原因处理建议
控制量持续高频抖振滑模切换增益过高,或滤波时间常数太小先降低切换增益,再看动态面滤波器时间常数
速度估计有明显稳态偏差观测器增益过小,或网络中心点覆盖不足调大观测器增益,检查基函数中心分布
轨迹跟踪大超调k1或k2过高回退增益,先把滤波器时间常数和基础收敛稳住
系统启动即发散M矩阵非正定或C矩阵错误检查模型矩阵符号和结构,跑assert检查
神经网络权重异常增长学习率过高,或输入信号未归一化降低学习率,对观测器输入做归一化处理

这个表是我实践中反复用过的一张“现场速查表”。找问题的时候,我强烈建议一次只改一个参数,改完跑一遍完整仿真看三条曲线,别同时动三四个参数,否则出了问题你都说不清是哪个改动引起的。这套方法论听起来很简单,但真的能让你少走很多弯路。

6.2 独家避坑技巧

做这套系统,踩过的坑比论文里能看到的细节多得多,我挑几个最有价值的分享出来。

第一,神经网络输出一定要加限幅。稳定性证明可以保证理论上的有界性,但实际数值积分过程中,权重仍然可能在极端工况下被推到非常大的值,控制量瞬间冲爆,执行器直接饱和。我在神经网络输出端加一个饱和模块,把每次输出限制在预设范围内,整个系统的工程鲁棒性立刻提升了一大截。这个操作理论书上不会告诉你,但实战里几乎每次都救场。

第二,动态面滤波器的初始值必须和虚拟控制的初始值保持一致。如果两者初始化不一致,仿真一开始就有一个很大的瞬态误差,系统需要花很长时间把这个初始误差消化掉,看起来就像控制器性能极差。很多人还没跑到稳定就以为是参数问题,半天找不到根因,其实只是初始化错了一个值。这个细节值得刻在工位上。

第三,参考轨迹的加速度不能设计得太离谱。很多仿真里用户给了一条角度突变很大的路径,参考加速度瞬间极大,控制器为了追赶参考会输出一个很大的力矩,动态性能全被毁掉。我会在轨迹规划层做预处理,用S型速度规划或者对参考轨迹做低通滤波,把加速度约束在合理范围内,再把平滑后的轨迹交给控制器。控制器的任务才是跟踪,轨迹规划的任务是给出可跟踪的参考,两层职责要分开。

第四,权重更新律里决不能混入未测量状态的原始信号。哪怕你仿真里能拿到真实速度,也要刻意用观测器估计值代替,保证整条回路的自洽性。这既是为了理论上闭环成立,更是在为将来移植到实物平台做准备。仿真里可以作弊,实物上没有作弊选项。

第五,如果控制效果一直达不到预期,优先怀疑观测器。我见过太多团队把大量时间花在调控制器参数上,最后发现问题的根源是观测器的速度估计有滞后,控制律拿到的状态信息本身不准确。先确保观测器估计误差曲线收敛又快又准,再去动控制器参数,调参会顺畅很多。

给参数初值的时候别太贪。很多人一开始就把k1和k2设得很大,觉得响应快就是好,结果系统震荡甚至发散,然后又拼命加大阻尼,来回折腾。我的习惯是从小增益起步,让系统先稳稳跟上参考,再慢慢增加增益提升动态性能。稳字当头,快是后话。系统的瞬态响应质量比峰值响应速度重要得多,因为在真实海上工况里,超调可能意味着碰撞,震荡可能意味着设备损坏,这些代价都承受不起。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询