滑模控制 SMC(Sliding Mode Control)

本文最后更新于:2026年8月29日 晚上

在控制系统中,滑模控制(Sliding Mode Control, SMC) 是一种非线性控制方法,它与常规控制的区别在于控制的不连续性。滑模控制是变结构控制的一个分支,通过切换函数来实现:根据系统状态偏离滑模面的程度来切换控制器的结构(控制律或控制器参数),从而使系统按照滑模规定的规律运行。

控制律不是时间的连续函数,它可以根据状态空间中的当前位置从一个连续结构切换到另一个连续结构。因此,滑模控制是一种变结构控制方法,目前已设计有多种控制结构。

滑模控制的优点是鲁棒性——当系统处于滑动模态时,对被控对象的模型误差、对象参数的变化以及外部干扰有极佳的不敏感性。

滑模控制的缺点是抖振:当状态轨迹到达滑动模态面后,难以严格沿着滑动模态面向平衡点滑动,而是在其两侧来回穿越地趋近平衡点,从而产生抖振——这也是滑模控制在实际应用中的主要障碍。

滑模控制基本概念

滑模变结构控制的原理是:根据系统所期望的动态特性来设计系统的切换超平面(滑模面),通过滑动模态控制器使系统状态从超平面之外向滑模面收敛靠近。系统一旦到达切换超平面,控制作用将保证系统沿切换超平面到达系统原点,这一沿切换超平面向原点滑动的过程称为滑模运动。

由于系统的特性和参数只取决于设计的切换超平面,而与外界干扰无关,所以滑模变结构控制具有很强的鲁棒性。超平面的设计方法有极点配置、特征向量配置设计法、最优化设计方法等,所设计的切换超平面需满足到达条件,即系统在滑模平面后将保持在该平面的条件。

对于给定的一个系统,假设它可以用如下形式表示:

则在系统的状态空间存在一个超曲面,其表达式如下(下文详述为何使 ):

状态空间中任意一点的运动与滑模面(超曲面)的关系可分为三类,如下图所示:

IMG-滑模控制 SMC(Sliding-Mode-Control)_73BCB368B2BFAB7A00B0424212461442_20260706142533876

  • A 点——穿越点:系统运动到滑模面 时并不停留,而是直接穿越过去。此时满足:

  • B 点——发散点:系统在滑模面 处从其两边离开。此时满足:

  • C 点——收敛点:系统运动到滑模面 时停留在滑模面上。此时满足:

在滑模变结构中,穿越点与发散点无多大意义,而收敛点却有特殊的含义:如果切换面上某一区域内所有的点都是收敛点,则一旦运动点趋近于该区域,就被"吸引"在该区域内运动,即满足滑模到达条件。此时,称切换面 上所有运动点都是收敛点的超曲面为滑模面,系统在滑模面中的运动称为滑模运动。

滑模设计步骤

在系统控制过程中,控制器根据系统当前状态,以跃变方式有目的地不断变换,迫使系统按预定的"滑动模态"的状态轨迹运动。变结构是通过切换函数实现的——通常要求切换面上存在滑动模态区,故变结构控制又常被称为滑动模态控制。

设计变结构控制系统基本可分为两步:

确定切换函数 (滑模面设计)

设计滑模面,保证系统存在滑模面。滑模面所确定的滑动模态可使系统渐近稳定且具有良好的品质,它代表了系统的理想动态特性。

针对如下线性系统:

设计滑模面参数:

为何使 ?当 时,上式可根据 、 转化成如下方程:

上式为常系数齐次线性微分方程,其解与特征多项式 的根有关。当满足 Hurwitz 稳定判据 时,方程的所有特征根均具有负实部,解中的自然指数函数幂的常系数小于 ,则 最终收敛至 ,进而 都会收敛至 。

因此,滑模面选择此种形式便于分析。在滑模控制系统中,参数 应满足 Hurwitz 稳定判据。

设计滑模控制器(趋近律设计)

选择适合的趋近律,设计滑模控制器,使到达条件得到满足,从而使趋近运动(非滑动模态)于有限时间内到达开关面,并且在趋近的过程中快速、抖振小。

下面举一个例子说明。假设系统的状态方程为:

首先设计滑模面,使得滑模面 存在,即满足 Hurwitz 稳定。设计 ,此时 。当 时,特征方程为 ,特征根为 (负实部),满足 Hurwitz 稳定条件,保证了滑模面的存在。

接着,为了使系统能够在有限时间内到达滑模面并稳定在其上,采用李雅普诺夫方法进行分析。对于平衡点 ,如果存在一个连续函数 满足以下两个条件,那么系统将在平衡点 处稳定:

  • 条件 1:
  • 条件 2:

取李雅普诺夫函数为(显然满足条件 1):

求导得:

在实际控制器的设计过程中,考虑到不能每次控制输出都进行一次李雅普诺夫判据,因此通常采用引入趋近律的方式,即用一个函数将 替换,且均满足滑模到达条件 。常见的趋近律有:

  1. 等速趋近律:
  2. 指数趋近律:
  3. 幂次趋近律:
  4. 一般趋近律:,其中 ,当 时

