ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

滑模控制从原理到工程实践:滑模面、趋近律与抖振抑制全解析

滑模控制从原理到工程实践:滑模面、趋近律与抖振抑制全解析 翻过几本非线性控制教材的朋友大概率见过那种经典相轨迹图一条状态轨迹从远处猛冲过来撞上一条斜线然后在这条斜线两侧来回穿越、贴着它滑进原点。这个过程有个专门的名字叫滑动模态而把它当控制策略来用的方法就是滑模控制Sliding Mode ControlSMC。我最早接触它是在做机电伺服系统的时候当时被一个参数时变、还带负载扰动的对象折腾得不轻PID在某个工况下调好了换一个工况又不行后来换滑模控制才第一次体会到什么叫“对系统参数变化不敏感”。这篇博文就从“滑模控制到底在干什么”讲起把滑模面的设计、趋近律的选择、控制律推导、稳定性验证串成一条完整的线再用一个二阶跟踪系统的例子带大家从头到尾走一遍设计流程最后重点聊聊仿真和实物之间最大的拦路虎——抖振以及我在工程调试中沉淀下来的一些参数整定方法。内容适合正在学非线性控制的在校学生也适合刚想把滑模控制引入自己项目的工程师参考全程不端着、不绕弯子直接讲能落地的思路。1. 滑模控制到底是什么一个“非黑即白”的鲁棒策略1.1 一个直觉把系统状态往“滑轨”上赶很多人第一次听“滑模控制”这个名字会有点懵总感觉是个特别高深的东西。其实它背后的物理直觉非常简单如果你想把一个球送到山顶与其精确计算每一次推力不如在山上修一条螺旋轨道让球先撞到轨道上然后沿着轨道滚上去。轨道上的运动被轨道本身的几何形状约束住了球滚到哪、滚多快都和你推它时那些不确定因素没什么关系。在滑模控制里这条“轨道”就叫滑模面。系统的状态被控制器强行“赶”到滑模面上一旦到达后续动态就由滑模面的几何系数决定而不是由系统原始参数决定。这一点说白了就是滑模控制的鲁棒性不是靠精确抵消扰动而是靠改变系统的运动几何结构。当系统在滑模面上“滑动”时等效出来的动态方程只和滑模面系数有关和原来的系统参数无关。对于一个二阶系统来说这意味着哪怕模型里的惯量、阻尼、增益都发生了偏移只要控制器能把状态按到滑模面上系统最终呈现的动态表现依然是滑模面方程决定的样子。这种“结构决定动态”的思路和PID那种“调节增益适应对象”的思路完全不同。1.2 和PID、状态反馈相比滑模的特殊之处PID控制器的本质是“误差比例-积分-微分”它依赖对象模型的地方很少但增益必须根据工作点在线整定工况一变可能就要重新调。状态反馈控制能把闭环极点任意配置前提是你得有一个相当精确的线性模型。滑模控制的定位正好在两者之间它需要知道系统的模型结构比如“这是二阶的”“控制增益方向是什么”但不需要精确的参数值。它对满足匹配条件的参数摄动和外部扰动具有天然的不变性这是它和PID之间最本质的差别。代价是控制律里带符号函数那样的不连续项会激发高频抖振。它天生就是非线性的不依赖在工作点附近做线性化因此在大范围运行工况下仍然能保持一致的控制品质。换句话说PID适合“对象简单、工况稳定”的场景状态反馈适合“模型清楚、扰动小”的场景而滑模控制更适合“模型结构清楚但参数不确定、外加负载扰动不可忽略”的场景。这种定位决定了它的出头场合往往是电机驱动、飞行器控制、电力电子变换器、机械臂这些“跑得快、扰动多、还需要一定精度”的领域。1.3 两个阶段趋近运动和滑模运动滑模控制器的整个工作过程可以切成两段理解这两段对后面的参数整定极其重要。第一段叫趋近运动。系统状态还在滑模面以外控制律要把状态往滑模面上拽。这个过程是全局性的需要满足可达条件也就是状态和滑模面的距离要单调缩小。第二段叫滑模运动。状态已经贴在滑模面上之后系统沿着滑模面滑向平衡点。这段动态由滑模面系数决定鲁棒性就在这里展露头角。这两段对应着控制律里两类不同的项。负责趋近的是切换项比如 ε·sgn(s)它提供“把状态压回滑模面”的能力负责滑模面上动态的是等效控制项它根据模型状态推算出来维持滑模运动所需的“平均控制量”。后面设计控制律的时候教科书大多会把完整控制律写成这两部分叠加u u_eq u_sw。这个拆解不是数学游戏它让每一个参数都有了清晰的物理含义——等效控制负责“保持”切换项负责“纠偏”二者各司其职。2. 拆开核心构件滑模面、可达条件、趋近律与等效控制2.1 滑模面先定义“系统该怎么收敛”设计滑模控制的第一步是设计滑模面。对一个相对阶为1的二阶系统最常用的是线性滑模面s c·e ė其中 e 是跟踪误差c 是待设计的大于零的系数。当系统进入滑模运动时 s 0就有 ė -c·e。这说明误差在滑模面上是指数收敛的收敛速度由 c 直接决定c 越大误差衰减越快但 c 太大会放大测量噪声太小系统又拖泥带水。对高阶系统滑模面通常写成状态误差的线性组合核心要求只有一个滑模面方程对应的多项式要是 Hurwitz 稳定的也就是特征根全部在左半平面。这是滑模面设计唯一绕不开的硬约束。很多人问滑模面为什么一定要设计成这个样子。因为它本质上是把“要系统稳定”和“要系统鲁棒”这两个目标解耦了滑模面只负责定义系统的理想动态控制律只负责把状态压到这条曲线上。滑模面就像你给团队定的目标流程控制律则是管理手段两者各管一段逻辑非常清晰这也是滑模控制便于工程落地的一个原因。2.2 可达条件凭什么保证能到得了滑模面光有滑模面还不够控制器必须保证系统状态最终会撞上滑模面而且一旦在滑模面附近出现偏离趋势还能被拉回来。这个性质就是可达条件。最经典的形式是s·ṡ 0这个式子意思很直白当 s 0 时ṡ 必须为负让 s 往下降当 s 0 时ṡ 必须为正让 s 往上升。也就是说无论从哪个方向看滑模函数的值都在被“压”向零。这跟日常生活中“只要位置偏离目标速度就要让它回来”的直觉完全一致。这个条件也可以用 Lyapunov 函数的语言来理解。定义正定的 V ½s²它的导数是 V̇ s·ṡ。只要 V̇ 0s 的能量就一直在衰减状态就一定会趋向滑模面。后面的控制律设计大多会在这一步做稳定性验证因此 s·ṡ 0 既是设计依据也是项目评审和论文里最常被检查的环节。写论文和做项目汇报的朋友建议把这个不等式的推导写规范评审人对这一点的关注度非常高。2.3 趋近律不同“奔向滑模面”的策略知道了目标还得选策略。趋近律就是决定“状态以什么速度、什么方式逼近滑模面”的规则。常见的有这么几种等速趋近律ṡ -ε·sgn(s)。速度恒定为 ε实现最简但性能也最糙ε 小则趋近慢ε 大则进了滑模面附近容易抖。指数趋近律ṡ -k·s - ε·sgn(s)。当 s 远离零时-k·s 起主导作用让状态加速冲向滑模面当 s 接近零时-ε·sgn(s) 起主导作用用来抵抗扰动。这是我最常用的一个形式。幂次趋近律ṡ -k·|s|^α·sgn(s)其中 0 α 1。远离时大增益快冲接近时小增益缓贴抖振比等速小但参数多一个调试略麻烦。双幂次趋近律等改进形式则是工程实践里为了进一步平衡“快”和“柔”做的更细的调节。我的建议是初学阶段先用指数趋近律因为它参数物理意义明确k 决定趋近速度ε 决定最终对抗扰动的能力和抖振强度调起来直观。等把指数趋近律的各种手感都摸透了再根据实际系统需求去试更复杂的趋近律。2.4 等效控制与切换控制滑模控制律的“分式表达”现在可以做完整的控制律设计了。以系统x f(x, x, t) g(x, x, t)·u d(t)为例其中 f 是已知或部分已知的非线性函数g 是控制系数d 是有界扰动。设计流程是对滑模面 s c·e ė 求导得到 ṡ 的表达式令 ṡ 0 且忽略扰动解出来的控制量就是等效控制 u_eq它代表维持 s 不变所需的“标称控制力”然后在 u_eq 基础上叠加上切换项得到完整控制律u u_eq - (ε/g)·sgn(s)这里最关键的理解是切换项的增益 ε 必须大于扰动的上界。因为只有 ε 的“拉力”比扰动大才能保证 s·ṡ 0系统才能对抗扰动并把状态拉回滑模面。如果 ε 不够大扰动就可能把系统推出滑模面鲁棒性就无从谈起。后面讨论减小抖振时所有方法的本质都在于在不破坏这个不等式的前提下把切换项的实际力度降下来这也是整个滑模控制工程化的主线。3. 手把手设计一个滑模控制器二阶跟踪系统全流程3.1 问题表述与建模假设我们来看一个典型的机电位置伺服系统。假设对象的运动方程是J·θ b·θ u d(t)其中 θ 是转角位置J 是等效转动惯量b 是粘滞阻尼系数u 是控制力矩d(t) 是集总扰动包括负载力矩、摩擦力矩、参数偏差等。目标是让 θ 跟踪给定的光滑轨迹 θd(t)比如一条正弦曲线或者 S 形阶跃曲线。这里需要做两个假设一是 J 和 b 的真实值可能未知但要知道标称值和大概的变化范围二是扰动 d 有界|d| ≤ DD 是已知上界。这两个假设在实际工程里几乎总是能成立尤其是第二个只要对负载特性有个粗略的估计就能拿到一个扰动上界不需要多精确。3.2 从误差动态到控制律的完整推导定义跟踪误差 e θ - θd选取线性滑模面 s c·e ėc 0。当 s 0 时ė -c·e误差指数收敛。对 s 求导ṡ c·ė ë c·ė (u d - b·θ)/J - θd取指数趋近律ṡ -k·s - ε·sgn(s)代入上式解出 u。这里先把扰动 d 的补偿交给切换项去承担控制律写出来是这样的u J·[θd (b/J)·θ - c·ė - k·s - ε·sgn(s)]这个式子看着长拆开看其实就三块θd 和 (b/J)·θ 用来前馈补偿系统动力学- c·ė 用来平衡滑模面动态- k·s - ε·sgn(s) 是趋近律驱动的反馈项。在程序里实现时先算 e 和 ė再算滑模面 s 和符号函数最后按上式直接输出 u整个过程就是几行代码的事。3.3 Lyapunov 稳定性验证与参数约束设计完控制律必须做稳定性验证。取候选 Lyapunov 函数 V ½s²求导V̇ s·ṡ s·[-k·s - ε·sgn(s) d/J] -k·s² - ε·|s| s·(d/J)因为 |d/J| ≤ D/J所以可以放缩成V̇ ≤ -k·s² - ε·|s| (D/J)·|s| -k·s² - (ε - D/J)·|s|只要ε D/J就有 V̇ 0系统状态必然在有限时间内到达滑模面并且一旦到达不会离开。这个不等式就是参数选择的硬约束切换增益必须大于归一化扰动的上界否则系统可能发散。我见过不少同行的仿真发散回头一查都是 ε 取的比扰动上界还小稳定性条件从来没满足过。3.4 仿真参数选择与初值效果分析以 J 0.01 kg·m²、b 0.1 N·m·s/rad 的典型电机对象为例扰动取 d 0.5·sin(2πt) 0.2·sgn(θ)。取滑模面系数 c 20趋近律系数 k 50切换增益 ε 5 试试看。这里要特别注意算一下扰动上界D 0.5 0.2 0.7D/J 70而我们取的 ε 5 远小于 70。除非扰动估计值能被前馈补偿掉大部分否则这个参数组合在理论上就不满足稳定性条件仿真必然发散。正确做法是至少把 ε 提高到 70 以上但这会带来非常剧烈的抖振更聪明的做法是引入干扰观测器补偿掉大部分扰动让剩下需要切换项扛的那部分扰动上界只剩百分之几此时 ε 取到 5 甚至更小就能稳定抖振也小得多。如果初始误差是 e(0) 0.1、ė(0) 0在 s 较大时 -k·s 主导趋近过程状态会快速奔向滑模面到达后误差按照 e 0.1·exp(-20t) 的速率指数收敛。仿真里你能看到 s 在零点附近快速穿越控制量 u 的波形上出现毛刺状的高频切换这就是抖振在仿真里的体现。4. 抖振理论与实物之间的“那道坎”4.1 抖振产生的底层机理理想滑模控制要求切换项以无穷大的频率在 s 0 和 s 0 之间来回切换才能实现“状态一偏离就瞬间拉回”。但物理世界没有无穷大频率数字控制器的采样周期是有限的执行器也有响应延迟。当系统状态越过滑模面之后控制器要等下一个采样周期才能意识到再发出反方向控制量这期间状态已经偏离了一段。于是系统不是在滑模面上平滑滑动而是在滑模面两侧做高频来回穿越宏观上表现为高频振荡。抖振幅度和切换增益 ε 正相关ε 越大单次“推过头”的距离越远。这就是初学者最苦恼的地方理论上 ε 越大鲁棒性越强但它带来的抖振又会激发系统未建模动态、造成机械磨损、产生刺耳噪声。滑模控制工程化的核心矛盾说白了就是“在保证 ε 大于扰动上界的前提下把实际作用到系统上的切换幅度降下来”。4.2 边界层法最朴素但有效的折中最容易想到的办法是把符号函数 sgn(s) 换成饱和函数 sat(s/φ)其中 φ 是边界层厚度。当 |s| φ 时饱和函数输出还是符号作用不变当 |s| φ 时饱和函数变成线性比例项控制量从跳变变成平滑过渡。边界层法的优点是实现极其简单改一行代码就行缺点是引入静态偏差——在边界层内部切换项不再是全力回拉扰动会把状态推离 s 0 一个小的距离形成稳态误差。φ 越小稳态误差越小但越接近符号函数抖振又会冒头φ 越大控制越平滑跟踪精度越低。我的经验是先把 φ 压得比较小观察系统能否稳定然后逐步增大 φ找到一个“跟踪精度还能接受、抖振又明显下降”的临界点。边界层法适合做第一版实机验证但不大适合高精度跟踪场合精度和抖振的矛盾始终是硬伤。4.3 干扰观测器补偿让切换增益小下来边界层法是在“出力大小”上做文章干扰观测器则是在“敌人强弱”上做文章。既然 ε 必须大于扰动上界那如果把扰动估计出来并前馈补偿掉剩余扰动就只是估计误差上界远小于原始 Dε 自然就能调小抖振也随之显著下降。最常见的实现方案是扩张状态观测器Extended State ObserverESO把扰动 d 作为系统的一个扩展状态用观测器在线估计然后把估计值 d_hat 补偿进控制律u J·[θd (b/J)·θ - c·ė - k·s - ε·sgn(s)] - d_hat这样切换项需要对抗的扰动从 d 变成 d - d_hat。只要 d_hat 能跟上 d 的主要变化ε 就能降一个数量级。这个方案的工程代价是要多调几个观测器增益但收益非常明显。我在实际项目里凡是上滑模控制的对象基本都会搭一个 ESO这几乎成了标配组合。4.4 高阶滑模与超螺旋算法连续的鲁棒性如果对精度和抖振同时有要求值得关注另一个方向是二阶滑模尤其是超螺旋Super-Twisting算法。它的基本形式是v -λ·|s|^(1/2)·sgn(s) zż -W·sgn(s)这里切换动作被放到了辅助状态 z 的导数里实际控制量 v 是连续的。所以超螺旋算法能在保持有限时间收敛和抗扰能力的同时显著降低抖振。代价是参数 λ、W 的整定不像指数趋近律那么直观而且对采样频率和测量噪声更敏感。工程上我建议先用干扰观测器把抖振压到可接受范围如果系统对控制量连续性要求极高比如直接驱动的高精度运动平台再考虑上超螺旋。一上来就直接上复杂算法往往会在参数整定上浪费大量时间不如从简单方案一步步升级。5. 工程调试经验参数整定顺序与常见坑5.1 参数整定的先后顺序很多新手拿到滑模控制器上来就把三四个参数随机调一通结果系统要么发散要么抖振飞起根本说不清问题出在哪。我自己的做法是一条线走下来每调一个参数只盯它管的那项指标。先定滑模面系数 c。这个参数决定滑模面上的误差收敛带宽。在不明显放大噪声的前提下取尽量大的值先得到一个能接受的跟踪响应速度。再调趋近律系数 k。k 决定远离滑模面时状态被拉回来的速度观察 s 的波形让 s 在超调不过大的情况下尽快回零。最后调切换增益 ε。从理论估算的扰动上界出发逐步减小直到系统不发散、抖振可接受、稳态误差符合要求。这个顺序的核心思想是先固定系统在滑模面上的动态再调趋近过程最后处理鲁棒性和抖振的平衡。调 ε 时一定要结合 s 的波形如果 s 在零点附近来回穿越的幅度越来越大说明 ε 太小扰动快要顶不住了如果 s 基本稳定但控制量高频大幅摆动说明 ε 太大。5.2 从仿真到实物最容易翻车的地方仿真里系统是理想的采样是连续的执行器是无限带宽的但实物不是。从我接触的项目来看最常翻车的有这几个地方采样周期限制了可实现的切换频率。滑模控制在 1 kHz 采样下可能表现得不错换到 200 Hz 就可能剧烈抖振甚至失稳。因为采样周期越大切换滞后越严重。这时候加大边界层或者上观测器更靠谱而不是死磕 ε。测量噪声会被 c 放大。滑模面里的 ė 通常是用位置差分得到的差分会放大高频噪声c 越大放大越厉害。更好的做法是对位移信号做低通滤波或者用观测器去估计速度别直接用差分。执行器饱和。如果算出来的 u 超过电机或舵机的输出极限切换项就会失效状态会被推到远离滑模面的地方再要收敛回来需要时间系统会表现出“软绵绵”的不稳定感。设计时要预留控制余量别让 ε 大到控制量常态性顶进饱和限幅。模型符号方向搞错。滑模控制对控制系数 g 的符号非常敏感如果符号标错了控制量方向就反了系统飞出去是必然的。上实物之前务必先做一次开环极性测试确认控制方向没问题再闭环。5.3 什么时候适合用滑模控制什么时候别硬上滑模控制不是万金油。如果一个对象用 PID 简单调一调就能满足指标真没必要为了“显得先进”去上滑模因为它的高频切换和参数敏感性会带来额外的复杂度。但如果对象满足下面这些条件滑模控制就很值得考虑系统的模型结构相对明确至少知道阶次和控制方向。参数会在运行过程中变化或者负载扰动明显PID 扛不住。需要在大范围工况下保持一致的动态品质而不是只在工作点附近有效。有足够的控制带宽和采样频率让切换项能正常工作。还有一类对象要慎重液压系统等执行器带宽低、延迟大的场合不连续控制量很难有效实现滑模控制的效果会打折扣。这种时候我会优先考虑连续化的高阶滑模或者滑模与 PID 混合的结构而不是硬上经典滑模。5.4 几个亲测有效的实用技巧最后分享几个我在具体项目里反复验证过的小技巧。第一所有滑模控制器的仿真模型里一定要加一个离散采样模块和一个执行器延迟模块。不加这两个模块的仿真基本都“过于完美”你根本看不出控制器有什么问题加了之后仿真里出现的抖振幅度和实物表现就很有相关性了。第二用 s 的波形而不是误差波形作为调试主窗口。误差波形是二阶动态叠加的结果看不太清楚问题s 的波形直接反映滑模面的距离趋近段和滑模段切换在哪一目了然。我调试时会把 s 和 u 两个变量一起录下来对着看调参效率会高很多。第三在切换项前面加一个“软开关”很管用。比如当系统刚从大幅扰动中恢复、s 还很大的时候让切换项全力工作等 s 进入边界层内部之后再平滑过渡到连续控制。这比固定边界层厚度更能兼顾不同工况。第四如果控制器要交付给现场维护人员出资料时一定要把参数裁减到最少每个参数旁边写清楚“调了会有什么变化”。滑模控制本身参数不多但每个参数影响多个指标没有注释的话现场人员很容易乱调最后调崩了还得你远程救火。最后说说我个人的体会滑模控制我学了这么多年、做了这么多年最大的感受是它提供了一种面对不确定性的体面姿态——你不需要精确知道扰动到底是多少只需要知道它大概有多大就能设计出保证稳定和性能的控制律。但这绝不代表它可以不调参、不看实物。每一套滑模控制器从仿真到真机几乎都要经历一次“抖振妥协”这个过程没有标准答案只有你对对象的理解和对参数物理意义的把握。如果你正在学滑模控制建议从二阶系统的指数趋近律入手把 s 和 u 的波形看明白再逐步引入观测器和高阶滑模。理论看懂是一回事把模型落到 Simulink 里、把算法写成嵌入式代码还能稳定工作那才算真正入门。
返回列表