水面无人艇轨迹跟踪:从系统建模到PID控制的工程实践
2026/8/29 3:42:31 网站建设 项目流程

简介:在无人系统控制领域,PID控制因其结构简单、工程易用而成为最常见的算法之一。但面对水面无人艇这类工作在非线性、时变水动力环境中的被控对象,仅靠盲目试凑PID参数往往难以获得理想的轨迹跟踪效果。实现精准控制的关键,在于首先建立准确的系统模型,通过台架实验、CFD计算与系统辨识等途径获取惯性矩阵、附加质量、阻尼系数等关键参数,并完成模型验证;在此基础上,再结合LOS导引律与串级PID结构,设计出能够应对航行耦合、传感器噪声、执行机构延迟等工程问题的控制器。从仿真验证到实艇调试,该方法在静水工况下可将横向跟踪误差控制在分米级,在中等风浪下也能保持米级精度,为航道巡检、水文采样等水面无人艇应用提供了高性价比的解决方案。本文沿着“建模→验证→控制器设计→实艇调试”的完整链路,系统阐述了PID控制在USV轨迹跟踪中的落地方法与工程细节。

1. 湖试第二圈才暴露的问题:为什么只谈PID不够

水面无人艇(USV,Unmanned Surface Vehicle)的轨迹跟踪,看上去是一个非常标准的控制问题:给定一条期望路径,设计控制器让艇走好。很多人第一反应就是上PID,毕竟PID三个字母在工业控制里就是万金油。我在最早接触这个项目时也抱着同样的想法——先建个模型,再调个PID,轨迹跟踪不就水到渠成了吗?但真正下水试航,湖试第二圈就让我意识到,问题远没有这么简单。

先说一个当时最直观的困惑:USV在直线航行时,航向控制得很好,但一旦切换到转弯阶段,艇的实际轨迹会明显偏离期望轨迹。弯道里出现“外飘”,也就是转弯半径比期望的大,再叠加风浪的作用,偏差进一步扩大。当时我下意识认为是PID参数不匹配,于是把比例系数调大、微分系数调大,反复试了几组参数,结果却是直线段开始抖动,弯道段依然超调。这个现象让我意识到,问题很可能不在参数本身,而在控制对象模型的精度上。

说白了,PID控制器是一种“只知其然、不知其所以然”的控制器。它根据当前误差、误差积分和误差变化率来调整输出,但它并不真正了解被控对象的动力学特性。同一个PID参数,换一条不同水线长度、不同排水量的船,控制效果可能完全两样。水面无人艇工作在非线性、时变的水动力环境中,船速、航向角、风浪流等都会影响动态特性。如果不对系统进行建模,不把模型参数辨识清楚,PID就只能靠盲目试凑,而试凑出来的参数往往只在一个工况下有效。

这个项目的完整路径应当是:系统建模 → 模型验证 → 控制器设计 → 仿真调参 → 实艇验证。也就是说,系统建模是地基,轨迹跟踪是目标,PID控制是手段。三者并不是三个并列模块,而是一条链路上的不同环节。接下来我会按这条链路,把每一步的做法、参数获取方法、仿真与实测中的关键问题完整写出来,希望能让准备入坑USV轨迹跟踪的同行少走弯路。

适合读这篇文章的读者,一个是刚开始接触USV算法的学生或工程师,另一个是已经能跑通基础PID、但困惑于“为什么我的船总是跑不直”的调试者。文章不回避数学公式,但重心还是在工程落地上。

2. 先从运动学和动力学说起:USV模型到底在描述什么

2.1 坐标系与自由度:6自由度还是3自由度

水面无人艇的完整运动状态,严格来说属于6自由度刚体运动:纵荡(surge)、横荡(sway)、垂荡(heave)、横摇(roll)、纵摇(pitch)、艏摇(yaw)。但绝大多数USV轨迹跟踪控制研究,都会把模型降为三自由度,即只考虑纵荡、横荡和艏摇。原因很直接:USV在水平面内运动,垂荡、横摇、纵摇在无浪或小浪条件下对轨迹影响较小,而且大部分USV采用双体或深V船型,本身具备较好的复原性。把模型降为三自由度,能大幅降低控制器设计的复杂度,又保留了轨迹跟踪所需的核心动态信息。

