1. 从“开船”到“开无人艇”:为什么欠驱动是个大麻烦?

大家好,我是老张,在无人艇和智能控制这块摸爬滚打了十几年。今天想和大家聊聊一个听起来很学术,但实际玩起来特别有意思的话题:如何让一艘“缺胳膊少腿”的无人艇,乖乖地沿着你画好的路线走?

这艘“缺胳膊少腿”的船,就是我们常说的欠驱动无人艇。什么叫欠驱动?简单说,就是这艘船能用的“方向盘”和“油门”不够。想象一下你开一辆普通的汽车,你可以控制方向盘(转向)和油门刹车(前进后退),自由度很全。但一艘典型的欠驱动无人艇,它通常只有一个推进器(控制前进后退)和一个舵(控制左右转)。它没有专门用来横向移动的“侧向推进器”。这就好比你的汽车只能踩油门和转方向盘,但不能直接让车横着走。在海上,这就带来了一个核心难题:当风浪从侧面打过来时,船会被推着产生横向漂移(我们叫它“侧滑”),而你却没有直接的控制手段去立刻抵消它。

我们的目标,就是让这艘船在存在风、浪、流干扰,自身还不“健全”的情况下,精准地跟踪一条预设的路径,比如进行海洋测绘、水质监测或者巡逻。这听起来是不是有点像让一个骑独轮车的人在狂风中走钢丝?传统的控制方法,需要同时精确控制船在平面上的三个运动:前后(纵荡)、左右(横荡)、转向(艏摇)。但对于欠驱动系统,横荡方向是“失控”的,这直接让问题变得极其复杂。

所以,我们急需一种“化繁为简”的智慧。这就引出了我们今天的主角:LOS制导法。它的核心思想非常巧妙,甚至有点“偷懒”的艺术:既然我无法直接控制横向运动,那我就不硬碰硬了。我换个思路,只关注两个我能直接且有效控制的东西——船头的指向(航向角)船往前跑的速度。LOS方法就像一位经验丰富的领航员,它不关心船体每一刻的精确横向位置,而是始终告诉舵手:“看,目标点在那个方向,把船头对准它,保持速度前进,船自然就会靠过去。”通过这种视角转换,它成功地将一个三自由度的路径跟踪问题,降维成了一个二自由度的航向与速度跟踪问题。一下子,控制器设计的难度就降低了一个数量级。我刚开始接触这个方法时,不禁拍案叫绝,这简直就是工程实践中的“四两拨千斤”。

2. LOS制导法:老舵手的直觉,如何变成数学公式?

那么,这个像老舵手直觉一样的LOS制导,到底是怎么用数学语言描述,并教会无人艇的呢?咱们来拆解一下。

首先,我们得在海上“画”出一条期望的路径。这条路径可以用一个参数 ξ 来描述,比如一条直线或者曲线。无人艇当前的位置是 (x, y),我们在这条期望路径上找一个离船最近的点,这个点叫做“虚拟参考点”,它的位置是 (x_p(ξ), y_p(ξ))。船和这个虚拟点之间的差距,就是我们的跟踪误差

这个误差可以分解为两个分量:一个是沿着路径方向的纵向误差,另一个是垂直于路径方向的横向误差。对于路径跟踪来说,我们最关心、也最难搞定的是那个横向误差,因为纵向误差大不了跑快点或慢点就能追上,而横向误差需要船“拐”过去。

LOS制导律的精髓,就体现在如何生成那个让船去“看”的视线角上。 它的计算公式非常简洁:

ψ_d = - arctan( K_p * e ) - β

这里,ψ_d 就是我们计算出来的期望航向角,也就是告诉船:“你应该把头转到这个角度。”e 就是上面说的横向跟踪误差。K_p 是一个正的调节参数,你可以把它理解为“舵手的反应灵敏度”:K_p 越大,看到一点偏差就急着打方向盘;K_p 小一点,转向就更柔和。β 是一个关键补偿项,它就是侧滑角,可以理解为风浪把船身吹得横过来一点的角度。如果不考虑 β,就等于假设船头指向哪里,船就往哪里走。但在真实海洋中,这几乎不可能。加上 β,就相当于舵手根据风浪经验,提前把船头多偏转一点,以抵消横向漂移,让船的实际运动方向对准目标。

这个公式的美感在于它的物理意义极其清晰。它把复杂的空间几何关系,转化为一个简单的反正切函数。当横向误差 e 很大时,arctan 函数会输出一个较大的角度,指令船头大幅度转向以快速减小误差;当误差 e 很小时,输出角度也小,进行微调。整个控制逻辑是连续且光滑的,避免了突变。

