十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

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

第200篇 滑模控制——对扰动“免疫“的强鲁棒方案

第200篇 滑模控制——对扰动“免疫“的强鲁棒方案 上篇聊了Lyapunov稳定性分析非线性控制的基石。有了Lyapunov工具你就能设计各种非线性控制器了。今天聊的滑模控制Sliding Mode Control, SMC就是其中最暴力的一个。滑模控制的核心思想设计一个滑模面让系统状态被吸引到这个面上然后沿着面滑到平衡点。一旦到了滑模面上系统的动态就完全由滑模面决定和系统参数、外部扰动都没关系了。说白了滑模控制把系统强行拽到一条你设计好的轨迹上然后系统就只能乖乖沿着这条轨迹走。不管外面刮风下雨扰动不管系统参数怎么变只要拽的力气够大系统就跑不出你画的道。一、滑模面的设计滑模控制的第一步是设计滑模面s(x) 0。s(x)是一个标量函数对单输入系统它定义了状态空间中的一个面。你希望系统状态最终落在这个面上然后沿着面滑到原点。最简单的滑模面s c*e e_dot其中e x - x_d是跟踪误差c是正常数。s 0意味着e_dot -c*e也就是误差按指数衰减。你选了c就选了收敛速度。c越大收敛越快但对执行器的要求也越高。对高阶系统滑模面的设计更灵活。比如二阶系统s e_dot c1e c2integral(e)。加了积分项可以消除稳态误差和PID的思路类似。二、到达条件和控制律设计滑模面设计好了下一步是让系统状态到达这个面。到达条件reaching conditions * s_dot 0。这个条件的物理意义是当s 0时s_dot 0s在减小当s 0时s_dot 0s在增大。总之s一直在往零靠拢。用Lyapunov方法验证选V 0.5 * s^2V_dot s * s_dot。到达条件s * s_dot 0等价于V_dot 0系统渐近稳定。控制律设计的关键让s * s_dot 0成立。假设系统x_dot f(x) g(x)*u d(t)其中d(t)是未知扰动|d(t)| D。s_dot ... (包含f(x)、g(x)、u和d(t)的表达式)为了让s * s_dot 0控制律通常分两部分u u_eq u_sw等效控制u_eq假设没有扰动d0让s_dot 0算出来的控制量。这个控制量让系统恰好待在滑模面上。切换控制u_sw用来对抗扰动和不确定性。典型形式是u_sw -K * sign(s)其中K D扰动上界。sign(s)是符号函数s 0时输出1s 0时输出-1。把两部分加起来u u_eq - K * sign(s)。验证一下s * s_dot s * (stuff - K * sign(s)) s * stuff - K * |s|。只要K足够大大于stuff的最大值s * s_dot 0就成立。这就是滑模控制的精髓等效控制负责正常行驶切换控制负责对抗一切不确定性。三、抖振问题滑模控制的阿喀琉斯之踵理想滑模控制中sign(s)函数在s0处无限高频切换。实际系统中执行器有延迟和带宽限制这种高频切换会导致严重的抖振chattering。抖振有多严重之前做液压伺服控制的团队滑模控制器一上去液压阀在高频开合油管直接振裂了。这不是段子是真实事故。抖振的危害1执行器磨损加剧寿命缩短2激发系统未建模的高频动态可能导致不稳定3控制信号噪声大下游系统受影响。工程上抑制抖振的常用方法饱和函数替代sign函数把sign(s)换成sat(s/phi)在s接近零的一个小邻域边界层|s|phi内用线性插值代替符号函数。这样控制信号在滑模面附近是连续的不会高频切换。代价是在边界层内丧失了完全的鲁棒性只剩近似鲁棒。高阶滑模把不连续作用放到控制量的高阶导数上。比如super-twisting算法控制量u本身是连续的但u_dot包含sign函数。这样执行器看到的是连续信号没有抖振。高阶滑模是目前研究热点效果很好但设计更复杂。低通滤波在控制信号后面加一个低通滤波器把高频分量滤掉。简单粗暴但会引入相位延迟可能影响稳定性。四、Python代码滑模控制仿真import numpy as np import matplotlib.pyplot as plt # 二阶系统: x_ddot f(x) b*u d(t) # f(x) -2*x_dot - 3*x (标称动态) # b 1.5 (控制增益有不确定性) # d(t) 0.5*sin(2*t) (外部扰动) def sliding_mode_control(): dt 0.001 T np.arange(0, 5, dt) # 滑模面参数 c 5.0 # 滑模面斜率 K 3.0 # 切换增益需大于扰动上界 phi 0.1 # 边界层厚度抑制抖振 # 系统状态 x 2.0 # 初始位置 x_dot 0.0 # 初始速度 x_d 0.0 # 目标位置 x_log [] s_log [] u_log [] for t in T: e x - x_d e_dot x_dot s e_dot c * e # 滑模面 # 等效控制标称模型下让s_dot0 f_nom -2 * x_dot - 3 * x b_nom 1.5 u_eq (1/b_nom) * (-f_nom x_ddot_d - c * e_dot) # x_ddot_d 0 (目标位置恒定) # 切换控制用sat代替sign抑制抖振 if abs(s) phi: u_sw -K * np.sign(s) else: u_sw -K * s / phi # 边界层内线性插值 u u_eq u_sw # 扰动 d 0.5 * np.sin(2 * t) # 系统演化真实动态 x_ddot f_nom b_nom * u d x_dot x_ddot * dt x x_dot * dt x_log.append(x) s_log.append(s) u_log.append(u) return T, np.array(x_log), np.array(s_log), np.array(u_log) T, x, s, u sliding_mode_control() # 可以看到x在约0.5秒内收敛到0s迅速趋近于0 # 控制信号u在边界层附近平滑没有严重抖振这段代码展示了滑模控制的完整流程设计滑模面s e_dot c*e计算等效控制和切换控制用sat函数抑制抖振。仿真中系统在0.5秒内收敛到目标即使有正弦扰动也不影响。五、面试实战Q滑模控制为什么对扰动免疫A一旦系统到达滑模面s0系统动态就完全由滑模面方程决定。等效控制抵消了标称动态切换控制对抗了所有有界扰动。在滑模面上系统对参数变化和扰动不敏感——这叫不变性invariance。Q抖振怎么解决A工程上最常用的方案是边界层饱和函数。学术上最热门的是高阶滑模super-twisting等。两者可以结合使用。面试时你能讲清楚抖振的来源和至少两种解决方案就足够了。Q滑模控制和鲁棒控制有什么区别A鲁棒控制H-infinity等是线性频域的思路用传递函数分析。滑模控制是非线性时域的思路用Lyapunov方法分析。滑模的鲁棒性更强理论上完全不变但代价是控制信号不连续。Q滑模控制在机器人领域有哪些应用A机械臂轨迹跟踪对抗负载变化和摩擦不确定性、移动机器人路径跟踪对抗地面摩擦变化、四旋翼抗风控制。之前有个做水下机器人的团队用滑模控制对抗水流扰动效果比PID好很多。小结滑模控制是一种强鲁棒的非线性控制方案。核心思想设计滑模面到达条件让系统状态被拽到滑模面上然后沿面滑到平衡点。一旦在滑模面上系统对参数变化和扰动完全免疫。代价是抖振——sign函数的不连续切换会激发高频动态。工程上用边界层饱和函数或高阶滑模来抑制。滑模控制是Lyapunov方法的直接应用——选V0.5*s^2设计控制律让V_dot0。理论和实践完美结合。下篇聊阻抗控制——让机械臂温柔地与环境交互。不再是纯粹的位置/力控制而是控制机械臂的动态行为。如果这篇文章对你有帮助欢迎点赞、在看、转发三连。 你的支持是我持续更新的最大动力。「机器人软件开发面试·从入门到精通」连载系列上一篇第199篇 非线性控制基础——Lyapunov稳定性分析下一篇预告第201篇 阻抗控制——让机械臂温柔地与环境交互有任何问题欢迎评论区留言我会尽量回复。
返回列表