三自由度模型需要两套坐标系来描述。第一套是固定坐标系(大地坐标系),通常取地球表面某一点为原点,X轴指向正北,Y轴指向正东,这个坐标系下我们定义USV的位置(x, y)和航向角ψ。第二套是随体坐标系(船体坐标系),原点取在USV重心或漂心,X轴指向船艏,Y轴指向右舷,这个坐标系下我们定义速度分量(u, v, w)和角速度r(艏摇角速度)。注意,这里的u是纵荡速度(前进方向),v是横荡速度(侧向),两者合成了USV实际的对地速度矢量。

两套坐标系之间的转换,是建模的第一个关键环节。设η = [x, y, ψ]^T 为大地坐标系下的位姿矢量,ν = [u, v, r]^T 为随体坐标系下的速度矢量,则运动学方程写作:

η_dot = R(ψ) · ν

其中R(ψ)是旋转矩阵,具体展开形式为:

x_dot = u·cos(ψ) − v·sin(ψ) y_dot = u·sin(ψ) + v·cos(ψ) ψ_dot = r

这个式子不复杂,但它的含义很重要:USV对地速度的方向,并不是简单地等于船艏指向。当存在横荡速度v时,实际速度矢量与船艏方向之间存在一个夹角,这个夹角叫漂角(side-slip angle)。在转弯或者受风浪干扰时,漂角会显著增大,如果控制策略忽视了漂角,直接把期望速度方向等同于期望航向角,轨迹跟踪误差就会显现出来。这是后文设计控制器时的一个关键前提。

2.2 刚体动力学与科里奥利力项:为什么线性模型会失效

运动学方程只回答了“位置和姿态怎么变化”,但没有回答“力和力矩如何产生运动”。后者的核心就是动力学方程。在船舶控制领域,常用的三自由度动力学方程有两种写法:一种是从牛顿-欧拉方程展开的完整形式,另一种是经过线性化处理后的简化形式。我实际项目里用的是前者,因为它对机动工况(大角度转弯、加减速)的描述更准确。

完整形式如下:

M·ν_dot + C(ν)·ν + D(ν)·ν = τ + τ_env

其中:

  • M是惯性矩阵(含附加质量),因为是刚体惯性和流体附加惯性之和;
  • C(ν)是科里奥利力与向心力矩阵,它由M中的非对角项和速度耦合项组成;
  • D(ν)是阻尼矩阵,包含线性阻尼和非线性阻尼(如二次阻尼项);
  • τ是执行机构(推进器和舵)产生的控制力与力矩;
  • τ_env是环境干扰(风、浪、流)等效的力与力矩。

很多人第一次看到科里奥利力矩阵会一头雾水,觉得USV速度又不快,科里奥利力能有多大?但事实上它并非地球自转产生的科里奥利力,而是由于船体在旋转坐标系中运动而产生的一种惯性耦合项。简单类比:你坐在旋转的转盘上,用手往转盘中心推一个球,球并不会走直线,而是会向一侧偏转。水面无人艇在转弯时,纵荡和横荡速度会通过C(ν)矩阵相互耦合,表现为“一转舵,船体既有横荡又有艏摇”,两者并不是独立的。这种耦合效应在高速USV上尤其明显。

所以,如果把系统简化为多个独立的单输入单输出(SISO)通道,用三个相互独立的PID分别控制纵向速度、横向位移和航向角,在机动工况下会遭遇严重的耦合问题。这不是说PID不能用于这个场景,而是说我们在设计控制器时,必须了解耦合的存在,通过合理的解耦策略或补偿项来减弱其影响。最实用的做法是:先通过系统辨识或CFD计算,把M、C(ν)、D(ν)中的关键参数拿到,在仿真里就能清楚地看到耦合强度,从而在控制器结构上做针对性的补偿,而不是“凭感觉调参数”。

2.3 阻尼项与执行机构模型:不能忽略的非线性

阻尼矩阵D(ν)是非线性模型的另一大头。船舶在水中运动受到的阻尼,通常包含线性部分与非线性部分:

D(ν) = D_lin + D_nonlin(|ν|)

其中线性阻尼主要是摩擦阻力,与速度成正比;非线性阻尼主要是兴波阻力和涡流阻力,与速度的平方相关。对于USV这种小排水量、高航速比(弗劳德数较大)的艇型,非线性阻尼占比相当大。如果只用线性阻尼建模,会导致模型在中高速段严重失配——仿真里明明能稳定跟踪,实艇跑起来却发现推力输出不足,无法达到期望速度。

