4. 滑模控制(SMC)基本原理与设计方法
各位好,今天我们聊滑模控制。说实话,这玩意儿在飞行器控制里是个狠角色。我做了十几年嵌入式飞控,遇到非线性、参数摄动、外界干扰这些头疼问题时,滑模控制往往能派上大用场。
为什么?因为它天生就对不确定性不敏感。你想想看,传统PID调参调得再好,遇到大风天或者机体老化,性能还是会掉。滑模控制不一样,它有一种「硬扛」的劲头。
4.1 滑模控制的核心思想
滑模控制,说白了就是设计一个「滑模面」,然后让系统状态强行滑到这个面上,再沿着面滑到平衡点。
我习惯用一个比喻来解释:想象你在滑雪。你要从山顶滑到山脚,但雪道上有很多坑坑洼洼。传统控制是尽量绕过这些坑,而滑模控制是直接冲过去——只要你的滑雪板(滑模面)足够硬,坑洼根本影响不了你。
从数学上讲,滑模控制分两步:
- 设计滑模面:让系统状态在滑模面上的运动是稳定的
- 设计控制律:迫使系统状态到达滑模面,并一直待在上面
关键点:滑模控制对系统参数变化和外部干扰具有完全的不变性——只要干扰满足匹配条件,它就无法影响滑模面上的运动。
4.2 滑模面的设计
先看一个简单的二阶系统:
ẍ = f(x, ẋ, t) + b·u + d(t)
其中 f 是非线性项,b 是控制增益,d(t) 是外部干扰。
我一般这样设计滑模面:
s = c·e + ė
这里 e = x - xd 是跟踪误差,c > 0 是设计参数。为什么这样设计?因为当 s = 0 时,误差动态变成 ė = -c·e,这是个一阶线性系统,只要 c > 0,误差就会指数收敛到零。
嗯,这里要注意:c 不能选太大,否则控制力需求会爆炸。我在项目中遇到过有人把 c 设成 100,结果仿真跑出来控制量直接饱和了。
我的经验:c 的取值一般在 1~20 之间。对于飞行器姿态控制,我习惯从 c=5 开始试,然后根据响应速度微调。
4.3 控制律设计
滑模控制律通常包含两部分:
u = u_eq + u_sw
u_eq 是等效控制,用来抵消系统的已知动态。
u_sw 是切换控制,用来对抗不确定性和干扰。
具体推导一下:
对滑模面求导:
ṡ = c·ė + ë = c·ė + f + b·u + d - ẍd
令 ṡ = 0,得到等效控制:
u_eq = (1/b)·(-c·ė - f + ẍd)
切换控制我一般用符号函数:
u_sw = -k·sign(s)
其中 k 要大于干扰的上界 |d|。这样总控制律就是:
u = (1/b)·(-c·ė - f + ẍd) - k·sign(s)
避坑指南:我曾经在无人机俯仰通道直接用这个公式,结果高频抖振把舵机烧了。符号函数会产生无限频率的切换,实际系统中必须做平滑处理。
4.4 抖振问题与解决方案
抖振是滑模控制最大的痛点。说白了,就是控制量在滑模面附近高频切换,像打摆子一样。
为什么会这样?因为理想的滑模控制要求无限快的切换频率,但实际执行器(舵机、电机)有响应延迟,做不到那么快。
我常用的几种消抖方法:
| 方法 | 原理 | 优缺点 |
|---|---|---|
| 边界层法 | 用饱和函数代替符号函数 | 实现简单,但会损失鲁棒性 |
| 高阶滑模 | 将切换作用到控制量的高阶导数上 | 效果好,但设计复杂 |
| 自适应增益 | 根据误差大小动态调整切换增益 | 兼顾鲁棒性和抖振抑制 |
我个人最常用的是边界层法:
sat(s/φ) = { sign(s), |s| > φ
{ s/φ, |s| ≤ φ
φ 是边界层厚度。φ 越小,越接近理想滑模,但抖振也越明显。我一般取 φ = 0.01~0.1,具体看执行器的响应速度。
4.5 飞行器应用实例
拿四旋翼的高度控制来说。高度动态可以简化为:
ż = v
v̇ = -g + (cosθ·cosφ)·(T/m) + d_z
设计滑模面 s = c·(z - zd) + (v - vd),控制律为:
T = (m/cosθ·cosφ)·(g + v̇d - c·(v - vd) - k·sign(s))
我在实际飞控中测试过这个方案。相比PID,滑模控制在有风扰的情况下,高度偏差能控制在±5cm以内,而PID会跑到±15cm。代价是油门信号上有一些高频抖动,但用边界层法处理后基本可以接受。
一句话总结:滑模控制用「硬碰硬」的方式对抗不确定性,鲁棒性极强,但必须处理好抖振问题才能实用。
4.6 本章知识体系
下面这张图总结了滑模控制的核心逻辑:
这张图把滑模控制的脉络理清楚了。从核心思想出发,分两大步骤展开,最后落到抖振这个实际工程问题上。你写代码的时候,就按这个顺序来,不会乱。