在实际的仿真和实验中,调节 K_p 是个技术活。K_p 太大,船会对着路径来回“画龙”,产生振荡;K_p 太小,船反应迟钝,收敛到路径的速度很慢,在弯曲路径上可能永远追不上。我通常的做法是,先在平静水面(无风浪)的仿真中,从一个较小的值开始试,观察船的收敛曲线,逐步增大直到出现轻微振荡,然后回退一点,取一个较稳健的值。这就像给汽车做四轮定位,需要耐心微调。

3. 直面风浪:模型不确定性与侧滑角的挑战

理想很丰满,但大海很骨感。上面那个漂亮的LOS制导律,是建立在我们知道精确的侧滑角 β 和船完美服从运动学指令的假设上的。现实中,这两点都是挑战。

首先是模型不确定性。 无人艇的动力学模型非常复杂,涉及水动力系数、附加质量、阻尼等一大堆参数。这些参数很难通过计算精确获得,通常需要水池试验来辨识,而且还会随着船的负载、速度甚至船底附着生物的情况而变化。我们手里用的模型,永远只是真实物理系统的一个近似。这就意味着,基于这个模型设计的控制器,天生就带着“误差”。

其次是环境干扰,核心体现就是时变的侧滑角 β 侧滑角是怎么来的?当风、浪、流从侧面作用于船体时,会产生一个横向力。由于无人艇是欠驱动的,没有横向推进器去抵消这个力,船体就会产生一个横向速度分量。此时,船头的指向(航向角)和船实际运动的方向(航迹角)就不再一致,它们的差值就是侧滑角 β。你可以把它想象成开车时侧风很大,你必须向风来的方向打一点方向盘,才能保持车直线行驶,这个打方向盘的角度就类似对侧滑角的补偿。

在实际操作中,β 并不是一个常数。它随着风浪的强度、方向以及船速的变化而实时变化。更棘手的是,我们通常没有一个传感器能直接、准确地测量出这个 β 值。很多论文里会假设 β 很小(比如小于5度),并且变化缓慢,从而可以忽略或者用一些估计器来粗略估计。但在我做过的湖试和海试中,遇到稍大一点的风浪,瞬时 β 超过10度的情况并不少见。如果控制器还假设 β=0,那跟踪效果就会大打折扣,船会持续地偏离路径下风方向。

所以,一个鲁棒的、实用的控制器,必须正视这些“不知道”和“在变化”。它不能像温室里的花朵,只能在精确模型和理想环境下工作。它得像一个老练的水手,即使看不清全部风浪,也能凭借经验和策略稳住船舵,这就是我们引入鲁棒控制的原因。

4. 打造“稳如老狗”的控制器:从滑模控制说起

面对模型未知和风浪干扰,我们需要一个足够“强硬”的控制策略。这里我强烈推荐滑模控制。它是我用过对抗不确定性最有效的工具之一,原理听起来有点“暴力美学”。

滑模控制的核心思想是,我不去精确地建模所有复杂动态和干扰,而是设计一条理想的“滑模面”。一旦系统的状态轨迹被“拉”到这个滑模面上,它就会像坐滑梯一样,沿着这个面快速、稳定地滑向平衡点(即跟踪误差为零的点)。而且,最关键的特性是鲁棒性:一旦上了滑梯,系统对于模型参数的变化和外部干扰就变得不敏感了,只要干扰在某个界限内,就影响不了沿滑模面收敛的趋势。

怎么把系统拉上这个“滑梯”呢?靠的是一个不连续的控制律,它会根据系统状态是在滑模面之上还是之下,进行高速的切换。这个切换会产生所谓的“抖振”现象,就像快速来回扳动开关。早期的滑模控制抖振很厉害,直接用在物理系统上可能会损坏执行机构(比如舵机)。但现在我们已经有了很多“软化”它的方法,比如用饱和函数 sat(s/Φ) 代替理想的符号函数 sign(s)。这里的 s 就是滑模面变量,Φ 是一个边界层厚度。在边界层 |s| < Φ 内,控制是连续的线性反馈,出了边界层才是饱和的常值控制。这就像开车,离车道中心线很近时微调方向盘,偏离很远时才大幅度修正,既保证了鲁棒性,又平滑了控制动作。

结合我们的LOS制导,滑模控制通常用在动力学层面。LOS负责生成期望的航向角 ψ_d 和期望速度 u_d,这可以看作是“指挥层”。而滑模控制器则是“执行层”,它负责计算出实际需要施加的舵角(控制力矩)和推力(控制力),驱使船的真实航向真实速度去跟踪LOS给出的指令,并且在这个过程中克服动力学模型的不确定性和风浪干扰。