执行机构同样不能过度简化。多数USV采用“双推进器+差速转向”或“单推进器+舵”两种方案。差速转向方案的输入是左右推进器推力(T_L, T_R),总推力与转艏力矩由两者组合得到;单舵方案的输入是推力T和舵角δ,转艏力矩则通过舵产生的横荡力间接实现。无论哪种方案,执行机构都存在两个不容忽视的特性:饱和特性和响应延迟。饱和是指推力和舵角有物理上限;响应延迟是指推进器和舵机从收到指令到实际执行到位之间存在时间滞后。这两个特性如果不建进模型,仿真里PID调得再漂亮,上了实艇都可能出现振荡甚至发散。

我在项目中实际采用的是差速双推进器方案,模型里给两个推进器分别加了如下环节:

n_pwm → (推进器响应一阶惯性环节) → 推力T → 合成为u方向推力与r方向力矩

一阶惯性环节的时间常数通过静态推力台架实验测得,大约在0.3~0.5秒之间。这个看似不起眼的延迟,对PID参数上限的影响极大。我后面会详细展开这部分。

3. 模型参数的获取:台架实验、CFD与系统辨识三管齐下

3.1 为什么不能直接抄论文里的参数

很多人建模时喜欢直接引用文献里的水动力系数,觉得那些数据“看起来差不多”。这种做法的风险非常大。文献里的模型对应的是特定的船型、尺度、吃水和速度范围,换了艇,所有系数几乎都要重来。哪怕船型相似,附加质量系数和阻尼系数也会因布置重量分布不同而相差甚远。真实项目中,模型参数必须结合自身艇体的实测数据来获取。

我当时的做法是“三管齐下”:一是台架实验测执行机构特性;二是基于艇体几何参数做简化CFD计算,得到惯性类系数和阻尼类系数的初值;三是通过湖试数据做系统辨识,对几个关键参数进行修正。三条路径各有侧重,互相验证。

3.2 惯性矩阵与附加质量:CFD估算与经验公式的搭配

惯性矩阵M写出来是:

M = [m − X_u_dot, 0, 0; 0, m − Y_v_dot, mx_G − Y_r_dot; 0, mx_G − N_v_dot, I_z − N_r_dot]

其中m是艇体质量,I_z是绕z轴的转动惯量,x_G是重心在随体坐标系中的x坐标,X_u_dot、Y_v_dot、Y_r_dot、N_v_dot、N_r_dot是附加质量系数。附加质量的物理含义比较抽象,可以这样理解:船在水中加速时,不仅要推动自身质量,还要推动周围一部分水体一起加速,这部分“虚拟附加”的质量就是附加质量。它的数值可以达到自身质量的百分之几到几十,对USV的动态响应有显著影响。

附加质量系数最精确的来源是CFD计算,但对于做控制的团队来说,CFD建模周期长,计算成本也高。我采用的是半经验方法:先用细长体理论估算初值,再用湖试中的阶跃响应数据修正。具体来说,纵荡方向附加质量X_u_dot用细长体近似公式计算,横荡和艏摇交叉项则根据艇体长宽比查经验图表得到初值。这样得到的参数精度足够用于控制器设计,后续用辨识数据修正即可。

3.3 阻尼系数的实验辨识:用自由衰减试验

阻尼系数的获取方法有很多,我强烈推荐一个简单又有效的手段:自由衰减试验(Free Decay Test)。做法是这样的:把USV置于静水中,给它一个初始速度(比如用橡皮筋或快速推进拖一段距离),然后切断推力,记录速度从初值衰减到接近零的完整曲线。根据这个衰减曲线,可以拟合出阻尼模型的线性项系数和二次项系数。

具体操作时,把船速传感器(如GPS测速或者多普勒测速仪)的采样率尽量调高,至少10Hz以上。衰减曲线拟合时,注意把风速影响排除掉——如果试验当天有风,最好选择风速小于2m/s的时段,否则风阻会混入阻尼辨识结果中。我当时是在早上6点去湖上做的试验,水面平静,风速很低,数据质量非常好。

拟合方法用的是最小二乘法。假设阻尼模型是:

m·v_dot + c1·v + c2·v·|v| = 0

其中c1是线性阻尼系数,c2是二次阻尼系数。那么由自由衰减数据,可以构造出关于c1、c2的线性回归方程,直接解算。需要注意的是,这个试验最好在纵荡、横荡两个方向都各做一次,因为两个方向的阻尼系数差异可能很大。横荡方向试验做起来比纵荡稍微麻烦一些,需要用侧向拖曳的方式给船一个初始横荡速度,或者干脆用横向牵引绳拉一下。