以采用指数趋近律设计控制律为例,则有(满足条件 2):

采用下述引理,可得 。可见 指数收敛至零,收敛速度取决于 。指数项 能保证当 较大时,系统状态能以较大的速度趋近于滑动模态。因此,指数趋近律尤其适合解决具有大阶跃的响应控制问题。

需要说明的是,指数趋近中,趋近速度从一较大值逐步减小到零,不仅缩短了趋近时间,而且使运动点到达切换面时的速度很小。但单纯的指数趋近是一个渐近过程,不能保证有限时间内到达,切换面上也就不存在滑动模态了。所以要增加一个等速趋近项 ,使当 接近于零时,趋近速度是 而不是零,从而保证有限时间到达。


引理:针对 ,不等式方程 ()的解为:

其中 为任意常数。


所以采用指数趋近律时,可使系统向 趋近,并稳定在其上。此时可获得系统控制律为:

Simulink 仿真实例

考虑二阶系统的滑模控制,有如下控制对象:

其中 ,。指令信号 ,频率 为 ,被控对象初始状态为 。

采用基于指数趋近律的滑模控制律:

取 。系统的状态空间方程如下(取 ):

IMG-滑模控制 SMC(Sliding-Mode-Control)_4B9C5A64B4D394FC71D7BC7246A9F54A_20260706142506983

SMC_Control(控制器 S-Function)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
%{
t: 系统时间
x: 系统状态
u: 系统输入,即为 Simulink 中输入给 S-Function 的数据
flag: 系统状态,自动生成,返回的 flag 决定系统当前执行到哪个 S-Function 子函数
%}
function [sys, x0, str, ts] = SMC_Control(t, x, u, flag)
switch flag
case 0
[sys, x0, str, ts] = mdlInitializeSizes;
case 3
sys = mdlOutputs(t, x, u);
case {2, 4, 9}
sys = [];
otherwise
error(['Unhandled flag = ', num2str(flag)]);
end

function [sys, x0, str, ts] = mdlInitializeSizes
sizes = simsizes;
sizes.NumContStates = 0; % 连续状态变量数
sizes.NumDiscStates = 0; % 离散状态变量数
sizes.NumOutputs = 3; % 输出变量数
sizes.NumInputs = 3; % 输入变量数
sizes.DirFeedthrough = 1; % 输入端口的信号是否在 mdlOutputs 中使用
sizes.NumSampleTimes = 0;
sys = simsizes(sizes);
x0 = [];
str = [];
ts = [];

function sys = mdlOutputs(t, x, u)
thd = u(1); % 输入变量 1 为角度指令
dthd = cos(t);
ddthd = -sin(t);

th = u(2); % 输入变量 2 为实际角度
dth = u(3); % 输入变量 3 为实际速度

c = 15;
e = thd - th;
de = dthd - dth;
s = c * e + de;

fx = 25 * dth;
b = 133;

epc = 5;
k = 10;
ut = 1 / b * (epc * sign(s) + k * s + c * de + ddthd + fx); % 滑模控制律

sys(1) = ut; % 输出变量 1 为控制量
sys(2) = e; % 输出变量 2 为误差
sys(3) = de; % 输出变量 3 为误差一阶导数

SMC_Plant(被控对象 S-Function)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
%{
t: 系统时间
x: 系统状态
u: 系统输入,即为 Simulink 中输入给 S-Function 的数据
flag: 系统状态,自动生成,返回的 flag 决定系统当前执行到哪个 S-Function 子函数
%}
function [sys, x0, str, ts] = SMC_Plant(t, x, u, flag)
switch flag
case 0
[sys, x0, str, ts] = mdlInitializeSizes;
case 1
sys = mdlDerivatives(t, x, u);
case 3
sys = mdlOutputs(t, x, u);
case {2, 4, 9}
sys = [];
otherwise
error(['Unhandled flag = ', num2str(flag)]);
end

function [sys, x0, str, ts] = mdlInitializeSizes
sizes = simsizes;
sizes.NumContStates = 2; % 连续状态变量数
sizes.NumDiscStates = 0; % 离散状态变量数
sizes.NumOutputs = 2; % 输出变量数
sizes.NumInputs = 1; % 输入变量数
sizes.DirFeedthrough = 0; % 输入端口的信号是否在 mdlOutputs 中使用
sizes.NumSampleTimes = 0;
sys = simsizes(sizes);
x0 = [-0.15, -0.15]; % 状态变量初始值
str = [];
ts = [];

function sys = mdlDerivatives(t, x, u) % 产生系统状态导数
sys(1) = x(2);
sys(2) = -25 * x(2) + 133 * u;

function sys = mdlOutputs(t, x, u) % 产生系统输出
sys(1) = x(1); % 输出变量 1 为角度 theta
sys(2) = x(2); % 输出变量 2 为速度 dtheta

To Workspace 模块设置

IMG-滑模控制 SMC(Sliding-Mode-Control)_AD9A6F326765D3E70C4DE880287ACEB0_20260706142447335

控制效果

IMG-滑模控制 SMC(Sliding-Mode-Control)_7FC8646F657974345283F4E8D0AFAAE8_20260706142358921

参考