1. 滑模控制的“顽疾”:抖振与切换的博弈

如果你接触过滑模控制,那你一定对“抖振”这个词不陌生。它就像是滑模控制这位武林高手身上一个难以根治的“内伤”。我刚开始做电机伺服控制项目时,就被这个问题折腾得够呛。理论上,滑模控制鲁棒性强,对参数变化和外部干扰不敏感,听起来简直是工程上的“万金油”。但一上实物,电机就发出刺耳的“滋滋”声,控制信号在高频段剧烈跳变,不仅磨损执行机构,还严重影响系统的稳态精度和动态性能。

这种抖振的根源,就在于传统滑模控制中的不连续切换函数,最常见的就是符号函数 sign(s)。当系统状态轨迹穿越滑模面 s=0 时,控制律会瞬间从一个极值跳变到另一个极值。理想情况下,这个切换是无限快的,系统状态会被“钉”在滑模面上。但现实中,开关器件有延迟,执行机构有惯性,测量有滞后,这一系列的非理想因素导致状态轨迹无法精确地沿着滑模面滑动,而是在其两侧来回穿越,形成高频、小幅度的振荡,这就是抖振。

为了解决这个问题,工程师们最早想到的办法是边界层法,也就是用饱和函数 sat(s/Φ) 来代替符号函数。在边界层 |s| < Φ 内,控制信号是连续的线性反馈;在边界层外,则切换为恒值。这个方法确实能显著削弱抖振,我实测下来,电机噪音小了很多。但它带来了一个新问题:饱和函数在边界层边界点(s=±Φ)处是不可导的。这意味着它的导数不连续,存在一个“尖角”。在很多高级控制策略中,比如需要基于切换函数设计自适应律、或者需要分析高阶滑模时,这个不可导的特性就成了绊脚石,会让后续的数学分析和控制器设计变得非常棘手。

那么,有没有一种函数,既能像饱和函数一样平滑地过渡、抑制抖振,又能在整个定义域内连续且光滑可导呢?答案是肯定的,这就是我们今天的“主角”——双曲正切函数。它就像一个更聪明、更圆滑的“和事佬”,在保持滑模控制核心鲁棒性的同时,巧妙地化解了切换带来的剧烈冲突。接下来,我们就深入看看这个函数到底有何魔力。

2. 双曲正切函数:一个更“圆滑”的切换器

2.1 数学特性与直观理解

双曲正切函数 tanh(x) 的表达式大家应该不陌生:

tanh(x/ε) = (e^(x/ε) - e^(-x/ε)) / (e^(x/ε) + e^(-x/ε))

其中,ε 是一个大于零的关键参数,它控制着函数从 -1 到 1 的过渡速度。ε 越小,过渡越陡峭,越接近符号函数;ε 越大,过渡越平缓。

我们可以把它和符号函数 sign(x)、饱和函数 sat(x/Φ) 放在一起对比,就能立刻看出它的优势:

特性符号函数 sign(s)饱和函数 sat(s/Φ)双曲正切函数 tanh(s/ε)
连续性不连续(在s=0处跳变)连续,但不可导(在s=±Φ处有“尖角”)全局连续且光滑(无穷阶可导)
输出范围{-1, 1}[-1, 1](-1, 1),渐近趋近于±1
抖振抑制无,抖振严重好,但牺牲了边界层外的鲁棒性优秀,且全局连续可导
数学处理困难,存在微分包含在边界点处理麻烦方便,易于进行稳定性分析和高级设计

从图像上看,tanh 函数是一条光滑的“S”形曲线。它没有跳变,也没有尖角。当系统状态 s 远离零时,它的输出无限接近 ±1,保证了类似符号函数的强鲁棒性;当 s 接近零时,它平滑地过渡到零附近,避免了剧烈的控制量变化,从而有效抑制了抖振。

这里有个非常关键的性质,也是后续证明系统稳定性的核心:对于任意实数 x,都有 x * tanh(x/ε) ≥ 0。这意味着函数的输出符号始终与输入 x 保持一致,这是保证滑模控制“趋近律”方向正确的关键。另一个性质是 |x| - x*tanh(x/ε) ≤ με,其中 μ ≈ 0.2785。这个不等式告诉我们,用 tanh 近似 sign 函数所产生的误差是有界的,并且这个误差上界由参数 ε 直接控制。ε 越小,近似精度越高,但过渡越陡峭,可能引入高频成分;ε 越大,平滑效果越好,但会引入更大的稳态误差。如何权衡这个参数,是工程实现中的一门艺术。