3.4 模型验证:把仿真跑出来的曲线和实艇曲线放到一起对比

参数获取完成之后,千万不要急着设计控制器,先做模型验证。验证方法是:用同样的输入(PWM指令序列),分别在Simulink模型里和实艇上记录输出(位置、航向、速度),然后把两组曲线放在同一张图里对比。如果模型正确,两者应该吻合得比较好;如果偏差明显,说明参数还需要修正。

我当时做了三组验证场景:一是直线加减速,二是定半径回转,三是蛇形机动。直线加减速验证纵荡方向的惯性参数和阻尼参数;定半径回转验证转弯时的横荡、艏摇耦合参数;蛇形机动则综合检验模型在持续变工况下的性能。实测下来,模型与实艇在直线加减速段的航迹误差在0.5米以内,回转段的半径误差在10%左右,这个精度对于后续PID控制器的设计和仿真来说,已经可以接受了。

我没有继续追求更高精度的模型,因为对轨迹跟踪控制器的设计来说,模型精度达到“趋势一致、误差有界”就够了。过高的建模精度需要投入大量成本,而在实际水环境中,风浪流干扰本身的随机性远远大于模型误差,把精力花在精修模型上,不如把精力花在控制器鲁棒性设计上。

4. 轨迹跟踪问题的数学化:误差坐标与控制目标定义

4.1 轨迹跟踪与路径跟踪的区别

先明确一个概念:轨迹跟踪(Trajectory Tracking)和路径跟踪(Path Following)并不是一回事。轨迹跟踪要求USV在指定时间到达指定位置,跟踪误差包含位置误差和时间误差,是一个“时间轴上的跟踪问题”;路径跟踪只要求USV沿着期望路径走,不强制规定什么时间到哪个点,是一个“几何跟踪问题”。工程上,多数USV任务(如航道巡检、水文采样)更接近路径跟踪,因为不需要精确到秒级到达某个点,只需要空间上的精度。

但PID轨迹跟踪的经典框架,是以时间参数化的参考轨迹(x_r(t), y_r(t), ψ_r(t))为基础的。做法是:给定一条几何路径,在其中加入期望速度剖面,就得到了随时间变化的轨迹,然后控制器跟踪这条轨迹。这样做的好处是,可以把“到达指定位置”和“以指定速度航行”统一到同一套控制框架里。缺点是对时间参数的准确性敏感,如果速度剖面设计不合理,或者执行机构饱和导致无法跟上时间参数,跟踪误差就会被放大。

在项目中,我采用的是基于视距导引法(LOS,Line-of-Sight)的路径跟踪框架,这样既规避了时间参数敏感问题,又保留了PID控制的简洁性。LOS法的核心思想是:在期望路径上确定一个“前方视距”Δ处的虚拟目标点,然后引导USV朝这个目标点航行。视距Δ的取值直接影响跟踪效果——Δ过小,USV会频繁转向,轨迹呈锯齿状;Δ过大,转弯时机滞后,弯道处会出现较大的横向偏差。我后面会详细说Δ怎么调。

4.2 横向偏差与航向偏差:控制器的输入是什么

在LOS框架下,控制器的输入指标主要就两个:横向跟踪偏差e_y和航向偏差e_ψ。横向偏差定义为USV当前位置到期望路径上最近点的垂直距离(带符号),航向偏差定义为USV当前航向与LOS目标方向之间的差值。

直白点说,控制目标就是让e_y趋向于0,同时让e_ψ趋向于0。但这并不是两个独立的目标——航向偏差的消除是为了最终消除横向偏差,所以两者之间存在主从关系。经典的LOS做法是:先根据横向偏差计算期望航向:

ψ_d = LOS_angle(e_y) = atan2(−e_y, Δ)

再加上前馈项(路径切向角),得到最终的期望航向。然后航向控制器跟踪这个期望航向。这样设计的好处是,把轨迹跟踪问题转化成了一个航向控制问题——只要能控制好航向,轨迹跟踪就基本能保证。这也正是PID控制可以发挥作用的地方:航向环PID是整个控制系统的内环,而横向偏差的消除则依靠LOS几何关系自然实现。

4.3 纵向速度控制与推力分配

除了航向和横向偏差,纵向速度也需要控制。USV的期望速度通常由任务需求给定,比如巡航速度2m/s,搜索作业速度1m/s。速度控制环相对独立,一般也用PID实现,输出是总推力(左右推进器之和)。推力分配则把控制律解算出的总推力T和转艏力矩M_r映射到左右推进器的推力指令上:

