学一点经典的控制算法试图证明我的专业是控制相关的,实则只是对优秀视频的一顿搬运
先放几份参考资料在此,讲的很清晰,很棒
What Is Sliding Mode Control? 什么是滑膜控制(b站搬运)
滑模控制(MATLAB官网) 质量-弹簧-阻尼器系统的滑模控制设计
滑模控制为什么叫滑模
所谓控制,就是使用输入$u$,通过仿真模型/现实变化后,能让被控量$x$趋向于我们的期望值$x_d$,通过不同的算法算出不同的$u$,就可以实现不同的控制效果
控制$x \to x_d$其实也就是控制$e = x - x_d \to 0$,这里我们设置一个滑模面函数$s$,如果我们能让$s > 0时$,$\dot{s} < 0$,当$s < 0时$,$\dot{s} > 0$,那么最终$s$一定会等于0,当$s = 0$时,$e$和$\dot{e}$就是线性关系,在二维坐标平面上就是一条直线,当$s$进入滑模面后,就一定会沿着这条直线滑动到原点,届时$e \to 0, \dot{e} \to 0$,一方面可从数学证明角度,由$\dot{e} = -c e$,分离变量后积分可以得到$e(t) = e(0) exp(-c t)$,误差随时间指数级收敛于0,另一方面可以直观的发现,当$e > 0$时,$\dot{e} < 0$,导数小于0则说明原函数会减小,当$e < 0$时,$\dot{e} > 0$,导数大于0说明原函数会增大,负数增大,正数减小,则一定逼近于0,$e$逼近0,那么$\dot{e}$也逼近于0,因为他们在滑模面上是线性关系
$$
s = \dot{e} + c e = 0
$$
这个控制过程就是把$e$和$\dot{e}$先拉入滑模面之上,再在滑模面上进行移动,沿着线/面滑来滑去,也就是sliding的含义吧
公式推导
对于控制仿射非线性系统,通常使用下式描述输入输出和状态,$x$是被控变量/向量,$f(x)$为系统固有的动力学,比如弹簧和阻尼的力,$u(t)$就是我们控制器的输入的力/力矩/舵角的大小,$g(x)$就是力的控制增益
$$
\dot{x} = f(x) + g(x)u(t)
$$
对于滑模面更通用的写法如下,$C$和$x$都是列向量
$$
s=C^tx
$$
为了保持前面说的把变量拉至滑模面,我们要保持$s \dot{s} < 0$,最简单的想法是使用符号函数$\dot{s} = -sign(s)$,或者加上$\eta$系数控制趋近速率,又或者是加上$-ks$以便在初始值s很大时提供更快的收敛速度,更加通用的写法如下
$$
\dot{s} = h(s(x))
$$
$$
h(s(x)) =
\begin{cases}
-\eta , \theta(s) & \text{恒定速率趋近律} \
-\eta , \theta(s) - k s & \text{指数趋近律}
\end{cases}
$$
$$
\theta(s) =
\begin{cases}
\mathrm{sign}(s), & \text{符号函数边界层} \[6pt]
\begin{cases}
1, & s > \phi \
k s, & |s| \le \phi \
-1, & s < -\phi
\end{cases}
& \text{饱和函数边界层}
\end{cases}
$$
其中饱和函数边界层是为了保持在靠近滑模面时,不要因为一点误差就再次把滑模面拉远了,也就是相当于冲破了滑模面去到了另一边,一直反复颤动,在接近滑模面时用很小的控制率,让其主要沿着滑模面移动
由此可以得出下面的关系式,由$s=C^tx$和$\dot{x} = f(x) + g(x)u(t)$代入可以进行计算
$$
\dot{s} = \frac{\partial s}{\partial x} \cdot \frac{dx}{dt} = C^t[ f(x) + g(x)u(t) ] = h(s(x))
$$
$$
\dot{s} = C^t \dot{x} = C^t[ f(x) + g(x)u(t) ] = h(s(x))
$$
个人认为下面这种写法更好理解
解出$u(t)$,这样我们就可以得出标准滑模控制方程
$$
u(t) = (C^t g(x))^{-1}(-C^t f(x) + h(s(x)))
$$
矩阵$C$的列数取决于,控制输入$u$的个数,行数取决于被控量$x$的个数
举个例子

一个物体左端有弹簧和阻尼两个力,右侧施加外部控制力$u$使得物体的位置$x$能随我们的期望位置$x_d$进行移动,期望$e = x - x_d \to 0$
由牛顿第二定律可以轻松得出
$$
M \ddot{x} + Fx +D \dot{x} = u(t)
$$
通常令位置$x = x_1$,速度$x_2 = \dot{x_1}$,写成我们上面提到的形式$\dot{x} = f(x) + g(x)u(t)$,如下
$$
\begin{bmatrix}
\dot{x}_1 \
\dot{x}_2
\end{bmatrix}
\begin{bmatrix}
0 & 1 \
-\frac{k}{M} & -\frac{D}{M}
\end{bmatrix}
\begin{bmatrix}
x_1 \
x_2
\end{bmatrix}
+
\begin{bmatrix}
0 \
\frac{1}{M}
\end{bmatrix}
u(t)
$$
再代入我们得到的标准滑模控制方程,这里详细代入记录一下
$$
\begin{aligned}
u(t)
&= \left(C^T g(x)\right)^{-1}
\left(-C^T f(x) + h(s(x))\right) \
&= \frac{M}{c_2}
\left[
-\left(c_1 x_2 - \frac{c_2 k}{M} x_1 - \frac{c_2 D}{M} x_2\right)
- h(s(x))
\right] \
&= \frac{M}{c_2}
\left(
- c_1 x_2
- \frac{c_2 k}{M} x_1
- \frac{c_2 D}{M} x_2
- h(s(x))
\right) \
&= k x_1 + D x_2 - \frac{M c_1}{c_2} x_2 + \frac{M}{c_2} h(s(x))
\end{aligned}
$$
跟踪模式的滑模面
上面的滑模面为$s=C^tx$,也就是最后会控制$x$都趋近于0,但实际上我们更可能希望控制$x$为我们期望的位置$x_d$(可能是曲线或是其他的值),这时滑模面应为
$$
s = C^T(x_d - x)
$$
$$
\begin{aligned}
\dot{s}
&= C^T(\dot{x}d - \dot{x}) \
&= C^T(\dot{x}{d} - \dot{x}) \
&= C^T\left(\dot{x}{d} - (f(x) + g(x)u)\right) \
&= C^T\dot{x}{d} - C^Tf(x) - C^Tg(x)u \
&= h(s(x))
\end{aligned}
$$
提出控制量$u$可得
$$
u = (C^T g(x))^{-1} (C^T \dot{x}_{d} - C^T f(x) - h(s(x)))
$$
但在MATLAB的文档中是这样的,不太懂为什么,第一项不太一样,$h(s(x))$前面应该有一个负号才对,而且不知道为什么有个$C$
在质量-弹簧-阻尼器系统的滑模控制设计中滑模函数为$s(t) = ce(t) + \dot{e(t)}$,所以控制律$u$的结果也有所不同

说些什么吧!