2.2 为什么是“连续切换”?

在滑模控制的语境里,“切换”的本质是对不确定性和干扰的强力纠正。传统符号函数的切换是“硬碰硬”的 bang-bang 控制,而双曲正切函数实现的是一种 “连续切换”“软切换”

你可以这样想象:符号函数像是一个严厉的教练,队员一旦偏离预定跑道,就立刻大声呵斥让他猛冲回来;而双曲正切函数更像是一个有经验的教练,他会根据队员偏离的远近,用不同大小的声音提醒。偏离越远,提醒的力度越大(输出趋近±1);偏离很近时,只是轻声纠正(输出接近0)。这种力度连续变化的方式,使得控制动作更加柔和,系统状态的回归过程也更平滑,自然就避免了因“用力过猛”而产生的抖振。

这种连续性带来的最大好处,就是为控制器的进一步设计和分析打开了方便之门。比如,你可以对包含 tanh 的控制律直接求导,用于设计高阶滑模或观测器;你也可以更方便地应用李雅普诺夫稳定性理论,因为函数是光滑的,求导和不等式处理都变得清晰明了。我在设计一个需要在线更新参数的自适应滑模控制器时,就深刻体会到了这一点,使用 tanh 函数让自适应律的推导顺畅了许多。

3. 实战推演:从理论到控制律设计

光说不练假把式,我们用一个经典的二阶系统例子,把基于双曲正切函数的滑模控制器设计过程完整走一遍。这个过程我会尽量讲得细一些,包括我当初理解时踩过的“坑”。

3.1 被控对象与问题定义

考虑一个常见的转动系统,比如一台直流电机的位置伺服控制,其模型可以简化为:

J * θ¨(t) = u(t) + d(t)

这里:

  • J 是系统的转动惯量,假设我们已知其标称值,但实际中可能存在误差。
  • θ(t) 是电机转子的实际角度。
  • u(t) 是我们设计的控制输入(比如电机的控制电压或电流)。
  • d(t) 是集总干扰,包括未建模动态、外部负载扰动、摩擦力等。我们假设这个干扰是有界的,即 |d(t)| ≤ DD 是一个已知的正数。这个假设很实际,因为实际物理系统的能量不可能是无限的。

我们的控制目标是让电机的角度 θ(t) 能够快速、准确地跟踪上一个期望的轨迹 θ_d(t)。这个期望轨迹可能是固定的角度(位置调节),也可能是一个时变信号(轨迹跟踪)。

3.2 滑模面与误差定义

首先定义跟踪误差:

e(t) = θ_d(t) - θ(t)

那么误差的一阶导数就是速度跟踪误差:

e˙(t) = θ˙_d(t) - θ˙(t)

滑模控制的核心是设计一个滑模面,一旦系统状态“滑”到这个面上,就会产生理想的动态特性。对于这个二阶系统,我们通常设计一个线性滑模面:

s(t) = c * e(t) + e˙(t)

其中 c > 0。这个滑模面设计非常巧妙:当系统状态被约束在 s(t)=0 上时,误差的动态方程就变成了 e˙ = -c e。这是一个一阶指数稳定的微分方程,意味着误差 e(t) 会以指数速度 c 收敛到零!所以,控制器的任务就是想方设法把系统状态“拉”到滑模面 s=0 上,并维持在上面。

3.3 李雅普诺夫稳定性分析与控制律推导

这里我们使用控制理论中强大的工具——李雅普诺夫直接法。我们构造一个候选的李雅普诺夫函数:

V(t) = 1/2 * s(t)²

显然,V(t) 是正定的。如果它的导数 V˙(t) 是负定的,那么 V(t) 就会衰减,s(t) 就会趋向于零,我们的目标就达到了。

V 求导:

V˙ = s * s˙ = s * (c * e˙ + e¨)