T_L = T/2 + M_r / B T_R = T/2 − M_r / B

其中B是左右推进器的横向间距。这个分配公式简单但非常实用,前提是两侧推进器特性对称。如果两侧推进器存在差异(比如左侧推力偏大),就需要在推力分配环节加上静态修正系数,否则USV会出现持续的小角度偏航,航向PID会一直输出一个常值修偏量来对抗它。我在实艇上就遇到过这个问题,原因是左推进器轻微损坏,后来在推力分配里加了修正系数解决。

5. PID控制器设计:从单环到串级,从仿真到实艇

5.1 为什么选择PID而非LQR或MPC:边界条件与性价比

在设计控制器选型时,我也认真考虑过LQR和MPC。结论是:在项目初期和大多数工程任务中,PID的性价比最高。LQR需要比较精确的线性化模型,能用它做轨迹跟踪的场合,一般要配合LQG或观测器使用,设计复杂度高。MPC则对计算资源和模型精度要求更高,在嵌入式设备上跑起来有一定压力。PID结构简单、调参直观、鲁棒性强,唯一的问题是它不会自动处理强耦合和非线性,需要靠结构上的设计来弥补。

这个项目的做法是用PID做基础,再用LOS导引律把轨迹跟踪问题解耦。也就是说,PID不直接管位置误差和速度误差的交叉耦合,而是管“航向角”和“纵向速度”这两个相对独立的量。耦合问题被前馈项(LOS导引角+路径切向角)和非线性补偿项削弱。这样,PID只需面对一个相对干净的SISO对象,调参难度大幅下降。

当然,PID也有边界:当USV面临强烈海流扰动、大幅浪涌或行驶在高速大机动状态时,PID的局限会暴露。这种工况下,可能需要切换或叠加更先进的控制算法。但先把PID做到极致,再谈升级,是我在这个项目里坚持的原则。

5.2 串级PID结构:位置环、航向环、速度环怎么串

我实际采用的三层串级结构如下:

  1. 位置环(外环):输入期望路径,输出期望航向ψ_d。核心是LOS导引律,不直接用PID,而是一个几何关系解算。但对于某些需要精确时间轨迹跟踪的任务,这一层也可以改成位置PID,输出期望速度方向和期望速度大小。
  2. 航向环(内环):输入期望航向ψ_d,输出转艏力矩M_r(或左右推力差)。这是标准的PID控制环。
  3. 速度环(内环):输入期望纵向速度u_d,输出总推力T。这也是标准的PID控制环。

航向环PID的表达式:

M_r = Kp_ψ · e_ψ + Ki_ψ · ∫e_ψ dt + Kd_ψ · de_ψ/dt

速度环PID的表达式:

T = Kp_u · e_u + Ki_u · ∫e_u dt + Kd_u · de_u/dt

其中e_ψ = ψ_d − ψ,e_u = u_d − u。实际代码中,我同时加入了抗积分饱和、微分低通滤波和输出限幅三个保护措施。这些细节非常关键,下面逐一说明。

5.3 抗积分饱和与微分先行:PID调参的根本前提

积分饱和是PID在实艇上最常踩的坑。设想场景:USV刚从岸边启动,期望航向在正前方,但实际航向因为侧风偏了30°,航向误差很大,积分项开始持续累积。随着舵量输出逐渐加大,船开始转向,误差减小,但由于积分项已经累积了很大的值,控制输出仍然维持在最大舵角附近,导致USV冲过头,出现明显的超调,然后积分反向累积,系统来回振荡。

解决积分饱和的标准方法有几种:一是积分限幅,设定积分项输出的上下限;二是积分分离,当误差超过某个阈值时,暂停积分累积;三是采用“back-calculation”抗饱和结构,当输出饱和时,把饱和造成的差异反馈回积分器。我在项目里用的是积分限幅+积分分离的组合,代码简单、效果直观,对于USV这种执行机构有明确物理限幅的场景非常合适。

微分项同样有坑。USV的航向传感器输出往往带有噪声,直接用差分计算de_ψ/dt,微分项会把噪声放大,造成控制输出高频抖动。我的做法是:在微分项前加一阶低通滤波器,或者在位置环与航向环之间不直接用微分项,而是采用“微分先行”结构——只对反馈信号微分,不对期望信号微分。这样,期望航向突变时微分项不会产生尖峰,控制输出更加平滑。参考信号(目标航向)突变是轨迹跟踪里常见的情况,比如切弯点、路径拐点,如果不做微分先行,控制指令很容易出现剧烈跳变。

