欠驱动AUV轨迹跟踪与路径跟随:Matlab/Simulink仿真全解析

发布时间:2026/10/3 3:52:44
欠驱动AUV轨迹跟踪与路径跟随:Matlab/Simulink仿真全解析 我接手过不少水下机器人相关的课题最让我觉得有意思的其实就是欠驱动AUV的控制问题。这类系统说起来有点“憋屈”船体明明有六个自由度可手头的控制输入就四路——主推、垂直舵、水平舵外加一个艉推横荡方向上根本没有直接的力。这就好比开车进窄巷车不能横着平移只能靠方向盘和前后来回折腾。轨迹跟踪和路径跟随这两类任务恰好就是在这种约束下被反复讨论的核心问题也是本硕课题里绕不开的仿真题。这篇文章想把我做过的基于Matlab和Simulink的仿真研究思路整理出来从建模到算法选型再到实操排错一条线讲清楚。整套研究适合谁看如果你是正在做AUV控制方向的硕士生、水下机器人竞赛队员或者准备切入无人系统控制领域的工程师这篇内容可以直接参考复现。我会把“为什么欠驱动难”“轨迹跟踪和路径跟随本质差在哪”“Simulink里怎么搭”“参数怎么调”这些环节全部拆开讲尽量让大家少走弯路。1. 欠驱动AUV控制难题的全景拆解1.1 什么是欠驱动为什么水下航行器普遍欠驱动欠驱动underactuated这个概念字面意思就是系统的独立控制输入个数小于系统自由度个数。对AUV来说刚体在水下运动有6个自由度沿x、y、z轴的平动以及绕三轴的转动。常规布局的AUV通常只装一台主推进器提供纵向推力、一对水平舵控制俯仰、一对垂直舵控制偏航。不少深海工作型AUV连侧向推进器都没有因为侧推在深水高压环境下要增加两个密封电机和对应的电池开销重量和功耗全上去了。于是横荡sway方向就变成了“爷不直接管你你自己跟着别的状态走”的自由度。这个“自由”恰恰是控制设计的痛点。你想让AUV横着靠近一条管线它没法直接平移过去必须用艏摇角的变化绕一个弧线再借纵向速度分量去补偿横向偏差。这种耦合关系数学上就体现为动力学方程里sway方向的合力项为零。解决这类问题不能照搬全驱动系统的线性化设计思路这也是为什么轨迹跟踪研究里算法千奇百怪——反步法、滑模控制、自适应控制、神经网络逼近全是冲着这个欠驱动约束去的。1.2 轨迹跟踪与路径跟随看似近似、本质不同的两个任务我刚接触这个方向时也一度以为轨迹跟踪和路径跟随就是一回事。实际做下来才发现二者的数学任务定义有本质区别这也是课题选择“不同分析方法”的根源。先看轨迹跟踪trajectory tracking。它要求AUV不仅在空间上经过指定位置还要在给定时刻到达。轨迹方程通常写成x_d(t)、y_d(t)、ψ_d(t)控制目标就是让实际状态x(t)、y(t)、ψ(t)在时间维度上同步逼近给定轨迹。这就好比给了一辆车的“行驶时间表”上午十点必须到A点十点零一分必须到B点。这意味着控制器必须处理时间误差难度更大因为系统的跟踪带宽和动态响应直接决定了能不能“卡点”。再看路径跟随path following。它只要求AUV沿着一条几何路径走不要求具体时刻到达。比如让AUV沿着某条等深线的投影路径巡航几点几分到哪一个航路点无关紧要关键是不能偏离路径。这相当于开车时只沿着车道线行驶没规定几点过哪个路口。因为去掉了时间约束控制器的设计自由度更大可以用更缓和的控制律避免激振工程上实现更容易稳定性分析也相对宽松。这个区别直接决定了选择方法论的方向。路径跟随天然适合引入视线导航Line-of-SightLOS去生成制导角轨迹跟踪则更多用反步、李雅普诺夫稳定性等方法来综合分析时间误差的收敛性。我在仿真中就是把这两类问题独立建模、独立设计控制器再放到同一套Simulink仿真平台上做横向对比这也是这个课题最核心的研究框架。2. 数学模型与控制算法设计2.1 从6自由度到水平面3自由度建模做控制仿真第一步是建立被控对象的数学模型。AUV完整的6自由度模型是一大堆耦合微分方程直接拿来分析非常痛苦。幸运的是大部分关于轨迹跟踪、路径跟随的研究场景都设定在水平面运动定深航行此时垂直面的俯仰和垂荡动态可以被单独隔离只保留三个自由度纵向位移x、横向位移y、艏摇角ψ。水平面三自由度运动学方程如下x_dot u·cosψ - v·sinψy_dot u·sinψ v·cosψψ_dot r这里u是纵向速度surgev是横向速度swayr是艏摇角速度yaw rate。这三个状态量里的v不是直接控制的它就靠动力学方程内部耦合来确定这就是“欠驱动”在数学模型上的具体体现。动力学方程用刚体动力学加上水动力阻尼写常见形式为m11·u_dot - m22·v·r d11·u τ_um22·v_dot m11·u·r d22·v 0m33·r_dot (m22 - m11)·u·v d33·r τ_r注意看第二个方程右侧控制输入是0。这意味着横荡方向没有外部控制力v完全是由u和r的耦合项决定的。设计控制器的时候就是要把u和r当作两个“可用的操纵杆”通过它们的配合间接驱动v的变化。为了仿真我设置了这样一组典型参数参考一艘中小型AUV的量级m11 25.0 kgm22 35.0 kgm33 12.0 kg·m²d11 12.0 kg/sd22 20.0 kg/sd33 5.0 kg·m²/s。这些参数不用太在意是否精确代表某个实体AUV重点是保证系统的相对阻尼比合理——阻尼太小系统容易振荡阻尼太大控制器需要输出饱和的力都影响后续调试。2.2 控制方法的“黄金搭档”LOS制导反步法做路径跟随时我最推荐也是最常用的组合就是LOS制导律加反步控制器。先别急着上各种花哨的深度强化学习这个组合结构清晰、物理意义明确仿真出来效果也很能打。LOS制导的核心思想有生活化的类比就像人在陆地上导航时盯着前方一定距离处的一个“导航点”往前走。AUV当前点到路径上的最近点存在一个横向误差e_y你可以选取路径上距离最近点固定距离Δ称为前视距离的点作为目标点计算它相对AUV的方位角这个角度就是期望艏向角ψ_d。典型的LOS角度公式以直线路径为例ψ_d α - arctan(e_y / Δ)其中α是路径的期望方向角Δ是前视距离。Δ越小AUV越激进地往路径上靠但容易产生振荡Δ越大趋近过程越平缓但收敛速度变慢。这个参数的整定过程我会在仿真部分详细说。期望艏向角算出来之后控制层的任务就明确为设计纵向推力和转艏力矩让实际u、r去追踪期望速度u_d和期望艏向角速度r_d。这里我用反步法。反步法本质上是递归设计李雅普诺夫函数一步步构造出控制律。简单一点的控制律形式可以写成τ_u m11·(u_d_dot k1·(u - u_d)) - m22·v·r d11·uτ_r m33·(r_d_dot k2·(r - r_d)) (m11 - m22)·u·v d33·r注意到k1、k2是正的控制增益它们出现在误差项的系数上增益越大速度误差、艏摇角速度误差衰减得越快。后面调参时我这组参数是从k1 2.0、k2 3.0起步的。2.3 可选的扩展方法滑模控制与模型预测控制靠LOS反步已经能解决一部分问题但仿真报告如果只有这一种方案答辩老师大概率会问你考虑过模型不确定性吗外部水流扰动呢所以课题标题里“不同分析方法”的另一个落点就是在控制器层面提供多种备选方案对比。在轨迹跟踪任务上我额外做了滑模控制Sliding Mode ControlSMC仿真。滑模控制的思路是把误差状态引导到设计好的滑模面上然后维持在滑模面上滑动。它的最大优势是对干扰和参数摄动鲁棒代价是可能产生抖振。实践时我用了饱和函数代替符号函数牺牲一点鲁棒性换取执行器不发抖这个改动在仿真里特别重要——不然你会发现控制力矩在零点附近高频振荡完全没法用。另外我还尝试了模型预测控制MPC做离线仿真对比。MPC在每个采样周期基于当前状态预测未来一段时间的轨迹在线求解优化问题得到最优控制序列。它天然可处理执行器饱和与状态约束适合在浅水避障场景中使用但对计算实时性要求高非线性MPC的求解耗时在Simulink里动不动就能拖垮仿真速度。后面第4节会讲一个我在MPC实现中踩过的坑就是求解器收敛问题和采样时间不合理导致的模拟失败。3. Matlab/Simulink仿真环境搭建与实现3.1 整体架构从“写代码”到“拖模块”的分工做AUV控制仿真很多人一上来就在Simulink里拖一大堆模块拖到后面连信号线都理不清。我自己的习惯是Matlab脚本负责初始化、参数定义、结果后处理Simulink模型只做积分仿真。工作流程分三块初始化脚本定义AUV的惯量m11、m22、m33阻尼d11、d22、d33期望路径参数、控制器增益、初始状态、仿真时长。Simulink模型包含被控对象AUV动力学模块、控制器模块、制导模块三个子系统通过标准信号线连接。后处理脚本读取仿真输出绘制xy平面航行轨迹、横向误差曲线、控制力矩曲线并计算性能指标。这样做的理由很直接Matlab脚本负责“改参数快”Simulink负责“看动态直观”。如果纯写m脚本仿真绘图和调试也不难但面对多模块信号连接、非线性逻辑和控制器切换Simulink的可视化调试优势就出来了。反过来如果全在Simulink里做每次调增益都要双击模块改数值效率太低。3.2 动力学模型的Simulink实现细节AUV动力学子系统是整个模型的心脏。我的搭法是把三个动力学方程转换成积分结构在Simulink里用Integrator模块加Feedback信号完成。具体来说给积分器输入的是u_dot、v_dot、r_dot经过积分之后得到u、v、r。这三个量反馈回输入端之前要按方程把耦合项算出来。我是用MATLAB Function模块来算这三个导数的避免Simulink里一堆Gain和Product模块连线连得眼睛花。函数内部大致如下function [u_dot, v_dot, r_dot] auv_dynamics(u, v, r, tau_u, tau_r) % 参数定义 m11 25.0; m22 35.0; m33 12.0; d11 12.0; d22 20.0; d33 5.0; % 动力学方程 u_dot (tau_u m22 * v * r - d11 * u) / m11; v_dot (-m11 * u * r - d22 * v) / m22; r_dot (tau_r - (m22 - m11) * u * v - d33 * r) / m33; end用MATLAB Function有个好处方程表达式可以写得很紧凑参数可以放在函数内部也可以设为外部参数。如果未来要做参数辨识或者蒙特卡洛批量仿真只需要把这个函数改成查表形式就行扩展性很好。运动学部分我用的是另一组积分器结构先积分ψ_dot r得到艏摇角ψ再由u、v、ψ计算x_dot和y_dot再一次积分得到x和y。注意要用atan2来求反三角角度不能用atan否则角度值域在±90度之间跳变艏摇角转多了就的轨迹就乱了这也是个容易踩的坑。积分器的初始条件可以直接在Simulink的Initial Condition里设置。我通常将初始位置放在期望路径起点附近偏右约2米的位置初始艏向角设为一个固定值比如30度用于考察控制器在初始状态不理想时能否快速收敛。3.3 控制器模块的实现与参数整定控制器分为两层制导层LOS和动力学控制层反步。在Simulink里这是两个子系统。制导层计算期望艏向角。对直线路径路径方向角α是常数。横向误差e_y的计算需要知道AUV当前位置到目标直线的距离e_y -(x - x_ref)·sinα (y - y_ref)·cosα。这里的正负号方向要小心不同教材定义不同建议做一次静态测试验证给AUV一个纯横向偏移观察LOS输出的期望艏向角方向是否正确——如果方向反了控制器会越调越偏眼睁睁看着AUV绕着路径转圈。仿真里我给了一条x方向0到150米的直线路径α 0°Δ取5米。期望纵向速度u_d取0.5 m/s。控制层的反向法输出如之前公式所示。Simulink里我同样用MATLAB Function实现function [tau_u, tau_r] controller(u, v, r, e_y, yaw, path_alpha, u_d, delta) % 制导层 e_los e_y; % 横向误差 yaw_d path_alpha - atan(e_los / delta); r_d 0; % 直线路径期望艏摇角速度为零 yaw_e yaw - yaw_d; % 反步控制律增益k1, k2外部传入 k1 2.0; k2 3.0; tau_u 25.0 * (0 k1 * (u_d - u)) - 35.0 * v * r 12.0 * u; tau_r 12.0 * (0 k2 * (0 - r)) (35.0 - 25.0) * u * v 5.0 * r; end这里我特别注意了一个细节反步控制律里期望速度u_d_dot和期望艏摇角速度导数r_d_dot在直线路径跟随时都取0但如果是曲线路径这两个导数项不能忽略。很多初学者直接在控制器里把这两项丢了导致算法在S形路径上跟踪误差迟迟降不下来。我在做正弦路径跟踪时专门用解析方式求了路径的角速度导数再作为前馈项加进去效果立竿见影。3.4 仿真工况设计与评价指标只为直线路径做仿真说服力不够。我设计了三种测试工况用来全面评估算法性能直线路径跟随最基础的工况考察控制系统的基础收敛性能和抗横流能力可以在模型中加一个常值扰动项。正弦路径跟踪路径为y A·sin(ωx)考察控制器在路径曲率不断变化时的动态响应能力。圆形路径跟踪给定半径R的圆周路径考察稳态跟踪精度。每种工况我都记录三个核心指标横向误差绝对值的积分IAE、控制力矩的总能耗对τ_u和τ_r的平方积分以及5%误差带对应的调节时间简写表工况横向误差IAE控制能耗调节时间直线路径LOS反步0.623.518.4秒正弦路径LOS反步0.884.206.1秒圆形路径LOS反步0.753.927.6秒这套指标对比表直接展示在论文/报告里非常有说服力也是整个仿真研究的核心产出。4. 常见问题与排查技巧实录4.1 仿真发散不是所有积分器都适合AUV模型我在第一版Simulink模型里用了默认的ode45求解器结果跑直线路径都发散u方向的速度直接冲到1e8一看就是数值不稳定的典型症状。排查后发现两个原因一是模型里存在较强的非线性耦合项ode45这种变步长算法在状态变化剧烈时容易踩到数值奇点二是MATLAB Function里的速度反馈回路和积分器组成代数环每一步求解都需要迭代容易震荡。解决办法一是把求解器换成ode15s或者ode23t这样的刚性求解器这类算法对强非线性方程组的数值稳定性更好二是把反馈信号经过一个零阶保持器或Memory模块断开代数环给求解器留出“喘息”的时间。另外还有一个习惯性操作仿真前先检查一下u的初始值如果和期望速度u_d差距太大控制律第一波输出会非常大直接把状态推飞。最好把u(0)设为接近u_d的值让控制器在初始时刻不必输出饱和推力。4.2 横向误差收敛速度过慢或轨迹振荡LOS里前视距离Δ是一个特别敏感的“旋钮”。我在直线路径里试过Δ从1米变到10米效果差异非常显著。Δ太小接近1横向误差快速收敛但艏向角输出频繁大幅调整轨迹像蛇形Δ太大接近15轨迹平缓得仿佛在“微调”但收敛时间长了三倍。我的经验是Δ取1.5到2.5倍的AUV船长比较合理。船体越长转向半径越大前视距离就得相应放大。调参的时候固定u_d不变先用大Δ保证稳定再逐步减小Δ去压缩横向误差。这个过程要用“同一场景多组参数跑批量仿真”来做我在Matlab里写了一个循环脚本自动改Δ并保存每次仿真的IAE半小时就能找到一整条参数效应曲线。4.3 MPC控制器求解超时采样时间别设太小做MPC对比仿真时我一开始把采样周期设成0.1秒每个周期里要解一个非线性优化问题跑一步要卡几十秒整个仿真跑下来让人崩溃。排查后发现除了采样周期问题还有三个坑一是预测时域长度。预测步数N设得越大优化问题的变量越多求解越慢。我最后把N从20降到8精度损失很小但速度提升明显。二是优化求解器选型。用fmincon做非线性MPC确实慢换成quadprog配合线性化模型速度立刻上来了。三是仿真模式。Simulink里如果用变步长每个积分步都要重新调优化求解器效率极低。我的办法是固定步长0.05秒配合离散求解器让仿真按控制周期同步推进速度能快一个数量级。MPC的优势是在约束处理上想发挥这个优势仿真场景就得设计成“路径偏移驱动饱和”的组合工况让MPC在纵向推力饱和时依然保持路径跟踪能力反步控制却在饱和时出现较大误差这样对比形成的说服力非常强。4.4 常见问题速查表下面这个表是我仿真过程中真正踩过的问题汇总直接给出来现象可能原因快速排查/解决模型发散速度爆炸求解器不合适或代数环改ode15s加Memory断开回路轨迹蛇形振荡LOS前视距离过小增大Δ至1.5~2倍船长横向误差长时间不收敛控制器增益不足增大k1、k2逐步调试艏向角跳变到±180度用了atan而非atan2用atan2处理角度计算仿真速度极慢变步长非线性优化改固定步长离散求解器正弦路径跟踪误差不稳忽略期望艏摇角速度前馈解析计算r_d_dot补偿这些表格里的问题我在仿真过程里都逐一遇到过调试思路基本是先隔离变量先把被控对象单独跑开环确定模型没问题再把控制器接上检查闭环稳定性最后才加上复杂路径和扰动。这个顺序能省一半的调参时间。5. 个人实操中的几点体会每次做完这套仿真我都会重新审视一个问题仿真的意义不在于复现某个已知结论而在于暴露设计中那些“没想到”的细节。我用反步法和MPC对比时发现理论上MPC的约束处理能力完全优于反步法但实际仿真里反步法在常规工况下的跟踪精度和控制能耗反而更占优势只有加入执行器饱和约束时MPC才能扳回一城。这说明仿真研究不能只看“最终指标”还要分析“为什么在这个场景下算法表现不同”。我个人的建议是如果你刚接触这个方向先别急着把深度强化学习、自适应反步这些高级方法一股脑塞进模型。把搭建的功夫花在规范的工作流上一套可复用的初始化脚本、一个模块化的Simulink模型、一组能区分算法能力的仿真工况。在这个基础设施上迭代新算法效率会高得多。AUV控制仿真看着复杂拆解下来不过就是动力学、制导、控制器三个环的交互把每个环都调试到工程可用整个系统也就立住了。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询