1.什么是动态滑模
从前面一些关于滑模的介绍,我们知道,在设计滑模控制器时,避不开的问题就是抖振。至于抖振的产生,很大程度上是由于一般滑模控制器的控制律u是一个不连续的函数,u中往往包括符号函数sign(s),从而导致整个系统出现抖振。因此,想要有效抑制抖振,有一个很好的想法就是去除滑模控制器中的不连续项。
于是,研究人员产生了这样的想法:能否把控制输入的不连续项放到控制输入的一阶甚至高阶导数里,这样,控制输入的导数不连续,但是一积分,控制输入就连续了啊,就可以有效降低系统抖振,这就是动态滑模控制的思想。
在平时设计动态滑模控制器中,我们往往把不连续项放到控制输入的一阶导数中(因为一阶导数容易设计),这样的控制叫做一阶动态滑模控制,下面我将介绍如何设计一阶动态滑模控制器。
2.动态滑模设计
考虑下面的单输入单输出n阶系统:
{
x
i
˙
=
x
i
+
1
x
˙
i
+
1
=
f
(
x
)
+
g
(
x
)
u
y
=
x
1
\left\{\begin{matrix} \dot{x_{i}}&= &x_{i+1} \\ \dot{x}_{i+1}&= &f(x)&+&g(x)u \\ y&=&x_{1} \end{matrix}\right.
⎩⎨⎧xi˙x˙i+1y===xi+1f(x)x1+g(x)u
式中
i
=
1
,
2
,
⋅
⋅
⋅
n
−
1
,
x
=
[
x
1
,
⋅
⋅
⋅
,
x
n
]
i=1,2,\cdot \cdot \cdot n-1,x=[x_{1},\cdot \cdot \cdot ,x_{n}]
i=1,2,⋅⋅⋅n−1,x=[x1,⋅⋅⋅,xn],
f
(
x
)
f(x)
f(x)与
g
(
x
)
g(x)
g(x)是光滑函数,
y
y
y是系统输出,假设我想让这个系统输出跟踪信号
y
d
y_{d}
yd,则可以定义跟踪误差为:
e
=
y
d
−
y
=
y
d
−
x
1
\begin{matrix} e & =&y_{d}-y\\ & =&y_{d}-x_{1} \end{matrix}
e==yd−yyd−x1
根据误差e可以定义如下切换面:
s
=
c
1
e
1
+
⋅
⋅
⋅
+
c
n
−
1
e
n
−
1
+
e
n
=
0
s=c_{1}e_{1}+\cdot \cdot \cdot +c_{n-1}e_{n-1}+e_{n}=0
s=c1e1+⋅⋅⋅+cn−1en−1+en=0式中
e
i
=
e
i
−
1
,
(
i
=
1
,
2
,
.
.
.
n
)
e_{i}=e^{i-1},(i=1,2,...n)
ei=ei−1,(i=1,2,...n)分别是跟踪误差e及其各阶导数,选取常数
c
1
.
.
.
.
c
n
−
1
c_{1}....c_{n-1}
c1....cn−1使得多项式
p
n
−
1
+
c
n
−
1
p
n
−
2
+
.
.
.
+
c
2
p
+
c
1
p^{n-1}+c_{n-1}p^{n-2}+...+c_{2}p+c_{1}
pn−1+cn−1pn−2+...+c2p+c1为Hurwite多项式(满足在滑模面上可以滑动到平衡点)
此时我们对切换函数s求导,可得:
s
˙
=
f
(
x
)
+
g
(
x
)
u
−
y
d
(
n
)
+
∑
i
=
1
n
−
1
c
i
e
i
+
1
\dot{s}=f(x)+g(x)u-y_{d}^{(n)}+\sum_{i=1}^{n-1}c_{i}e_{i+1}
s˙=f(x)+g(x)u−yd(n)+i=1∑n−1ciei+1
重点操作来了,大家快上车,观察
s
˙
\dot{s}
s˙的形式,里面包含控制u,如果此时我令
s
˙
=
趋
近
律
\dot{s}=趋近律
s˙=趋近律,那么算出来的u就一定含有符号函数等不连续项,无法消除抖振。这时,研究人员想到一种办法,能不能把s看作系统状态,对s再次设计滑模面,因为只有出现
s
¨
\ddot{s}
s¨才可以出现
u
˙
\dot{u}
u˙,于是设计新滑模面为:
σ
=
s
˙
+
λ
s
=
0
\sigma =\dot{s}+\lambda s=0
σ=s˙+λs=0
其中
λ
>
0
\lambda>0
λ>0,随后我们对
σ
\sigma
σ求导,可得
σ
˙
=
s
¨
+
λ
s
˙
\dot{\sigma }=\ddot{s}+\lambda \dot{s}
σ˙=s¨+λs˙其中出现了
s
¨
\ddot{s}
s¨,根据前面
s
˙
\dot{s}
s˙形式可知,
s
¨
\ddot{s}
s¨会出现
u
˙
\dot{u}
u˙,也就是u的导数,此时令
σ
˙
=
\dot{\sigma }=
σ˙=趋近律可以求解一个
u
˙
\dot{u}
u˙,不连续项在u的导数里,对其积分,u中自然没有不连续项,也就消除了抖振。
可能大家有疑惑,这样能让跟踪误差趋于0吗,我们来简单分析一波:我们把s作为系统状态设计了新的滑模控制器,该控制器首先可以保证s最终会等于0,对吧;当s=0,s又是一个滑模面,是跟踪误差e的滑模面,其中参数C满足Hurwite多项式,因此,e也会收敛到0。
上述是一个简单分析,具体证明有点复杂,感兴趣可以去找刘金琨老师的《滑模变结构控制》,下面我将以·一个二阶系统为例,具体介绍设计步骤。
3.动态滑模实战
假设一二阶系统如下:
{
x
1
˙
=
x
2
x
2
˙
=
x
1
2
+
x
2
+
u
y
=
x
1
\left\{\begin{matrix} \dot{x_{1}} &= &x_{2} & \\ \dot{x_{2}}&= &x_{1}^{2}& +&x_{2}&+&u\\ y&=&x_{1} \end{matrix}\right.
⎩⎨⎧x1˙x2˙y===x2x12x1+x2+u跟踪信号
y
r
=
s
i
n
t
y_{r}=sint
yr=sint,跟踪误差
e
=
y
r
−
y
e=y_{r}-y
e=yr−y,由系统与跟踪信号可得:
e
=
s
i
n
t
−
x
1
e=sint-x_{1}
e=sint−x1
e
˙
=
c
o
s
t
−
x
2
\dot{e}=cost-x_{2}
e˙=cost−x2
e
¨
=
−
s
i
n
t
−
x
1
2
−
x
2
−
u
\ddot{e}=-sint-x_{1}^{2}-x_{2}-u
e¨=−sint−x12−x2−u针对跟踪误差设计滑模面
s
=
e
˙
+
3
e
=
0
s=\dot{e}+3e=0
s=e˙+3e=0对其求导可得
s
˙
=
e
¨
+
3
e
˙
\dot{s}=\ddot{e}+3\dot{e}
s˙=e¨+3e˙把s作为系统状态,对s设计滑模面
σ
=
s
˙
+
s
=
0
\sigma =\dot{s}+s=0
σ=s˙+s=0对此滑模面求导
σ
˙
=
s
¨
+
s
˙
\dot{\sigma }=\ddot{s}+\dot{s}
σ˙=s¨+s˙令其等于指数趋近律,即
σ
˙
=
s
¨
+
s
˙
=
−
σ
−
s
i
g
n
(
σ
)
\dot{\sigma }=\ddot{s}+\dot{s}=-\sigma -sign(\sigma )
σ˙=s¨+s˙=−σ−sign(σ)将前式代入可得
u
˙
=
2
c
o
s
t
−
4
s
i
n
t
−
5
x
1
2
−
8
x
2
−
2
x
1
x
2
−
5
u
+
s
i
g
n
(
σ
)
+
σ
\dot{u}=2cost-4sint-5x_{1}^{2}-8x_{2}-2x_{1}x_{2}-5u+sign(\sigma )+\sigma
u˙=2cost−4sint−5x12−8x2−2x1x2−5u+sign(σ)+σ其中
u
˙
\dot{u}
u˙是实际控制律u的导数,对其求积分就可以得到实际控制律u,动态滑模控制器设计完毕
下面是我在matlab simulink中仿真的结果,simulink模型如下图所示:
其中x1,x2初值分别取3和2,跟踪曲线取为sint,x1跟踪效果如下
黄色的线是x1的曲线,蓝色的线是sint,从实验结果可以看到,该控制器可以实现x1对sint的跟踪。
动态滑模控制最重要的特点就是其控制器输出u没有抖振,如下图所示
可以看到控制器输出是连续的,其导数
u
˙
\dot{u}
u˙由于包含非线性项而出现抖振,
u
˙
\dot{u}
u˙图像如下所示
黄色的曲线带正是由于抖振导致,仿真已经上传(动态滑模控制),其中有两个simulink模型,一个是matlab2020b版本的,一个是matlab2013b版本的,如果版本在2020b以上建议使用hjl2020b.slx;matlab2013b到matlab2020a版本之间运行hjl2013b.slx。
从上述实验结果可以看出,一阶动态滑模控制器实际上是通过设计 u ˙ \dot{u} u˙来实现系统的控制,设计 u ˙ \dot{u} u˙可以保证积分后的控制律u连续,使得系统拥有更好的性能,但这个控制器也存在以下缺点:它将阶次升高一阶,设计更困难,控制更间接,存在更长响应时间。
4.稳定性证明补充
针对第三部分中的例子新增的稳定性证明
下载链接滑模算法