5.4 PID参数整定的实际流程:从Ziegler-Nichols到精细微调

参数整定方面,我走了一条很实际的路线,没有直接用Ziegler-Nichols整定法,因为水面环境噪声大,直接把系统推到临界振荡状态试起来比较危险。我的做法分三步:

第一步,先整定航向环。把USV开到一个相对平静的水域,人工给定一系列航向阶跃指令,比如从0°转到30°,从30°转到60°,观察航向响应曲线。用试凑法整定Kp_ψ、Ki_ψ、Kd_ψ三个参数,目标是无超调或小超调(<5%),上升时间在2秒左右,稳态误差趋近于0。试凑的顺序是:先调Kp_ψ让稳态误差足够小,再调Kd_ψ抑制超调,最后加一点Ki_ψ消除残差。

第二步,整定速度环。给定期望速度阶跃,比如从1m/s到2m/s,观察速度响应曲线。船速环的动态特性相对较慢,Kp_u不用很大,Ki_u稍微给一点即可。注意速度环不要响应太快,否则推进器电流波动大,对电池和电机都不友好。

第三步,整定LOS视距Δ。这个参数决定了横向误差收敛的“陡峭程度”。Δ越大,航向角变化越平缓,跟踪路径时转弯半径偏大;Δ越小,收敛越快,但航向角指令波动变大。我的经验是:Δ取USV船长的2~4倍作为初值,再根据实艇航迹效果微调。船速快时适当增大Δ,船速慢时减小Δ。

6. 仿真验证与实艇调试:从Simulink到湖泊的完整链路

6.1 仿真环境搭建:模型、控制器、传感器噪声缺一不可

仿真环境搭建方面,我用的是MATLAB/Simulink。模型部分为三自由度动力学+执行机构一阶惯性+传感器噪声模块。传感器噪声模块容易被人忽略,但它对PID调参结果影响很大——如果仿真里不给传感器加噪声,调出来的微分增益可能过大,实艇上直接抖成筛子。我当时给航向传感器加的是标准差0.5°的高斯白噪声,给GPS位置加的是标准差0.1米的高斯白噪声,这个量级与实艇传感器的实测噪声水平基本一致。

控制器部分则直接复用了实艇单片机的控制逻辑,用C代码生成的方式做硬件在环(HIL)仿真。这样能提前发现控制器代码中的逻辑问题(比如数据类型溢出、初始化顺序错误),减少上艇调试时间。

6.2 调参过程中记录的一组关键数据

以下是我在一轮典型调参中记录的数据,虽然具体数值只适用于我的艇型,但趋势在多数USV上都是成立的:

参数初值调整后依据与效果
Kp_ψ2.01.2初值导致转弯超调15%,降为1.2后超调约3%
Ki_ψ0.50.2积分过强,直线段出现周期摆动,减小后稳态误差仍在0.5°以内
Kd_ψ1.02.5增加微分后航向响应阻尼增大,回转段跟随性改善
Kp_u3020推力响应过快,导致推进器电流尖峰,调低后无明显跟踪滞后
Ki_u2.01.0积分项用于消除稳态速度误差,太大时续航下降明显
视距Δ3m5m3m时蛇形轨迹过于抖动,5m时航迹平滑,最大横向误差约0.8m

从这组数据可以看出,初值和最终值之间往往有很大差距。原因是仿真里得到的参数往往是“理想值”,实艇上执行机构延迟、传感器噪声、水动力不确定都会让“理想值”变得过于激进。所以我的经验是:仿真参数往保守方向调,宁可响应慢一点,不要振荡;上实艇之后再逐步加大增益,找到性能和鲁棒性的平衡点。

6.3 实艇调试中最为棘手的三个现象

实艇调试过程中,我遇到了三个特别典型的工程问题,这里展开说说排查思路。

第一个问题是低速工况下的航向抖振。当USV以0.5m/s以下速度航行时,航向PID输出出现明显的高频小幅振荡,左右推进器不断交替加减速。排查链路是这样:先怀疑是传感器噪声,检查航向数据后发现噪声水平正常;再怀疑是执行机构延迟,查看推进器响应曲线,发现延迟确实存在;最终定位为微分项增益过高。低速时船体受外界干扰相对明显,航向角波动频率较高,微分项把这种高频波动进一步放大,形成振荡。解决办法是:降低Kd_ψ,同时在微分通道引入一个截止频率为2Hz的低通滤波器。效果立竿见影,抖振消失。