代入系统动力学方程 e¨ = θ¨_d - θ¨ = θ¨_d - (u+d)/J,得到:

V˙ = s * [c*e˙ + θ¨_d - (u+d)/J]

为了让 负定,我们设计控制律 u。一个经典的设计思路是让 满足:

V˙ ≤ -η * s²   (η > 0)

这样就能保证 s 指数收敛。我们把设计好的控制律 u 代入 的表达式,反推 u 应该长什么样。基于双曲正切函数的设计如下:

u = J * [θ¨_d + c*e˙ + η*s] + D * tanh(s/ε)

这个控制律由三部分组成:

  1. 前馈补偿项 J * θ¨_d:用于抵消期望加速度带来的影响。
  2. 状态反馈项 J * (c*e˙ + η*s):其中 η*s 是保证趋近速度的指数项,c*e˙ 与滑模面定义相关。这部分构成了一个等效的线性反馈控制,负责将系统状态驱动到滑模面附近。
  3. 鲁棒项 D * tanh(s/ε):这是核心。用 D * tanh(s/ε) 来估计和补偿未知干扰 d(t) 的上界 Dtanh 函数在这里平滑地实现了切换。

3.4 稳定性证明与稳态误差分析

现在把设计好的控制律 u 代回 的表达式:

V˙ = s * [c*e˙ + θ¨_d - ( {J*[θ¨_d+c*e˙+η*s] + D*tanh(s/ε) + d} ) / J ]
     = s * [c*e˙ + θ¨_d - θ¨_d - c*e˙ - η*s - (d + D*tanh(s/ε))/J ]
     = -η * s² - (s/J) * [d + D*tanh(s/ε)]

接下来利用双曲正切函数的关键性质。我们知道 -s * D * tanh(s/ε) ≤ -D|s| + Dμε。同时,干扰有界 |d| ≤ D,所以 -s*d ≥ -|s|*D。结合这两点:

-s * [d + D*tanh(s/ε)] ≤ -|s|D - s*D*tanh(s/ε) ≤ Dμε

因此:

V˙ ≤ -η * s² + (Dμε) / J

你看, 并不总是负的。当 s 很小,使得 -η*s² 这一项小于 (Dμε)/J 时, 可能为正,s 可能会增大。但这并不意味着系统不稳定,而是意味着状态轨迹最终会被吸引到一个有界的区域内,而不是精确收敛到零点。

我们可以解这个微分不等式。把它看作一个关于 V 的微分方程 V˙ = -2ηV + (Dμε)/J(因为 s² = 2V)。这个方程的解是:

V(t) ≤ [V(0) - Dμε/(2ηJ)] * e^(-2ηt) + Dμε/(2ηJ)

当时间 t 趋向于无穷时,V(t) 的稳态值满足:

V(∞) ≤ Dμε / (2ηJ)

也就是说,滑模变量 s 的稳态幅值满足 |s(∞)| ≤ sqrt(Dμε / (ηJ))。这是一个非常重要的结论!它告诉我们:

  1. 稳态误差是存在的,并且与 D(干扰上界)、ε(双曲正切函数的平滑参数)、η(趋近律增益)和 J 有关。
  2. 我们可以通过调节参数来权衡性能
    • 减小 ε:可以减小稳态误差,但会使 tanh 函数更陡峭,可能重新引入高频抖振。
    • 增大 η:可以加速收敛过程,并减小稳态误差,但过大的 η 会要求过大的控制能量,可能在实际执行器中饱和。
    • 干扰 D 越大,稳态误差也越大,这符合直觉。

所以,基于双曲正切函数的滑模控制,本质上是用一点点可调的稳态误差,换来了控制信号的连续性和抖振的显著抑制。在实际工程中,只要这个稳态误差落在允许的精度范围内,这个交换就是非常值得的。

4. 仿真实例:手把手搭建模型与结果分析

理论分析完了,我们上机实操,用 MATLAB/Simulink 来验证一下。我强烈建议你跟着步骤做一遍,仿真跑出来的波形比任何文字都更有说服力。

4.1 仿真模型搭建

