目录
- 一、什么是滑模控制?
- 1. 滑模面
- 2. 控制策略
- 3. 抗干扰和鲁棒性
- 4. 滑模控制的应用
- 二、什么是趋近律?
- 1. 趋近律三大设计目标
- 2. 常见的趋近律形式
- 1. 等速趋近律
- 2. 指数趋近律
- 3. 幂次趋近律
- 三、滑模控制器设计
- 四、滑模仿真示例
- 1. Simulink仿真框图
- 2. 不同k值下的仿真结果(注意刻度变化)
- 3. 仿真代码(S-function)
一、什么是滑模控制?
- 滑模控制(Sliding Mode Control, SMC)是一种非线性控制方法,常用于处理具有不确定性、非线性或外部干扰的系统。其基本思想是通过设计一个滑模面,让系统状态沿着这个面滑动到达目标状态,即稳定点。
- 滑模控制是一种鲁棒性强的非线性控制方法,通过设计滑模面让系统状态沿面滑动到目标状态。它分为趋近和滑模两个阶段,能够有效抵御不确定性和干扰,但需要处理因离散切换引发的抖振问题。
这个过程可以比喻为“驾车行驶”:滑模面是设计好的道路,系统状态是汽车的位置,滑模控制器是司机,通过不断调整方向盘,让汽车保持在这条路线上前进。即使遇到小的障碍物(干扰),也能自动调整让汽车继续沿着道路行驶。
为了更直观地理解,我们可以分步骤来讲解滑模控制的核心概念和工作原理:
1. 滑模面
- 滑模控制的关键是“滑模面”。假设你正在引导一个小球(系统的状态)从某个地方移动到终点(目标状态),你设计了一条路径,这就是滑模面。滑模面是一个系统期望达到的状态轨迹,目的是让系统状态最终稳定在这条面上。
- 举例来说,假设你要控制一个系统的输出 x x x 使其跟随某个参考轨迹 x r e f x_{ref} xref。可以设计一个“误差” e = x − x r e f e = x-x_{ref} e=x−xref,并通过设计滑模面 s = e s=e s=e,希望误差趋向零,即系统的输出 x x x 能够跟踪目标 x r e f x_{ref} xref, 滑模面 s = 0 s = 0 s=0 就是我们希望系统最终稳定的地方。
2. 控制策略
滑模控制的目标是让系统状态从任意初始状态快速到达滑模面,并保持在该面上。这个过程可以分为两步:
- 趋近阶段:在系统初始状态不在滑模面上时,控制策略会迫使系统状态向滑模面靠近。这个过程通过设计趋近律(Reaching Law)实现。
- 滑模阶段:当系统状态到达滑模面之后,控制策略将保持系统状态在滑模面上滑动,直到最终到达目标状态。滑模阶段的控制目标是让系统沿着滑模面“滑动”到最终的期望状态。
3. 抗干扰和鲁棒性
滑模控制最强大的地方是它对系统模型中的不确定性和外界干扰有很好的鲁棒性。由于滑模控制仅依赖系统状态与滑模面之间的关系,而不依赖于系统的具体模型(尤其是未知部分或外界干扰),它能够很好地抵御外界干扰或模型不精确带来的影响。
例如,假设一个无人机在飞行过程中遇到突如其来的风,这时滑模控制可以通过保持状态在滑模面上的滑动来抵消风力的干扰,使无人机继续按照预定的轨迹飞行。
4. 滑模控制的应用
滑模控制广泛应用于机器人、自动驾驶、无人机控制、电机控制等领域,尤其在面对复杂、不确定系统时表现优异。例如,在自动驾驶汽车的轨迹跟踪中,滑模控制可以帮助汽车在不同的路面状况和外界干扰下,仍然保持在设定的轨迹上行驶。
二、什么是趋近律?
-
在滑模控制系统中,趋近律(reaching law)是指系统状态向滑模面靠近的动态过程的控制律。滑模控制的核心思想是设计一个滑模面,使得系统的轨迹一旦到达并进入滑模面后,将沿着滑模面滑动,最终到达期望的平衡点。趋近律控制的是系统从任意初始状态如何快速、有效地到达滑模面。
-
滑模运动包括趋近运动和滑模运动两个过程,系统从任意初始状态趋向切换面时,到达切换面的运动称为趋近运动,即 t → 0 t \rightarrow 0 t→0的过程。根据滑模变结构原理,滑模可达性条件仅保证由状态空间任意位置运动点在有限时间内到到切换面的要求,而对于去趋近运动的具体轨迹未做任何限制,采用趋近律的方法可以改善趋近运动的动态品质。
1. 趋近律三大设计目标
趋近律的设计目标主要有三个:
- 收敛性:确保系统状态能够迅速收敛到滑模面。
- 鲁棒性:对外界干扰和系统不确定性的抑制能力。
- 避免抖振:减小滑模控制中的抖振现象,即系统在滑模面附近出现的高频震荡。
2. 常见的趋近律形式
1. 等速趋近律
s
˙
=
−
ε
s
g
n
(
s
)
ε
>
0
(
1
)
\dot s = -\varepsilon sgn(s) \quad \varepsilon > 0 \qquad (1)
s˙=−εsgn(s)ε>0(1)
常数
ε
\varepsilon
ε表示系统的运动点趋近切换面
s
=
0
s = 0
s=0的速率。
ε
\varepsilon
ε小,趋近速度慢,反之,运动点到达切换面时将具有较大的速度,引起抖动。
2. 指数趋近律
s
˙
=
−
ε
s
g
n
(
s
)
−
k
s
ε
>
0
,
k
>
0
(
2
)
\dot s = -\varepsilon sgn(s) - ks \quad \varepsilon > 0,k>0 \qquad (2)
s˙=−εsgn(s)−ksε>0,k>0(2)
式中,
s
˙
=
−
k
s
\dot s = -ks
s˙=−ks是指数趋近项,其解为
s
=
s
(
s
)
e
k
t
s = s(s)e^{kt}
s=s(s)ekt。指数趋近律尤其适合解决具有大阶跃的相应控制问题。单纯的指数趋近,运动点逼近切换面是一个渐进的过程,不能保证有限时间内到达,切换面上也就不存在滑动模态,所以要增加一个等速趋近项
s
˙
=
−
ε
s
g
n
(
s
)
\dot s = -\varepsilon sgn(s)
s˙=−εsgn(s),使当
s
s
s接近于0时,趋近速度是
ε
\varepsilon
ε而不是0,可以保证有限时间内到达。 在指数趋近律中,为了
保证快速趋近的同时削弱抖振,应该在增大
k
k
k值的同时减小
ε
\varepsilon
ε。
3. 幂次趋近律
s
˙
=
−
k
∣
s
∣
α
s
g
n
(
s
)
,
k
>
0
,
1
>
α
>
0
(
3
)
\dot s = -k|s|^{\alpha} sgn(s),k>0,1>\alpha>0 \qquad (3)
s˙=−k∣s∣αsgn(s),k>0,1>α>0(3)
通过调整
α
\alpha
α的值,可保证当系统状态远离滑模动态(s较大)时,能以较大的速度趋近于滑模动态,反之,当系统状态趋近滑模动态(s较小)时,保证较小的控制增益,以降低抖振。
三、滑模控制器设计
考虑如下被控对象
θ
¨
(
t
)
=
−
f
(
θ
,
t
)
+
b
u
(
t
)
(
4
)
\ddot \theta(t) = -f(\theta,t)+bu(t) \qquad (4)
θ¨(t)=−f(θ,t)+bu(t)(4)
其中,
f
(
θ
,
t
)
f(\theta,t)
f(θ,t) 和
b
b
b 已知,且
b
>
0
b>0
b>0。
滑模函数为
s
(
t
)
=
c
e
(
t
)
+
e
˙
(
t
)
s(t)= ce(t)+\dot e(t)
s(t)=ce(t)+e˙(t)
其中,
c
>
0
c>0
c>0,满足 Hurwitz 条件。
跟踪误差为
e
(
t
)
=
θ
d
(
t
)
−
θ
(
t
)
,
e
˙
(
t
)
=
θ
˙
d
(
t
)
−
θ
˙
(
t
)
(
5
)
e( t) = \theta_d(t)-\theta(t) ,\dot e(t) = \dot \theta_d(t)-\dot \theta(t) \qquad (5)
e(t)=θd(t)−θ(t),e˙(t)=θ˙d(t)−θ˙(t)(5)
其中, θ d ( t ) 为目标位置。 \theta_d(t)为目标位置。 θd(t)为目标位置。
则
s
˙
(
t
)
=
c
e
˙
(
t
)
+
e
¨
(
t
)
=
c
(
θ
˙
d
(
t
)
−
θ
˙
(
t
)
)
+
(
θ
¨
d
(
t
)
−
θ
¨
(
t
)
)
)
=
c
(
θ
˙
d
(
t
)
−
θ
˙
(
t
)
)
+
(
θ
¨
d
(
t
)
+
f
(
θ
,
t
)
−
b
u
(
t
)
)
\dot s(t) = c\dot e(t)+\ddot e(t) \\ =c(\dot \theta_d(t)-\dot\theta(t))+(\ddot \theta_d(t)-\ddot\theta(t)))\\ =c(\dot\theta_d(t)-\dot \theta(t))+(\ddot \theta_d(t)+f(\theta,t)-bu(t))
s˙(t)=ce˙(t)+e¨(t)=c(θ˙d(t)−θ˙(t))+(θ¨d(t)−θ¨(t)))=c(θ˙d(t)−θ˙(t))+(θ¨d(t)+f(θ,t)−bu(t))
采用指数趋近律
s
˙
=
−
ε
s
g
n
(
s
)
−
k
s
ε
>
0
,
k
>
0
(
6
)
\dot s = -\varepsilon sgn(s)-ks\quad \varepsilon > 0,k>0 \qquad (6)
s˙=−εsgn(s)−ksε>0,k>0(6)
结合上式,得
c
(
θ
˙
d
(
t
)
−
θ
˙
(
t
)
)
+
(
θ
¨
d
(
t
)
+
f
(
θ
,
t
)
−
b
u
(
t
)
)
=
−
ε
s
g
n
(
s
)
−
k
s
c(\dot \theta_d(t)-\dot \theta(t))+(\ddot \theta_d(t)+f(\theta,t)-bu(t))=-\varepsilon sgn(s) -ks
c(θ˙d(t)−θ˙(t))+(θ¨d(t)+f(θ,t)−bu(t))=−εsgn(s)−ks
基于指数趋近律的滑模控制器为
u
(
t
)
=
1
b
(
ε
s
g
n
(
s
)
+
k
s
+
c
(
θ
˙
d
−
θ
˙
)
+
θ
¨
d
+
f
(
θ
,
t
)
)
(
7
)
u(t) = \frac{1}{b}(\varepsilon sgn(s)+ks+c(\dot \theta_d-\dot \theta)+\ddot \theta_d+f(\theta,t)) \qquad (7)
u(t)=b1(εsgn(s)+ks+c(θ˙d−θ˙)+θ¨d+f(θ,t))(7)
四、滑模仿真示例
考虑如下被控对象
θ
¨
(
t
)
=
−
f
(
θ
,
t
)
+
b
u
(
t
)
(
8
)
\ddot \theta(t) = -f(\theta,t)+bu(t) \qquad (8)
θ¨(t)=−f(θ,t)+bu(t)(8)
其中,
f
(
θ
,
t
)
=
25
θ
˙
f(\theta,t) = 25\dot \theta
f(θ,t)=25θ˙,
b
=
133
b = 133
b=133。
取目标位置为
θ
d
(
t
)
=
s
i
n
(
t
)
\theta_d(t) = sin(t)
θd(t)=sin(t),被控对象初始状态为[-0.15
\quad
-0.15 ],采用
(7)式控制器,取
c
=
15
,
ε
=
5
c = 15, \varepsilon = 5
c=15,ε=5,分别取
k
=
0
,
k
=
10
,
k
=
20
,
k
=
30
k = 0, k = 10, k = 20, k = 30
k=0,k=10,k=20,k=30。
1. Simulink仿真框图
2. 不同k值下的仿真结果(注意刻度变化)
- k = 0
- k = 10
- k =20
- k = 30
3. 仿真代码(S-function)
- chap2_2testctrl.m
function [sys,x0,str,ts,simStateCompliance]=mdlInitializeSizes
sizes = simsizes;
sizes.NumContStates = 0;%%是否是连续
sizes.NumDiscStates = 0;%%是否是离散
sizes.NumOutputs = 4;%%几个输出
sizes.NumInputs = 3;%%几个输入
sizes.DirFeedthrough = 1;%%输入输出是否有直接关系
sizes.NumSampleTimes = 0;% at least one sample time is needed 采样时间有几个
sys = simsizes(sizes);
x0 = [];
str = [];
ts = [];%%采样时刻 采样时间偏移量
simStateCompliance = 'UnknownSimState';
function sys=mdlOutputs(t,x,u)
thd = u(1);
dthd = cos(t);
ddthd = -sin(t);
th = u(2);
dth = u(3);
b = 133;
f = 25*dth;
c = 15;
epc = 5;
%在此处更改K值大小
S = 1;
if S == 1
k = 0;
elseif S == 2
k = 10;
elseif S == 3
k = 20;
elseif S == 4
k = 30;
end
e = thd - th;
de = dthd - dth;
s = c*e+de;
ut = 1/b*(epc*sign(s)+k*s+c*de+ddthd+f);
sys = [ut,e,de,k];
function [sys,x0,str,ts,simStateCompliance]=mdlInitializeSizes
sizes = simsizes;
sizes.NumContStates = 2;%%是否是连续
sizes.NumDiscStates = 0;%%是否是离散
sizes.NumOutputs = 2;%%几个输出
sizes.NumInputs = 1;%%几个输入
sizes.DirFeedthrough = 0;%%输入输出是否有直接关系
sizes.NumSampleTimes = 0;% at least one sample time is needed 采样时间有几个
sys = simsizes(sizes);
x0 = [-0.15,-0.15];
str = [];
ts = [];%%采样时刻 采样时间偏移量
simStateCompliance = 'UnknownSimState';
function sys=mdlDerivatives(t,x,u)
b = 133;
th = x(1);
dth = x(2);
ut = u(1);
f = 25*dth;
ddth = -f + b * ut;
sys=[dth, ddth];
function sys=mdlOutputs(t,x,u)
th = x(1);
dth = x(2);
sys = [th,dth];%th,dth