设计时,我们一般会定义两个滑模面:一个针对航向角跟踪误差,一个针对速度跟踪误差。然后根据李雅普诺夫稳定性理论,设计控制律,保证滑模面是吸引的。这里面会包含对干扰上界的估计,即使我们不知道干扰具体是多少,但只要知道它不会超过某个范围,控制器就能 hold 住。

我在Matlab/Simulink里搭建仿真模型时,会特意做对比测试。一组用普通的PID控制器去跟踪LOS指令,另一组用滑模控制器。然后在仿真中注入时变的风浪干扰(用正弦波或随机噪声模拟侧滑角 β),并故意让模型的参数和真实值有10%-20%的偏差。结果总是很直观:PID跟踪的路径会有明显的、持续的偏移,尤其在转弯处;而滑模控制下的路径,虽然也会受到干扰影响产生波动,但能很快被拉回期望路径附近,表现出强大的抗干扰和容错能力。这种仿真结果给实际调试带来了巨大信心。

5. 动手实践:从仿真到湖试的关键步骤与参数调试

理论说得再好,不上水都是纸上谈兵。从仿真到真实的无人艇,有几个关键的步骤和坑,我结合自己的经验跟大家分享一下。

第一步:高保真度仿真建模。 在写一行控制代码之前,先在仿真环境里把船和环境的模型建好。动力学模型尽量采用辨识过的参数,哪怕不精确,也要有个靠谱的量级。环境干扰模型一定要加,风、流可以设为定常或缓变,浪可以用频谱(如PM谱)来生成不规则波。LOS制导模块和滑模控制器作为独立的模块接入。这个阶段的目标是验证逻辑正确性初步调参。重点关注几个指标:1)在不同曲率路径(直线、圆弧、正弦曲线)下的跟踪收敛性;2)加入干扰后,稳态跟踪误差的幅值;3)控制量(舵角、推力)是否平滑、是否饱和。

第二步:参数调试的“手感”。 这是最需要经验的地方。主要调几个参数:

  1. LOS制导律中的 K_p(前视距离参数):这是影响跟踪性能最直接的参数。对于直线路径,K_p 可以设大一些,让船“看得远”,航行平滑;对于弯曲紧密的路径,K_p 必须设小,否则船会因反应迟钝而切内弯,甚至失跟。我通常的做法是让 K_p 与船速 u 关联,K_p = n * u,其中 n 是一个时间常数(比如1.5~2.5秒),这样能自适应速度变化。
  2. 滑模控制中的边界层厚度 Φ 和切换增益Φ 决定了控制平滑度和鲁棒性的权衡。Φ 越大,控制越平滑,但鲁棒性略有下降;Φ 越小,理论鲁棒性越强,但抖振风险越大。我的经验是从一个稍大的值开始,在保证稳定性的前提下逐步减小,直到执行机构出现可接受的微小高頻动作。切换增益要略大于你预估的干扰上界,太大引起抖振,太小则无法压制干扰。
  3. 侧滑角 β 的处理:如果你有GPS和航向传感器,可以实时计算航迹角与航向角的差值作为 β 的观测值,反馈到LOS律中。如果没有,在低速或干扰不大时,可以忽略;在已知主要干扰方向(如恒定侧风)时,可以设一个常值补偿;对于更复杂的情况,可以考虑设计一个简单的观测器(比如一阶滤波器)来估计 β

第三步:硬件在环与湖试验证。 把仿真中调好的控制器代码,移植到无人艇的嵌入式主控板(如基于ROS的工控机、Pixhawk等)上。先进行硬件在环测试,用实时机运行船体模型,控制器输出作用于虚拟模型,验证代码实时性和接口是否正确。没问题后,就是最激动人心的湖试。选择风平浪静的日子开始,用无线电遥控做保底。先测试基本的航向和速度控制,再测试直线路径跟踪,最后才是复杂曲线。一定要做好数据记录,包括GPS轨迹、姿态、控制指令等。湖试数据是金标准,它会暴露出仿真中考虑不到的问题,比如传感器的噪声、延迟,通讯的丢包,推进器的非线性死区等。

我印象最深的一次,仿真完美的控制器在湖上跑圆圈时,总是在固定位置向外偏。回来分析数据发现,是那片水域有不易察觉的微弱环流。控制器本身没问题,但它对抗的是持续的定向干扰。后来我们在LOS律中加入了针对恒定干扰的积分项,问题就解决了。所以,实践是检验真理的唯一标准,也是提升控制器鲁棒性的最终途径。 每一次下水,都会让你对“欠驱动”、“不确定性”和“鲁棒性”有更深的理解。这个过程很折腾,但当看到无人艇在微风波浪中依然稳稳地沿着预定航线航行时,那种成就感是无与伦比的。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