我们使用原文中的参数:

  • 转动惯量 J = 10 kg·m²。
  • 期望轨迹 θ_d(t) = sin(t) rad,这是一个正弦跟踪任务。
  • 外加干扰 d(t) = 50 * sin(t) N·m,干扰幅值很大,达到了控制量级的50%,专门用来测试控制器的鲁棒性。
  • 初始状态 [θ(0); θ˙(0)] = [-0.5; 0.8]
  • 控制器参数:c = 0.5, η = 10, D = 50, ε = 0.02

在 Simulink 里,我们可以这样搭建模型:

  1. 被控对象模块:用一个积分器链实现 θ¨ = (u+d)/J。输入是 u+d,除以 J 后积分得到速度 θ˙,再积分得到位置 θ
  2. 轨迹生成模块:用 Sine Wave 模块生成 sin(t),同时用 Derivative 模块(或自己搭建微分器)得到 θ˙_dθ¨_d注意:实际中直接对信号微分会放大噪声,这里仿真为简化可以这样用,实物中需要用观测器或安排微分器。
  3. 误差计算模块:计算 e = θ_d - θe˙ = θ˙_d - θ˙
  4. 滑模面计算模块s = c*e + e˙
  5. S-Function 控制器模块:这是核心。我们写一个 S-Function,或者用 MATLAB Function 模块来实现控制律 u = J*(θ¨_d + c*e˙ + η*s) + D*tanh(s/ε)。代码非常直观:
    function u = smc_controller(de, s, ddthd)
        % 输入: de = e˙, s = 滑模变量, ddthd = θ¨_d
        % 输出: 控制量 u
        c = 0.5;
        eta = 10;
        D = 50;
        eps = 0.02;
        J = 10;
        u = J * (c*de + ddthd + eta*s) + D * tanh(s/eps);
    end
    
  6. 干扰模块:用另一个 Sine Wave 模块生成 50*sin(t),加到控制输入上。

4.2 仿真结果与深度解读

运行仿真后,我们重点关注三个图:位置跟踪曲线、控制输入 u(t) 的波形、以及误差 e 的相轨迹。

位置跟踪曲线:你会看到,尽管存在一个幅值高达50的大干扰,系统的实际位置 θ(t) 仍然能非常快地跟上期望的正弦信号 θ_d(t)。初始的误差在很短时间内就被消除,之后的跟踪误差几乎肉眼难以分辨。这直观地展示了滑模控制强大的鲁棒性——干扰被有效地抑制了。

控制输入 u(t) 波形:这是最能体现 tanh 函数价值的地方。如果你曾经用传统的符号函数 sign(s) 做过仿真,你会看到控制信号 u 是剧烈抖动的方波,频率很高。而在我们这次的仿真中,u(t) 是一条连续、光滑的曲线!它随着误差和滑模变量的变化而平滑地调整大小,完全没有高频跳变。这对于真实的物理执行器(如电机驱动器、液压阀)来说是极其友好的,能大大降低磨损和发热,也更容易通过低通滤波器。

误差相轨迹(e vs. e˙):这是分析系统稳态性能的关键。相轨迹描绘了系统状态在误差空间中的运动路径。理想情况下,如果跟踪完美,相轨迹应该收敛到原点 (0,0)。但在我们的结果中,你会看到相轨迹收敛到了一个非常小的、近似椭圆形的极限环上,它围绕原点做周期运动,但并不经过原点。这个极限环的大小,就对应着我们前面理论分析中提到的稳态误差

为什么是椭圆?因为我们的期望轨迹和干扰都是正弦信号,稳态误差也是周期性的。这个极限环的半径大小,直接由参数 Dμε/(2ηJ) 决定。你可以尝试修改仿真中的 ε 参数,比如把它从 0.02 增大到 0.1,再跑一次仿真。你会发现:

  • 控制输入 u(t) 变得更加平滑,波形更圆润。
  • 但是,误差相轨迹的极限环变大了!稳态跟踪误差增加了。 这就是我们前面说的权衡(Trade-off):用 ε 来调节平滑度(抑制抖振)和精度(稳态误差)。你需要根据实际系统的要求来仔细调节这个参数。

4.3 参数调节心得与“踩坑”指南

