资讯动态

欠驱动AUV水平轨迹跟踪的全局积分滑模控制设计与仿真

发布时间:2026/10/21 18:44:33 来源:尧图企业网站定制
1. 项目拆解一个看似基础但细节很多的控制问题1.1 为什么欠驱动AUV是工程主流做水下机器人控制这些年我接触过不少实际项目方案一个感受特别明显真正下水跑的AUV九成以上都是欠驱动构型。所谓欠驱动通俗讲就是控制输入的数量小于系统自由度的数量。以水平面运动为例AUV通常只有尾部推进器提供纵向推力和艉舵或艏艉侧推提供偏航力矩而横荡方向也就是侧向基本没有主动执行机构靠的是水动力被动作用。这不是设计者偷懒而是工程妥协的结果。水下空间有限电池舱、电子舱、载荷舱挤得满满当当再加一套侧向推进器成本和功耗都上去了还会破坏流线型外壳。所以欠驱动构型是AUV领域的绝对主流。但欠驱动带来一个麻烦系统是二阶非完整约束系统很多在完整驱动系统上管用的控制方法直接拿过来会失效。比如PID调好了定点悬停一转到轨迹跟踪就抖得厉害或者干脆跟不住。这也是为什么这个领域需要专门研究。1.2 轨迹跟踪与路径跟踪的本质区别先说清楚一个容易被混淆的概念。水平面控制里“路径跟踪”和“轨迹跟踪”是两件不同的事情。路径跟踪只要求AUV收敛到一条几何路径上对时间上没有严格要求路径上点的前进速度可以灵活调整允许“慢一点没关系”。轨迹跟踪要求AUV在指定的时间到达指定的坐标位置是一条带时间标签的曲线跟踪误差通常定义为目标点与实际位置在时间上的偏差。本项目的标题明确写的是“水平轨迹跟踪”所以控制目标就是给定时变参考轨迹 [x_d(t), y_d(t), ψ_d(t)]让AUV的实际状态 [x(t), y(t), ψ(t)] 在有限时间内逼近期望值且误差最终收敛到零。这里有个隐藏难点因为横荡速度不可控AUV在转弯时一定会产生侧滑角drift angle如果控制器不考虑这一点转弯阶段的位置误差会明显增大。很多新手做仿真时发现直线轨迹没问题一上曲线就误差爆发原因往往就在这。1.3 为什么选择全局积分滑模传统滑模的痛点滑模控制Sliding Mode ControlSMC在AUV领域用得很多核心优势是对参数摄动和外界干扰有很强的鲁棒性。但传统滑模有两个先天性问题第一到达阶段的存在。传统滑模面设计下系统状态要从初始位置移动到达滑模面这个阶段系统对外部干扰和参数变化依然是敏感的鲁棒性打了折扣。第二稳态误差较大。纯滑模控制如果参数选得不好在存在常值干扰和模型不确定性的情况下稳态误差并不理想甚至会出现低频抖动。全局积分滑模Global Integral Sliding ModeGISM的改进思路其实很朴素把积分项引入滑模面同时利用滑模面的“初值配置”技巧让系统的初始状态从一开始就落在滑模面上从而取消了到达阶段实现全局滑模运动。打个比方传统滑模是先把小球推向滑道滑道只负责后半程积分滑模是直接从起点挖一条滑道让小球一开始就在滑道上滚。积分项则相当于给系统装了一个“记忆”即使存在常值扰动和建模偏差也能在积分作用下逐步消除稳态误差。这里要强调一个常见误解积分滑模不等于传统的“滑模积分分离PID”。两者虽然都有积分项但积分滑模的积分是设计在滑模面内部通过理论分析能够严格证明系统的全状态空间鲁棒稳定性而PID式积分只是工程上的补丁稳定性是试出来的不是理论保证的。2. 控制方案推导与设计要点2.1 水平面三自由度运动学模型做水平面轨迹跟踪通常取3个自由度位置坐标x北向、y东向艏向角ψ纵向速度u前向速度横荡速度v侧向速度属于“欠驱动”自由度无直接控制力艏摇角速度r运动学方程写出来是这样x_dot u * cos(psi) - v * sin(psi) y_dot u * sin(psi) v * cos(psi) psi_dot r动力学方程简化为水平面标准形式m_u * u_dot F_x f_u m_v * v_dot f_v f_v_dist m_r * r_dot T_r f_r其中F_x是推进器纵向力T_r是偏航力矩f_u、f_v、f_r代表水动力项包括阻尼、附加质量等v通道没有控制输入正是欠驱动性的来源。务实的做法是把模型拆成两个子系统来设计位置环运动学层和速度环动力学层。位置环生成“虚拟控制指令”也就是期望纵向速度和期望艏摇角速度速度环让AUV实际输出逼近期望值。这种内外环结构在工程里最常用调试起来也最直观。2.2 全局积分滑模面设计与趋近律选择为了设计位置跟踪控制器定义位置误差xe x - xd ye y - yd这里有个细节直接在惯性坐标系下设计滑模面是否可行我试过功能上没问题但在参数收敛性和曲线跟踪效果上不如体坐标系下的“视线偏差”结构。建议把位置误差变换到AUV体坐标系ex cos(psi) * xe sin(psi) * ye ey -sin(psi) * xe cos(psi) * ye这样处理后正交分解的物理意义更清楚控制器在物理上也能处理“期望点在前方还是在侧方”的差异。变换之后可以发现前向通道ex主要由纵向速度u控制横向通道ey必须靠艏摇角速度r配合产生趋近运动。这正是欠驱动控制的精髓所在——你无法直接推动船横向走但你可以先转个向再造一个前向速度来完成横向位移。接下来构造全局积分滑模面。传统滑模面通常是s e_dot λe而全局积分滑模面的形式是s1(t) ex_dot lambda1 * ex alpha1 * ∫ex dτ s2(t) ey_dot lambda2 * ey alpha2 * ∫ey dτ关键点在哪里关键在于滑模面的“初值配置”。全局积分滑模的工程实现通常并不是简单把滑模面设在零而是设计成σ1(t) ex_dot lambda1 * ex alpha1 * ∫ex dτ - σ1(0) σ2(t) ey_dot lambda2 * ey alpha2 * ∫ey dτ - σ2(0)其中σ1(0)、σ2(0)是初始时刻计算好的常数。这样做的效果是σ1(0)0也就是说系统初始状态就在滑模面上从头到尾都没有到达阶段。这也是“全局”这个词的来由。趋近律我通常取指数趋近律加饱和函数代替符号函数sigma_dot -k * sigma - epsilon * sat(sigma / phi)这里epsilon不宜取太大否则抖振幅值增大k决定趋近速度但受执行机构饱和限制。饱和层厚度phi一般取0.02到0.1之间具体值要看仿真的时间尺度和误差量级。2.3 稳定性分析与参数选择策略积分滑模的稳定性论证比普通滑模多一步因为滑模面里带着积分项必须证明“滑模面收敛 滑模面内误差收敛”两个环节都成立。第一步比较常规构造Lyapunov函数V 0.5 * σ1² 0.5 * σ2²求导后代入趋近律可以得到V_dot -k1σ1² - k2σ2² - ...只要设计参数k1、k2为正滑模面会指数收敛到零。第二步要证明如σ10、σ20时误差确实收敛到零。把σ1的表达式展开积分滑模面为零对应的其实是误差的“微分方程”ex_dot lambda1 * ex alpha1 * ∫ex dτ - σ1(0) 0对时间求导变成二阶微分方程ex_ddot lambda1 * ex_dot alpha1 * ex 0只要lambda1和alpha1满足劳斯判据也就是二阶特征方程系数都为正状态自然衰减到零。参数选取方面我实践下来有这么一套经验值逻辑lambda比例增益决定误差主导收敛速度取2~6alpha积分增益辅助消除稳态误差取0.5~2不要太大否则容易超调趋近律的k取2~8epsilon取0.1~1饱和层厚度phi先取0.05如果抖振明显再适当加大。需要注意一个工程隐私性问题积分引入会带来“积分饱合”风险尤其是在轨迹切换、初始误差瞬间很大的时候积分项会迅速累积导致超调甚至让后续的轨迹跟踪长时间处于振荡状态。这是全局积分滑模最常踩的坑。我的处理方式是给积分项加限幅一般限到位置误差量级的50%~100%之间让积分“能修正误差但不至于喧宾夺主”。3. 从公式到代码MATLAB/Simulink完整实现3.1 仿真环境搭建准备这个项目的运行环境我推荐的搭配是MATLAB 2022a以上版本 Simulink。需要注意的是Simulink求解器类型要选择“变步长”且允许零点穿越比如ODE45如果追求更快可以使用ODE23但是精度会略低。下面列出工程中需要准备的文件清单主函数脚本main.m负责加载参数、初始化状态、运行仿真并绘图AUV动力学模型可以用Simulink模型.slx也可以写成MATLAB函数块MATLAB Function嵌入控制器模块全局积分滑模控制器建议用MATLAB Function封装便于逻辑修改轨迹生成器生成期望轨迹的时间序列直线、圆形、正弦曲线等后处理脚本读取仿真结果绘制误差曲线和运动轨迹保存数据对于需要反复修改、对比的实验我建议控制律用MATLAB Function块动力学模型用Simulink基础模块搭建。这样控制器迭代方便且动力学部分的积分、信号通道可视化程度高方便排查连线错误。3.2 Simulink模型架构与模块配置Simulink模型的信号流不需要太复杂核心就是一条反馈链轨迹生成器sine、ramp、常数等组合或者From Workspace读取工作区变量输出期望位置[xd, yd]和期望艏向ψd把参考信号和AUV输出状态[x, y, ψ, u, v, r]一起送入位置控制器MATLAB Function块位置控制器内部完成坐标变换、滑模面计算、虚拟控制律生成输出期望纵向速度ud和期望艏摇角速度rdud、rd送入速度控制器仍是MATLAB Function块生成实际控制输入F_x、T_r控制输入接入AUV动力学模型积分模块组成的状态方程模型输出实际状态反馈回控制器。这里有一个非常容易出错的地方坐标变换要用到的艏向角要取实时值而不是期望值。许多新手把 ψ 直接用了 ψd导致跟踪初期误差计算错误后面越偏越远。这类错误在仿真图上看是“轨迹一开始就是乱的”排查方式是把控制器内部信号用Scope或Data Inspector全部拉出来看。3.3 关键MATLAB代码实现下面给出控制器核心代码这是整个项目的灵魂部分。我用MATLAB Function块实现输入为误差状态和增益参数输出为控制律function [F_x_seed, T_r_seed] GISM_controller(...)实际部署时建议把参数用结构体传入避免函数参数列表过长。而模型内部最核心的全局积分滑模算法的伪代码如下% 全局积分滑模位置控制器 % 输入状态量 [x; y; psi; u; v; r] % 参考轨迹 [xd; yd; psid] % 输出期望纵向速度 ud_ref、期望艏摇角速度 rd_ref % 1. 计算惯性系位置误差 xe x - xd; ye y - yd; % 2. 变换到AUV体坐标 c_psi cos(psi); s_psi sin(psi); ex c_psi * xe s_psi * ye; ey -s_psi * xe c_psi * ye; % 3. 位置误差导数近似可通过微分器或观测器获取 % 这里用离散差分近似实际仿真中建议用滤波器 ex_dot (ex - ex_past) / Ts; ey_dot (ey - ey_past) / Ts; % 4. 积分项累加 限幅 int_ex int_ex ex * Ts; int_ey int_ey ey * Ts; int_ex min(max(int_ex, -I_max), I_max); int_ey min(max(int_ey, -I_max), I_max); % 5. 全局积分滑模面含初值补偿 s1 ex_dot lambda1 * ex alpha1 * int_ex - s1_init; s2 ey_dot lambda2 * ey alpha2 * int_ey - s2_init; % 6. 趋近律饱和函数代替符号函数 phi 0.05; sat1 min(max(s1 / phi, -1), 1); sat2 min(max(s2 / phi, -1), 1); % 7. 生成虚拟控制量 ud_ref -k1 * sat1 / (1 eps) u_ref_feedforward; rd_ref -k2 * sat2 r_ref_feedforward;然后速度环只需要做一件简单的事把实际的u和r跟踪到ud_ref和rd_ref。速度环也用积分滑模滑模面形式类似只是被控对象换成u和r。速度环的输出就是纵向力F_x和偏航力矩T_r% 速度环积分滑模 su (u - ud_ref) lambda_u * integral_u_er; sr (r - rd_ref) lambda_r * integral_r_er; F_x mu_hat * (-lambda_u * u_dot_ref ud_ref_ddot ... ) - ku * sat(su/phi_u); T_r mr_hat * (-lambda_r * r_dot_ref rd_ref_ddot ... ) - kr * sat(sr/phi_r);这里mu_hat、mr_hat是模型参数的估计值实际的AUV参数与估计值有偏差但滑模控制对口。注意这里字母hat本身不敏感不必顾虑。3.4 参数初始化脚本与仿真设置matlab脚本部分主参数初始化大致长这样% main.m % AUV模型参数某试验型AUV的典型参数 m_u 120; % 纵向等效质量单位kg m_v 150; % 横向等效质量单位kg m_r 20; % 艏摇等效转动惯量单位kg·m^2 % 水动力阻尼系数一阶近似 du 15; dv 50; dr 8; % 控制器参数 lambda1 3.0; alpha1 1.2; lambda2 2.5; alpha2 0.8; k1 4; k2 5; epsilon 0.8; phi 0.05; I_max 5; % 积分限幅 % 期望轨迹圆形轨迹 xd 20 * cos(0.05*t); yd 30 * sin(0.05*t); psid atan2( yd_dot, xd_dot );仿真时长我一般设置60秒步长根据变步长自动调整。记录间隔设为0.01秒方便回放误差细节。AUV初始位置设在轨迹起点附近偏1米的位置这样既能检验收敛性又不会让初始误差大到控制器一开始就饱和。4. 仿真结果解读与调参经验4.1 典型曲线与达标判断标准运行完成后首要重点是看三组曲线位置跟踪图x-y平面上实际轨迹和期望轨迹叠加结构上如果实际轨迹是一个“绕了半圈开始贴合”的曲线那就说明收敛过程正常。圆形轨迹最容易暴露问题因为它同时考验纵向控制和艏向控制的配合。我调试时的合格标准是进入稳态后通常5秒以后最大位置误差不超过0.1米圆形轨迹跟踪的横向误差保持在0.05米以内。误差曲线图位置误差xe、ye以及艏向误差随时间变化应当呈现快速衰减后小幅波动。若发现误差曲线在零轴附近呈周期性正弦波动通常是前馈通道没做好期望艏向和期望速度的导数没有正确引入若误差缓慢漂移不归零往往是积分项被限幅顶到了或者积分初值没有合理配置。控制输入曲线F_x和T_r随时间变化如果出现高频锯齿说明滑模抖振控制不够。检查饱和层厚度phi有没有加够趋近律的epsilon是否过大。如果控制输入在初始阶段长时间维持上限饱和说明收敛增益偏大或者期望轨迹初始状态不合理需要减小初始误差或软化增益。4.2 常见问题速查与处理方案我在实际反复调试中整理了一张常用问题对照表遇到现象直接查表定位效率最高现象可能原因处理方案初始阶段控制量饱和初始误差过大合理选取初始位置或增大饱和层厚度位置误差发散不收敛艏向角用了期望值做坐标变换改为实时艏向值计算稳态误差缓慢偏置积分限幅太小增大I_max或检查积分初值补偿是否正确圆形轨迹内侧误差大前馈缺失在虚拟控制中添加期望速度的前馈项控制输入高频抖动符号函数开关导致改饱和函数增大phi值曲线跟踪出现相位滞后lambda和alpha比例失衡增大lambda降低alpha加速误差收敛仿真运行极慢求解器容差过小将相对容差调到1e-4绝对容差1e-64.3 调参心得与优化方向调整参数优先级上排第一位的是位置环的lambda和alpha它们决定系统最外环的动态特性第二位是趋近律k和epsilon决定鲁棒性和抖振水平速度环参数一般保持为位置环的2~3倍带宽避免内外环相互作用。拉大带宽差这个方法非常管用。如果内外环带宽接近位置环的误差反馈会带动速度环不断调整形成追逐振荡表现就是轨迹呈明显的锯齿状。我通常把速度环的lambda取到位置环的2倍以上同时保证速度环的仿真步长足够小。继续往后走有几个值得做的扩展方向把恒定干扰海流项加进动力学模型测试全局积分滑模在干扰抑制上的实际性能对比普通PID和传统滑模在同样工况下的误差指标那样更能说明积分滑模的工程价值将控制律改造成抗饱和形式这样即使初始误差比较大的情况控制输入也不会长时间处在限幅状态。根据我以往带项目的经验如果能把这套代码进一步封装成可配置参数的函数库配合一个通用的AUV动力学模型块后续再现其他工况时会非常节省时间。控制器参数通过结构体传入而不是散落在各个模块里也是个大坑——我见过太多因为参数写在不同的地方改一个漏一串排查大半天的例子。这个课题表面上只是“一个算法一次仿真”但它把坐标变换、非线性控制理论、模型仿真验证、参数整定四个环节全部串了起来。搞懂之后换个被控对象比如无人机水平面航迹跟踪、无人艇的路径跟随思路完全可以直接迁移。算法能吃透到什么程度不取决于背了多少公式而取决于你亲手把参数改崩过几次、又把曲线调回来几次。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