基于LOS制导的欠驱动无人艇路径跟踪:从模型简化到鲁棒控制

📅 发布时间:2026/7/16 11:17:04 👁️ 浏览次数:
基于LOS制导的欠驱动无人艇路径跟踪:从模型简化到鲁棒控制
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控制量舵角、推力是否平滑、是否饱和。第二步参数调试的“手感”。这是最需要经验的地方。主要调几个参数LOS制导律中的K_p前视距离参数这是影响跟踪性能最直接的参数。对于直线路径K_p可以设大一些让船“看得远”航行平滑对于弯曲紧密的路径K_p必须设小否则船会因反应迟钝而切内弯甚至失跟。我通常的做法是让K_p与船速u关联K_p n * u其中n是一个时间常数比如1.5~2.5秒这样能自适应速度变化。滑模控制中的边界层厚度Φ和切换增益Φ决定了控制平滑度和鲁棒性的权衡。Φ越大控制越平滑但鲁棒性略有下降Φ越小理论鲁棒性越强但抖振风险越大。我的经验是从一个稍大的值开始在保证稳定性的前提下逐步减小直到执行机构出现可接受的微小高頻动作。切换增益要略大于你预估的干扰上界太大引起抖振太小则无法压制干扰。侧滑角β的处理如果你有GPS和航向传感器可以实时计算航迹角与航向角的差值作为β的观测值反馈到LOS律中。如果没有在低速或干扰不大时可以忽略在已知主要干扰方向如恒定侧风时可以设一个常值补偿对于更复杂的情况可以考虑设计一个简单的观测器比如一阶滤波器来估计β。第三步硬件在环与湖试验证。把仿真中调好的控制器代码移植到无人艇的嵌入式主控板如基于ROS的工控机、Pixhawk等上。先进行硬件在环测试用实时机运行船体模型控制器输出作用于虚拟模型验证代码实时性和接口是否正确。没问题后就是最激动人心的湖试。选择风平浪静的日子开始用无线电遥控做保底。先测试基本的航向和速度控制再测试直线路径跟踪最后才是复杂曲线。一定要做好数据记录包括GPS轨迹、姿态、控制指令等。湖试数据是金标准它会暴露出仿真中考虑不到的问题比如传感器的噪声、延迟通讯的丢包推进器的非线性死区等。我印象最深的一次仿真完美的控制器在湖上跑圆圈时总是在固定位置向外偏。回来分析数据发现是那片水域有不易察觉的微弱环流。控制器本身没问题但它对抗的是持续的定向干扰。后来我们在LOS律中加入了针对恒定干扰的积分项问题就解决了。所以实践是检验真理的唯一标准也是提升控制器鲁棒性的最终途径。每一次下水都会让你对“欠驱动”、“不确定性”和“鲁棒性”有更深的理解。这个过程很折腾但当看到无人艇在微风波浪中依然稳稳地沿着预定航线航行时那种成就感是无与伦比的。