根据我多年的项目经验,调节这类控制器参数有个大致流程,可以帮你少走弯路:

  1. 先调线性部分 (c, η):暂时把鲁棒项 D*tanh(s/ε) 设为零,或者把 D 设为一个很小的值。先让系统在无大干扰情况下,依靠 cη 能较好地跟踪。c 主要影响滑模面上的动态(误差收敛速度),η 影响趋近滑模面的速度。可以先根据期望的误差收敛速度粗略确定 c(例如,希望误差在0.5秒内衰减到5%以内,可取 c ≈ 3/0.5 = 6),然后调节 η 使响应快速且无超调。
  2. 加入干扰,初调鲁棒项 (D):加入干扰,将 D 设置为已知干扰上界的一个估计值。观察控制输入是否饱和,以及跟踪误差是否在可接受范围。如果控制输入饱和,可能需要降低 ηD;如果跟踪误差太大,可以适当增大 D(但不要超过实际执行器的能力)。
  3. 精细调节平滑参数 (ε):这是抑制抖振的关键。从一个较小的值(如0.01)开始,观察控制信号。如果还有你不希望看到的高频毛刺,逐步增大 ε,直到控制信号变得光滑。同时,密切监视跟踪误差。一旦误差开始超出你的容忍范围,就说明 ε 太大了,需要往回微调。一个实用的技巧是ε 的取值可以与滑模变量 s 的“噪声水平”或测量分辨率相关联。例如,如果 s 的测量噪声幅值约为0.1,那么 ε 可以设为0.1左右,这样在 |s| < 0.1 的范围内,tanh 函数起到很好的平滑滤波作用。
  4. 迭代与折中:参数调节往往不是一蹴而就的。你可能需要在响应速度(大 η)、控制能量(u 的幅值)、平滑度(大 ε)和稳态精度(小 ε)之间反复权衡。务必在仿真中模拟最恶劣的工况(最大干扰、参数最差情况)来测试控制器的鲁棒性。

我踩过的一个“坑”是,一开始为了追求极致平滑,把 ε 设得很大(比如0.5),结果在干扰突变时,系统响应变得很迟钝,跟踪误差明显变大。后来明白,tanh 函数虽然平滑,但本质上是一个“饱和”函数,过大的 ε 会过早地“饱和”,削弱了控制器在滑模面附近的纠正能力。所以,没有最好的参数,只有最适合当前系统约束和性能要求的参数

5. 进阶思考:双曲正切函数的局限与扩展

双曲正切函数虽然优秀,但也不是银弹。理解它的局限性,能帮助我们在更复杂的场景下做出正确选择。

5.1 稳态误差的根源与改进思路

我们前面的理论推导已经明确指出,使用 tanh 函数会引入与 ε 成正比的稳态误差。这是因为在滑模面 s=0 附近,tanh(s/ε) ≈ s/ε,控制律中的鲁棒项近似为 (D/ε)*s,变成了一个线性反馈项。它虽然连续,但对抗恒定或慢变干扰的能力在原点附近被削弱了。

如何改进?工程上有几种常见思路:

  1. 与边界层法结合:在边界层 |s| < Φ 内使用 tanh 函数,在边界层外直接切换为符号函数 sign(s)。这样既保证了边界层内的连续性,又保留了边界层外最强的鲁棒性。控制律可以写为:

    u_robust = D * sign(s),          if |s| >= Φ
    u_robust = D * tanh(s/ε),        if |s| < Φ
    

    这里 Φ 是边界层厚度,通常 Φ 略大于 ε 以保证平滑衔接。

  2. 自适应调整 εD:让平滑参数 ε 或干扰上界估计 D 不再是固定值,而是根据系统状态自适应变化。例如,当 |s| 较大时,使用较小的 ε 以获得更强的趋近能力;当 |s| 较小时,使用较大的 ε 以获得更好的平滑效果。这需要设计额外的自适应律,复杂度会增加,但性能可能更优。

  3. 与其他干扰估计技术结合:这是目前研究的热点。既然 tanh 在抑制抖振的同时削弱了鲁棒性,那我们就把干扰估计出来并补偿掉。常用的方法有:

    • 干扰观测器:设计一个观测器来实时估计 d(t),然后在控制律中直接减去这个估计值。这样,滑模控制器只需要对付估计的残差,这个残差通常很小,因此可以用更小的 D 和更大的 ε,进一步抑制抖振。
    • 自适应控制:在线估计干扰的上界 D 甚至系统参数 J,让控制器能自适应于对象的变化。
    • 智能控制:利用模糊逻辑或神经网络来在线调整 ε 或直接逼近不确定部分。

