首页 / 资讯中心 / 文章详情

AUV深度控制滑模控制器设计:从建模到Simulink仿真实现

AUV深度控制滑模控制器设计:从建模到Simulink仿真实现 ★ FEATURED ARTICLE
水下机器人调试的时候最折磨人的往往不是机械结构而是你在岸上把参数调得漂漂亮亮一下水就发现完全换了一套脾气。我之前在某高校实验室做无人潜航器的控制仿真时就有切身体会最开始用PID做深度控制实验室理想环境下表现还行可一旦把非线性水动力项和外部流干扰加进模型PID那组参数就明显压不住了。后来把控制器换成滑模控制SMC从Matlab和Simulink仿真一路做到半实物测试一套控制结构管到底。今天这篇就把这套AUV滑模控制器的设计、建模和仿真实现思路完整拆一遍给正在做水下机器人控制、想用Simulink快速验证SMC算法的读者一份能直接复现的参考。这篇内容你能拿到的东西很明确一个可以动手跑通的AUV垂直面深度控制仿真模型一套从误差状态到滑模面再到控制律的完整推导流程加上我当时在仿真里遇到的各类奇奇怪怪的问题和对应排查思路。不是纯理论罗列是那种写完代码、跑完仿真、被波形坑过之后才总结出来的东西。1. AUV建模的一笔账要知道自己在控制一个什么样的系统1.1 别急着上六自由度按控制目标砍维度水下机器人的完整运动模型是六自由度三个平动加三个转动光是整理惯性矩阵、科氏力矩阵、阻尼矩阵就能写满好几页推导。如果一上来就把六自由度模型塞进Simulink控制器还没写光参数校对就能耗掉两三天。工程上更常见的做法是按照控制任务把自由度砍掉先在一个平面或一条轴向上把控制器逻辑验证清楚。我做的是垂直面深度控制所以状态只保留垂向位置z和垂向速度w水平面的航向和位置默认由另一套控制器稳住。简化后的状态方程长这样x1 z垂向位置x2 w垂向速度x1_dot x2m·x2_dot τ Δ - c1·x2 - c2·|x2|·x2。其中τ是垂向推力Δ是净浮力与重力之差c1是线性阻尼系数c2是平方阻尼系数。这个模型不算精密但足够支撑控制器设计也方便在Simulink里用积分器直接搭出来。为什么我坚持保留|c2·x2|·x2那个平方阻尼项因为水下机器人在速度稍微起来之后水动力阻尼明显不再线性。实际测试里正是这个非线性阻尼会让按线性模型设计的PID控制出现持续振荡。我第一次建模图省事把阻尼项全部按线性近似仿真出来的深度响应曲线和后面实机记录的数据对不上后来把平方阻尼项加回去曲线走势才基本吻合。1.2 模型参数的不确定性才是SMC上场的原因模型参数大体可以分三类质量、排水体积、净浮力这些通过称重和体积测量就能标定出来精度很高阻尼系数c1和c2通常靠CFD估算加约束水槽试验获取误差30%都很正常剩下的就是海流、波浪这类时变外扰根本没法精确建模。参数有误差这件事本身正是SMC能站住脚的根本原因。SMC的控制律里模型参数只用于估计等效项未建模动态和外扰只要其边界已知切换项就能强行把它们抵消掉。也就是说阻尼系数估算偏了只要偏差在一定范围内控制器照样能完成跟踪任务只是代价是控制量抖振会略微变大。在Simulink里做模型我建议把已知参数统一放进一个结构体变量。比如param.m 180、param.rho_g_V 9800、param.c1 28、param.c2 40后面加干扰往结构体里加字段就行。这样参数改动不会散落在各个模块里调完一组参数也方便留档换工况时直接加载不同的结构体即可。提示建模这一步花的时间基本占整个项目的一半。模型和实体之间的偏差没搞清楚之前控制器设计得再漂亮放进仿真里也就是一场漂亮的空转。2. 滑模控制器设计的推导过程从误差状态到控制律2.1 滑模面是什么为什么要引入它深度控制的本质是让z跟踪期望深度z_d。定义深度误差e z_d - z速度误差de dz_d - w。如果直接对这些误差做比例微分控制产出就是一个带前馈的PD控制器抗模型失配的能力很有限。SMC换了一个思路构造一个误差状态空间中的“滑模面”让系统状态先被吸引到滑模面上再沿着滑模面滑向平衡点。最常用的一阶滑模面写出来就是s de λ·eλ是一个正的设计常数决定系统在滑模面上的收敛速度。这个式子值得多看两眼当s恒等于0时de -λe误差会以指数速度收敛到零。也就是说把原来二阶误差系统的控制问题转换成了如何让s快速归零并保持为0的问题。这里的s可以理解成一座桥把高维误差动态降成一阶动态之后所有控制精力都放在“把s推向零”这件事上。2.2 等效控制加切换控制一套控制律打天下的底气要推导控制律就对s求导。把前面AUV模型的动力学方程代入并加入期望加速度项可以整理出如下控制律τ m·(d²z_d λ·de k·s ε·tanh(s/φ)) c1·w c2·|w|·w - Δ这个式子分两部分看。前一部分是等效控制包含期望加速度前馈、滑模面误差修正和趋近项作用是把系统状态稳定地引导到滑模面上后一部分是对非线性动态的补偿把阻尼力和浮力重力差直接抵消掉。切换项ε·tanh(s/φ)则专门用来对抗模型不确定性和外部扰动其中ε要大于扰动上界才能保证系统状态被“拽”到滑模面上。这里有一个理论前提必须强调切换项的幅值必须大于外部扰动和模型不确定性的上界之和否则到达滑模面的条件不成立系统会一直徘徊在滑模面附近无法收敛。但ε又不能取得太大否则控制量抖振剧烈执行器寿命和功耗都受影响。工程上常见的做法是在2到3倍扰动上界之间先保守取值跑到仿真里观察响应再逐步往下压。2.3 符号函数换成平滑近似抖振问题在源头上的第一个解法我第一次实现SMC时直接用符号函数sgn(s)仿真波形总算能跑通但把控制输入τ的曲线拉出来一看高频振荡非常夸张。这就是SMC出了名的抖振问题。抖振的根源在于符号函数在滑模面附近产生理想的高频切换控制器输出在正值和负值之间反复跳跃。仿真里看波形只是不好看放进实物里执行器根本扛不住传动机构也会被迫高频磨损。处理抖振最直接的修改就是把sgn(s)换成饱和函数或者tanh函数。具体替换为ε·sgn(s) → ε·tanh(s/φ)其中φ是边界层厚度。φ取很小的值时tanh可以近似符号函数φ取较大值时切换项变得更平滑抖振减弱但抗扰性也下降。我个人更偏好tanh因为它的曲线连续可导在边界层内没有转折点对控制输出的平滑性更好。饱和函数sat(s/φ)在边界层边界处有个折角虽然也能用但生成的控制信号不如tanh自然。以我前面那个简化AUV模型为例初始参数大致可以取λ0.5、k5、ε2.5、φ0.5。需要注意这个组合只对那个模型有效。不同质量和水动力条件下的AUV参数差异非常大。大型UUV和微型ROV之间质量和阻尼系数甚至可以差出两三个数量级照抄参数没有任何意义理解每个参数的作用才是关键。3. Simulink仿真架构搭建从零到能跑通模型3.1 顶层模块怎么切分整个仿真模型在顶层可以分成四块信号源、控制器、被控对象、数据记录。信号源负责生成期望深度z_d以及它的一阶、二阶导数控制器根据状态误差算出控制量τ被控对象就是AUV动力学模型输入控制力和干扰输出速度和位置数据记录包括Scope示波器和To Workspace模块把关键信号写进工作区供后续分析。模块之间的信号线我一定建议命名或者在连线上用Goto/Local标签方式管理。刚开始贪图省事全部用直连线模块一多之后根本分不清哪根线是期望速度、哪根线是反馈深度排查问题的时候只能一根根往回捋非常痛苦。命名信号线之后双击连接线就能看到信号含义排查效率能提高一半。3.2 用MATLAB Function块实现SMC控制器在Simulink里写SMC控制器最直接的方式是放一个MATLAB Function块把控制律完整地写成一个函数。下面是我当时用的核心代码模型参数从函数输入端传入便于统一整定function tau smc_controller(z_d, dz_d, ddz_d, z, w, lambda, k, epsp, phi, m, c1, c2, delta) e z_d - z; de dz_d - w; s de lambda * e; sat_s tanh(s / phi); f_estimate c1*w c2*abs(w)*w - delta; tau m * (ddz_d lambda*de k*s epsp*sat_s) f_estimate; end这个函数基本就是2.2节控制律的代码化。特别提醒一下正负号问题tau的符号取决于AUV模型的推力方向约定我调试时因为正负号没对齐出现过深度往反方向跑的情况。如果你复现时发现曲线方向不对最先检查的就是模型里τ的正方向和状态方程里的符号约定是否一致。还有一个实操细节期望深度的一阶、二阶导数不要用Simulink的Derivative模块对期望深度信号求导。Derivative模块本质上是数值微分信号稍微有点噪声导数曲线就会出现毛刺进而污染控制量。更干净的做法是在信号源里直接解析构造导数比如用Ramp和Step组合出梯形速度剖面再解析求导得到期望加速度根源上消掉数值噪声。3.3 被控对象两个积分器就能搭出AUV模型被控对象建得越复杂仿真越容易被数值问题干扰而掩盖控制算法的真实表现。我建议先用两个积分器串联搭简化模型逻辑非常直观计算总加速度acc (τ - c1·w - c2·|w|·w Δ d) / m加速度经过第一个积分器得到速度w速度再经过第二个积分器得到位置z状态反馈回控制器构成闭环。注意干扰d一定要加在被控对象模型的加法器里而不是加到控制器前馈路径上这样控制器并不知道干扰的精确值才能在仿真中真正检验SMC的抗扰能力。如果干扰提前告知了控制器那仿真结果就只是自欺欺人。搭建积分器模型的时候最好把m、c1、c2、delta这些参数做成外部输入而不是写死在Gain模块的数值里。这样后面参数整定直接改工作区变量或封装层参数就行免去每次打开模型找模块改数的麻烦。3.4 求解器配置固定步长和变步长怎么选Simulink求解器配置是很多人容易忽略的坑。连续模型默认用变步长ode45对多数系统没问题但SMC中含有快速切换机制即使做了tanh平滑切换动作也比较陡。我实际测试下来变步长求解器会自动缩小步长来捕捉快速动态仿真速度会明显下降而且个别工况下还会出现数值刚性导致的震荡。更稳妥的方案是先用变步长ode45快速验证算法逻辑等参数基本确定后切到固定步长求解器步长取1e-3秒或更小做最终的性能评估。步长选择有个简单的权衡逻辑步长太大快速切换项可能被跨过导致仿真结果失真步长太小仿真时间成倍拉长调参效率低。我一般先用1e-3秒做日常调参最后评估阶段再用1e-4秒跑一组最终数据归档。3.5 示波器里该看什么信号很多人做SMC仿真只盯深度跟踪曲线看着曲线贴上了就觉得算法有效。实际上真正判断SMC控制器工作状态的信号是滑模面s。建议同时观测这五路信号z和z_d的跟踪曲线判断最终控制精度速度w曲线判断运动状态是否合理控制输入τ曲线判断执行器负载是否可接受滑模面s曲线这是最核心的指标切换项输出曲线判断抖振程度是否可控。判断逻辑非常直接如果s曲线没有收敛到零附近说明切换项强度不够系统根本没进入滑模运动如果s能在零附近但围绕零的震荡幅度很大说明边界层太窄或ε过大。先看清楚了s的形态再动参数比盯着深度曲线瞎猜高效得多。4. 仿真调试的真实过程发散、震荡和参数整定思路4.1 现象一一运行就发散控制量直接爆表我完成第一版搭建后最常遇到的情况就是仿真一启动控制量瞬间冲到几百深度曲线直接飞掉。这个问题的排查经验可以沉淀成一张表现象可能原因排查手段解决办法深度朝反方向跑控制量符号约定和模型方向不一致断开控制器用固定正推力开环看z变化方向检查τ的正方向和状态方程符号统一约定控制量瞬间爆表滑模面初始值太大切换项饱和观察s曲线初值在控制器输出端加饱和限幅或设计状态约束的控制目标深度发散但控制量正常期望加速度前馈缺失或错误检查dz_d和ddz_d是否由信号源正常提供补上解析导数前馈响应曲线振荡且发散正反馈回路反馈信号极性接反检查反馈回路的加减法连接点确认误差定义和反馈极性一致排查顺序我总结成了三步先看s曲线再看控制量最后看深度。很多发散问题只要看s就明白了比如s在高频震荡且幅值不衰减说明切换项不够或者趋近律参数不合适如果s直接单调增大说明符号方向搞反了或者期望导数的符号有问题。先看s能帮你在前两步定位到大部分问题。4.2 现象二能跟踪但抖振明显执行器曲线上全是毛刺在参数粗调合格后最常见的问题就是抖振。切换项里的tanh虽然平滑了符号函数的突变但边界层φ取得太小控制量依然会有明显的高频分量。处理抖振我一般按照三个方向依次尝试不必一上来就大改参数第一步观察φ是否过小。把φ从0.1往0.5方向调看τ曲线的毛刺是否明显减少。要注意此操作会让稳态误差略微增大属于权衡。第二步适当减小ε。如果当前ε已经超过实际干扰的2倍以上就可以逐步下调。第三步考虑切换项改为自适应边界层让φ随|s|的大小动态变化|s|大时φ大平滑趋近|s|小时φ小保持精度。还有一种更“曲线救国”的办法是把趋近律换成指数趋近律的改进形式比如加一个-η·s项让趋近速度随s幅值自动变化本质上就是增加线性趋近项来减少切换频率。这个改法在仿真中效果明显但设计工作量也会增加适合对SMC有一定理解之后再尝试。4.3 调参顺序和效果对比SMC参数整定的顺序非常关键我自己的经验是先定λ再定k最后定ε和φ。λ决定滑模面的斜率和误差收敛速度如果λ太大期望加速度前馈会放大执行器容易饱和λ太小系统响应慢。定住λ后再调kk控制s趋近零的速度相当于把系统“推向滑模面”的力度。ε和φ放在最后是因为它们直接影响稳态性能和抖振幅值依赖于前两个参数已经稳定。下面是我在简化模型上做的一组典型调参对照参数调整响应变化注意点λ增大收敛加快深度响应变灵敏过大会引发执行器饱和和超调k增大s更快归零到达滑模面的时间缩短过大会让控制量初期偏大ε增大抗扰能力增强稳态误差减小抖振同步增强要监控控制量φ增大抖振减弱控制量平滑稳态精度下降跟踪误差变大可以把λ想成“误差收敛的阶梯”k想成“把s拽回零的绞盘”ε则是“对抗外力的保险丝”。调完一轮之后不要急着改下一组先把波形存下来最好是叠加对比图。只凭肉眼目测很难判断前面那组参数到底差在哪里但把新旧曲线叠加之后超调量、调节时间、稳态误差差多少一目了然。5. 从理想仿真走向半实物验证干扰、离散化和执行器约束5.1 把干扰造得真实一些基础仿真里的干扰通常就是一个阶跃或者正弦波。这个测试太温柔了实际水下环境中的干扰是低频浪涌加高频噪声叠加出来的。我一直推荐给模型加组合干扰d 500·sin(0.2·t) 80·randn第一项模拟慢变海流第二项模拟波动与传感器噪声。组合干扰会让SMC的切换项始终处于动态对抗中能够检验控制器在不同干扰频段下的表现。如果在这种干扰下深度跟踪误差还能保持在允许范围再去面对真实水域时心里才有底。另外还要考虑执行器饱和。AUV推进器或舵面能提供的力是有限的控制律算出来的τ被限幅之后实际上是一个非线性环节。把Saturation模块加在控制器输出和被控对象输入之间再重新跑一遍你会发现参数可能要整体回调因为饱和限幅等效于减小了系统增益原来的λ和k在饱和边缘工作时容易诱发极限环振荡。执行器变化率约束也可以通过Rate Limiter模块加进去模拟电调响应速度对防止实际作动器损坏很有帮助。5.2 连续控制律的离散化处理Simulink里默认的连续控制器到了嵌入式环境必须离散化。最简单的做法是采用前向欧拉法把每一拍的控制计算改成s_k de_k λ·e_kτ_k m·(ddz_d,k λ·de_k k·s_k ε·tanh(s_k/φ)) c1·w_k c2·|w_k|·w_k - Δ这里的采样周期T_s要和实际控制器的控制周期一致。T_s太大会导致离散化误差放大切换项在滑模面附近可能来回穿越T_s太小又给执行器带来不必要的计算负担。我一般先用T_s0.02秒做离散化仿真和连续系统对比结果再逐步调整。离散化之后之前连续仿真里看不到的离散抖振现象会显现出来这是正常的。这里有一个容易被忽略的坑连续系统仿真中φ取0.5没问题离散化后同一组参数在20毫秒采样周期下可能震荡明显。原因是离散化降低了系统对滑模面附近动态的感知精度边界层厚度的有效作用变小了。遇到这种情况适当放大φ相当于用边界层把离散误差也包住是最简单有效的对策。5.3 仿真结论怎么约束实测预期仿真验证只能证明算法原理和参数方向是对的不能证明参数可以直接搬到实物。真实AUV的阻尼系数、海流强度、传感器延迟都和仿真模型有偏差实测时几乎注定要重新调一遍参数。我能给的实操建议是仿真中不要把参数整定到极限状态留出20%到30%的裕量。比如最优ε在2.5附近那实测就从3.0起步往回调φ也稍取大一点先保证执行器不抖振再逐步收紧精度。这样能让从仿真到水下测试的跨度小很多。在半实物验证环节我的习惯是先用固定深度阶跃测试最简工况确认系统方向正确之后再切换到梯形深度剖面测试跟踪性能最后才上正弦轨迹加干扰的复杂工况。分级测试的好处是一旦出问题能直接定位到是控制器逻辑、执行器响应还是干扰模型出了问题而不是所有问题混在一起无从下手。我个人在做这个项目时最大的体会是SMC给AUV控制带来的不是某组神奇的参数而是一种设计思路先定义误差收敛方式再用切换项兜住所有模型误差和外部扰动。这个思路在仿真环境中验证起来非常快因为Simulink天然适合这种控制器与被控对象分离的架构。如果你准备在自己的AUV项目里尝试SMC我的建议是从最简模型开始先跑通一条深度控制链路确认滑模面信号在示波器上乖乖归零之后再一步步增加自由度、干扰和离散化复杂度。每一步只引入一个新变量排查起来才不会手忙脚乱。
阅读完成 · 觉得有帮助?
咨询建站