第二个问题是强风条件下直线跟踪偏差过大。某次湖试风速约6m/s,USV沿直线路径航行时,横向偏差持续偏离到2米以上,且航向PID输出一直处于饱和状态。排查发现:一是风扰力矩超过了PID的补偿能力;二是LOS视距Δ取值偏大,导致期望航向对横向偏差的修正作用太弱。解决办法是:一方面增大Ki_ψ,让积分项持续累积补偿风扰力矩;另一方面把Δ从5m减小到3.5m,增强航向修正的主动性。调整后,横向偏差控制在1米以内,虽然仍有波动,但满足任务需求。

第三个问题是GPS更新率不足导致的跟踪跳跃。实艇GPS输出频率只有5Hz,位置环解算得到的横向偏差在相邻两个周期之间跳变明显,导致期望航向指令波动,航向环PID跟着来回动作。排查确认是GPS采样率问题后,我在位置环和航向环之间插入了一个一阶低通滤波器,对期望航向做平滑处理。同时把LOS解算周期从10Hz提高到20Hz,用GPS前后两点的位置做插值,等效提高了位置更新率。这样处理后,期望航向曲线明显平滑,航向环PID的工作压力大幅降低。

这三个问题的共性在于:PID参数本身并没有错,而是系统带宽不匹配。PID控制器的带宽有限,如果外部输入的频率分量或干扰的频率分量超出了PID能有效响应的范围,参数再怎么调都无济于事。只有从结构上降低高频扰动或提高系统响应能力,问题才能真正解决。

7. 控制器代码框架与工程实现的几个细节

7.1 控制周期与任务调度的选择

控制器的软件实现上,我采用的是任务调度方式:位置环(LOS解算)周期100ms,航向环和速度环周期20ms。位置环不需要太快,因为GPS刷新率就那么高,频率再高也是空转;航向环和速度环作为内环,需要更高的响应速度来抑制扰动和保证稳定性。

这里有一个容易忽略的点是任务调度的时序抖动。在单片机上,如果航向环的执行时间因为其他任务(比如数据记录、通信)占用的时间波动,控制周期就不稳定,PID的离散化参数会偏离设计值。我最终的做法是:把航向环放在定时器中断里执行,优先级最高,其他任务在主循环中运行。这样保证控制周期的稳定性,实测抖动控制在1ms以内。

7.2 PID代码的低级优化:防溢出与数据类型选择

嵌入式中实现PID时,数据溢出是最隐蔽的bug。积分项的数值会不断累积,如果使用16位整型,很容易溢出导致控制量异常跳变。我的做法是:所有PID变量统一使用浮点型(float),并且在计算积分项时先做误差限幅,再乘积分系数,最后加到一个积分累加器中。积分累加器也加上限幅:

integral += error * dt; if (integral > I_MAX) integral = I_MAX; if (integral < -I_MAX) integral = -I_MAX;

同时,微分项采用带通滤波结构,公式如下:

derivative = (error - error_prev) / dt; derivative_filtered = alpha * derivative + (1 - alpha) * derivative_filtered_prev;

其中alpha是滤波器系数,取0.2~0.5之间,根据采样周期和系统带宽调整。这个结构比单纯差分更平滑,也便于调试时单独调节微分通道的噪声抑制程度。

7.3 控制器框架向其他算法的切换预留

虽然文章标题是PID控制,但工程上不建议把控制代码写死成一个框架。因为水面无人艇的环境变化大,PID只是一个基础层,后续如果要升级到LQR或模型预测控制(MPC),控制框架最好能平滑对接。我在代码里预留了“控制器接口”,将“期望航向解算”和“期望速度解算”作为独立模块,与底层PID模块解耦。这样以后想在路径跟踪层换算法,比如改用LQR轨线跟踪,只需要替换上层模块,底层PID模块可以保留作为备份或过渡。

这种分层设计对维护和调试的友好度是实打实的。有一次实艇测试中航向环参数出了问题,我直接把系统的“航向控制”从PID切换到一个手动纯比例控制器做对比,确认问题出在外环还是内环,整个过程不到十分钟。如果代码里没有这种模块边界,排查难度会成倍增加。

8. PID调参经验之外:轨迹跟踪效果的评估方法

8.1 跟踪误差指标怎么算才客观