我在一个机械臂项目中就采用了“滑模控制 + 干扰观测器 + 双曲正切函数”的组合。干扰观测器负责处理大部分已知动力学和慢变干扰,而滑模控制中的 tanh 项则用来处理观测器的估计误差和未建模的快变干扰。实测下来,控制电机的声音非常安静,轨迹跟踪精度也比单纯用滑模或PID控制高出一个数量级。

5.2 在更复杂系统中的应用

我们演示的是最简单的二阶积分器型系统。在实际中,比如机器人、飞行器、电机驱动等领域,系统往往是非线性和耦合的。但基于双曲正切函数的滑模控制设计思路是通用的。

对于形如 x˙ = f(x) + g(x)u + d 的一般非线性系统,设计过程通常是:

  1. 定义跟踪误差和滑模面 s
  2. 选取李雅普诺夫函数 V = 0.5 * s²
  3. V 求导,得到包含 的表达式,而 中包含 u
  4. 设计控制律 u,使得 负定或满足类似 V˙ ≤ -ηV + δ 的不等式。其中,非线性部分 f(x)g(x) 如果已知,可以被精确补偿;未知部分和干扰 d 则由鲁棒项 D(x)*tanh(s/ε) 来处理,这里的 D(x) 可能是状态相关的干扰上界。

关键在于,无论系统多复杂,tanh 函数始终扮演着那个“平滑的仲裁者”角色,将不连续的切换转化为连续的调节,使得整个控制律 u 是光滑的,从而可以直接应用于需要对控制量求导或需要连续控制信号的场合。

6. 总结与工程实践建议

回顾整篇文章,我们从滑模控制的抖振问题出发,深入探讨了双曲正切函数作为连续切换函数的原理、设计和实现。它的核心价值在于,用一个可调参数 ε,巧妙地平衡了控制系统的鲁棒性、连续性和稳态精度

对于正在考虑在实际项目中应用滑模控制的工程师,我的建议是:

首先,明确你的需求。 如果你的执行机构对高频开关信号非常敏感(如精密光学平台、柔性机械臂),或者你的控制算法后续需要求导(如基于 backstepping 的嵌套设计),那么基于双曲正切函数的连续滑模控制是一个非常好的起点。

其次,仿真必须充分。 在写一行实际代码之前,用 Simulink 或 Python/Matlab 搭建详细的模型,包括执行器的饱和、死区、测量噪声和延迟。在不同 ε 值下,测试系统对阶跃指令、正弦跟踪以及各种干扰的响应。记录下控制信号的频谱,看看高频成分是否被有效抑制。

再次,参数调节要循序渐进。 记住那个调节顺序:先调线性性能 (c, η),再调鲁棒增益 (D),最后精细调节平滑参数 (ε)。ε 的选取与你对稳态误差的容忍度直接相关。不妨做一个参数扫描,画出 ε 与跟踪误差均方根 (RMSE)、控制信号变化率 (TV) 的关系曲线,能帮你直观地找到那个“甜蜜点”。

最后,做好实机调试的准备。 仿真再完美,和实际系统也有差距。在实机上电调试时,务必从非常保守的参数开始(较小的 ηD,较大的 ε),在确保系统基本稳定和安全的前提下,逐步向仿真中得到的最优参数靠拢。同时,一定要做好监控,实时观察控制输出是否饱和,以及关键状态变量是否在预期范围内。

滑模控制是一个强大而深邃的领域,双曲正切函数只是我们手中一件好用的工具。理解其背后的权衡哲学——用可控的稳态误差换取控制的平滑性与可实现性,这或许比掌握工具本身更为重要。在实际工程中,这种基于深刻理解的折中艺术,往往是解决复杂控制问题的关键。希望这篇结合了理论推导和实战仿真的解析,能帮你更自信地将这个工具应用到你的下一个项目中去。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