学一点经典的控制算法试图证明我的专业是控制相关的,实则只是对优秀视频的一顿搬运
先放几份参考资料在此,讲的很清晰,很棒
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$的结果也有所不同

说些什么吧!