轨迹跟踪效果评估本身也是一门学问。如果只看最终航迹图,容易被视觉误差欺骗。我采用的评估方法包括以下指标:

  • 最大横向误差(Max Cross-Track Error):整个任务过程中,USV与期望路径之间的最大垂直偏差。这个指标反映最坏情况下的跟踪能力。
  • 平均横向误差(Mean Cross-Track Error):所有时刻横向误差的平均值,反映整体跟踪精度。
  • 航向超调量(Heading Overshoot):对航向阶跃响应的最大超调量,反映内环控制品质。
  • 控制量波动率(Control Effort Variation):控制输出的标准差,反映执行机构负荷和能源消耗情况。波动率过大说明控制器过于激进。

我建议在评估时不要只看最大横向误差,因为那可能是风浪瞬时冲击导致的尖峰,掩盖了系统本身的性能。平均横向误差加上控制量波动率,才更能反映系统在持续工况下的真实表现。

8.2 不同工况下的性能对比

我在项目中对不同工况下的轨迹跟踪效果做了系统性对比,整理如下表:

工况平均横向误差最大横向误差备注
静水直线跟踪 1m/s0.05m0.20m性能优秀,接近GPS噪声极限
静水直线跟踪 2m/s0.08m0.35m速度上升后阻尼增大,误差略增
静水圆形跟踪 1m/s(半径20m)0.35m1.10m转弯段误差明显,LOS视距需要调整
波浪条件直线跟踪(风4级)0.30m1.50m风浪干扰为主要误差来源
蛇形路径跟踪 1.5m/s0.45m1.80m连续转弯对航向环响应速度要求高

从表里可以看出,PID+LOS的组合在静水工况下已经能做到分米级跟踪精度,在中等风浪下也能保持在米级。对于多数水面巡检、水质采样、监测任务,这个精度是足够用的。当然,如果要求厘米级精度或者对抗强风浪,就需要考虑更先进的控制算法了。

8.3 误差来源拆解:究竟是模型误差还是控制器误差

当跟踪误差偏大时,是模型参数不准导致的,还是PID参数没有调好导致的?这个问题经常困扰调试者。我建议用一条简单的鉴别流程来判断:先用仿真模型做同一个轨迹的跟踪,如果仿真中误差也大,说明问题大概率在控制器设计端(可能是LOS参数、PID参数或结构设计问题);如果仿真中误差很小而实艇误差大,说明问题在模型误差、外部扰动或执行机构特性上。

用这个方法,我在一次直线跟踪误差偏大的问题排查中,快速定位到是执行机构响应延迟导致的问题,而不是PID参数不当。具体做法是:在仿真中给执行机构模型增加与实艇一致的响应延迟,然后对比仿真误差和实艇误差。结果发现,误差大小和形态非常接近,确认了延迟是主要原因。于是我在控制器中引入“补偿微分”结构,对延迟做了一阶超前补偿,实艇误差显著下降。这个排查链路给个建议:遇到误差异常时,先怀疑“执行机构”和“传感器”,再怀疑“控制器参数”,最后才是“模型参数”。这样能节省大量调试时间。

9. 项目推进中的心态与建议

这个项目从零开始,到能够稳定跑出满意的轨迹跟踪效果,前后花了大概两个月时间。期间最深的体会是:控制算法的理论不难,真正的难点在“工程闭环”。模型参数要测、传感器噪声要滤、执行机构特性要识别、代码要可靠,每一步都需要细心的积累和反复验证。PID控制作为经典算法,在USV上依然有非常强的生命力和实用性,但它需要在一个合理的控制架构下才能充分发挥作用。

如果你也要做类似项目,我的建议是:第一,尽早建立“仿真与实艇”的对比习惯,不要把仿真效果和实艇效果割裂开;第二,PID参数整定要有流程,不要“试试看”,而是先定内环、再定外环,一项一项来;第三,传感器噪声和执行机构延迟是实艇调参的头号敌人,要专门设计滤波和补偿环节;第四,代码架构要留好模块边界,方便后续升级算法。

水面无人艇的控制是一件非常综合的事情,这篇文章我只讲了建模、轨迹跟踪与PID控制这条主线。实际项目中还有很多配套工作,比如传感器融合、路径规划、避障、能源管理等,它们与控制器共同构成了完整的无人艇系统。希望这篇文章能为准备踏入这个领域的你提供一个扎实的起跑参考。

本文还有配套的精品资源,点击获取

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

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

立即咨询