ADRC学习心得(持续更新)[通俗易懂]

2022-08-31 15:47:38 浏览数 (1)

大家好,又见面了,我是你们的朋友全栈君。

两年前第一次接触到PID觉得很高深,很神奇;后来逐渐觉得单纯的PID小儿科了,又了解到专家PID,模糊PID,神经网络PID这些改进算法,再后来又知道了ADRC,便感控制领域浩如烟海,所学不过沧海一粟。然便纵真理无穷,进一寸自有一寸的欢喜。 不敢说看了几篇论文,听了几节报告,做了几次仿真,就吃透ADRC了,不过只是一些粗浅的理解,记录一行歪歪斜斜的足迹。以便回首过眼云烟之时,可以安慰自己一句,我已经飞过。

一、系统有关概念

1、系统的状态空间模型

描述一个系统,最常用的数学模型有:

  • 微分方程
  • 传递函数
  • 状态空间

其中状态空间模型常用于对系统进行数学计算。状态空间模型用状态方程表示。 { x ˙ = A x B u y = C x D u ( 1 − 1 ) left{ begin{array}{c} dot{x}=Ax Bu \ y=Cx Du end{array} right. (1-1) { x˙=Ax Buy=Cx Du​(1−1) ABCD是四个矩阵, x x x为状态向量,里面包含的状态变量个数一般等于系统阶数,且相互独立。 y y y为系统输出向量。 状态变量的选取一般是: x 1 = y , x 2 = d y d t , . . . , x n = d n − 1 y d t n − 1 x_1=y, x_2=frac{dy}{dt}, …, x_n=frac{d^{n-1}y}{dt^{n-1}} x1​=y,x2​=dtdy​,...,xn​=dtn−1dn−1y​

2、系统的状态观测

设计反馈的时候需要知道系统内部的状态变量 x x x。大部分情况下 x x x是不知道的,需要用一个观测器,通过系统的输入输出,去把它观测出来。如果在状态变量 x x x中包含了系统的扰动,那么在观测出来之后,就可以在控制器中把系统扰动尽可能消除。观测出的状态变量称为 x ^ hat{x} x^。那么状态观测器的任务,就是使得 x x x的状态估计 x ^ hat{x} x^尽可能接近 x x x。通常按照copycat的思路来设计状态观测去,即设计一个相同结构的系统 x ^ ˙ = A x ^ B u L ( y − y ^ ) dot{hat{x}}=Ahat{x} Bu L(y-hat{y}) x^˙=Ax^ Bu L(y−y^​),其中 L ( y − y ^ ) L(y-hat{y}) L(y−y^​)这一项是矫正项。 L L L为矫正项增益矩阵。用数学公式表达如下: { e o b s = x − x ^ x ˙ = A x B u x ^ ˙ = A x ^ B y L ( y − y ^ ) ( 1 − 2 ) left{ begin{array}{c} e_{obs}=x-hat{x}\ dot{x}=Ax Bu\ dot{hat{x}}=Ahat{x} By L(y-hat{y}) end{array} right. (1-2) ⎩⎨⎧​eobs​=x−x^x˙=Ax Bux^˙=Ax^ By L(y−y^​)​ (1−2)通过数学变换,可以得到: e o b s ˙ = ( A − L C ) e o b s ( 1 − 3 ) dot{e_{obs}}=(A-LC)e_{obs} (1-3) eobs​˙​=(A−LC)eobs​ (1−3)这个方程的解是 e o b s ( t ) = e ( A − L C ) t e o b s ( 0 ) ( 1 − 4 ) e_{obs}(t)=e^{(A-LC)t}e_{obs}(0) (1-4) eobs​(t)=e(A−LC)teobs​(0) (1−4)可以看出,(A-LC)这一项决定了观测器的收敛速度。当 e o b s e_{obs} eobs​降到 0 的时候,也就意味着 x x x和 x ^ hat{x} x^相等,同时矫正项 L ( y − y ^ ) = 0 L(y-hat{y})=0 L(y−y^​)=0。这就是状态观测器的数学模型。ADRC的核心是一个扩张状态观测器,它比一般的状态观测器多了一个总扰动的项,但基础是一样的。

二、ADRC控制器的结构

1、TD(跟踪微分器)

跟踪微分器实际上就是一个事先的过渡过程。提取含有随机噪声的输入信号及其微分,这两个值将被一起送入控制器。也就是说,TD的输入信号只有一个,即给定值,输出信号有两个。这样做的目的是解决PID控制器超调和响应速度之间的矛盾。 然而,微分运算对噪声有很严重的放大效果。由于真正意义上的微分环节( G ( s ) = s G(s)=s G(s)=s)是无法在物理上实现的,因此通常用一阶惯性环节( G ( s ) = s T s 1 G(s)=frac{s}{Ts 1} G(s)=Ts 1s​)来代替。但是对于一阶惯性环节,要想追求逼近性好,就会不可避免的引入噪声的放大。因此,为了抑制高频噪声,考虑用一个二阶环节来取代一阶环节。当二阶系统处于临界阻尼状态,则过渡过程就不会产生超调。 G ( s ) = s ( T s 1 ) 2 G(s)=frac{s}{(Ts 1)^2} G(s)=(Ts 1)2s​ 式中,当时间常数T很小的时候有 lim ⁡ T → 0 s ( T s 1 ) 2 = s lim_{T to 0} frac{s}{(Ts 1)^2}quad=s limT→0​(Ts 1)2s​=s,也有微分的效果。并且这个二阶系统对于高频噪声有很高的抑制能力。因此TD中采用的通常是这种结构。过渡过程的阶数一般根据系统来决定,与系统同阶或者比系统高一阶。

2、ESO(扩张状态观测器)

ESO是ADRC控制器的核心,可以用一个扩张状态方程来描述。通过扩张状态观测的方式把系统上和输入量(u)无关的所有杂项(扰动)全部观测出来,以便用控制器去补偿这些扰动。设计ESO的思路如下: 考虑一个二阶系统: y ¨ = a y ˙ b y c u d ( 2 − 1 ) ddot{ y}=adot{y} by cu d (2-1) y¨​=ay˙​ by cu d (2−1) d d d为扰动。显然二阶系统的状态变量有两个, x 1 x_1 x1​和 x 2 x_2 x2​。一般情况下如果要写出状态方程的话应该是二阶的,即有两个状态变量。为了将扰动 d d d也纳入状态观测器,建立第三个状态变量 x 3 x_3 x3​,使其等于 a y ˙ b y d adot{y} by d ay˙​ by d,即上式中除了输入 u u u之外的其他项(也可称作总扰动)。令 x 3 ˙ = h dot{x_3}=h x3​˙​=h,那么按照一般状态方程的写法,可以列写出上面这个二阶系统的状态方程: [ x 1 ˙ x 2 ˙ x 3 ˙ ] = [ 0 1 0 0 0 1 0 0 0 ] [ x 1 x 2 x 3 ] [ 0 c 0 ] u [ 0 0 1 ] h ( 2 − 2 ) begin{bmatrix} dot{x_1} \ dot{x_2} \ dot{x_3} \ end{bmatrix} =begin{bmatrix} 0&1&0 \ 0&0&1 \0&0&0 \ end{bmatrix} begin{bmatrix} x_1 \ x_2 \ x_3 \ end{bmatrix} begin{bmatrix} 0 \ c \ 0 \ end{bmatrix}u begin{bmatrix}0 \0 \ 1 \ end{bmatrix}h (2-2) ⎣⎡​x1​˙​x2​˙​x3​˙​​⎦⎤​=⎣⎡​000​100​010​⎦⎤​⎣⎡​x1​x2​x3​​⎦⎤​ ⎣⎡​0c0​⎦⎤​u ⎣⎡​001​⎦⎤​h (2−2)和输出方程: y = [ 1 0 0 ] [ x 1 x 2 x 3 ] ( 2 − 3 ) y= begin{bmatrix} 1 & 0 & 0 \ end{bmatrix}begin{bmatrix} x_1 \ x_2 \ x_3 \ end{bmatrix} (2-3) y=[1​0​0​]⎣⎡​x1​x2​x3​​⎦⎤​ (2−3)这个状态方程即被称为扩张状态方程。扩张状态观测器的设计和传统状态观测器类似,也是 { x ^ ˙ = A x ^ B u L ( y − y ^ ) E h y ^ = C x ^ ( 2 − 4 ) left{ begin{array}{c} dot{hat{x}}=Ahat{x} Bu L(y-hat{y}) Eh\ hat{y}=Chat{x} end{array} right. (2-4) { x^˙=Ax^ Bu L(y−y^​) Ehy^​=Cx^​ (2−4)其中 E h Eh Eh这一项和模型有关,大部分情况下是未知的,因此通常这一项被直接忽略,不然放着也没用。由于有了矫正项 L ( y − y ^ ) L(y-hat{y}) L(y−y^​) ( L (L (L状是态观测器的增益矩阵,记为 [ l 1 l 2 l 3 ] begin{bmatrix} l_1\ l_2 \ l_3\ end{bmatrix} ⎣⎡​l1​l2​l3​​⎦⎤​),因此观测器中的矩阵A、B、C、D(为了区分记为 A 1 、 B 1 、 C 1 、 D 1 A_1、B_1、C_1、D_1 A1​、B1​、C1​、D1​)和状态方程中的矩阵A、B、C、D是不一样的。

通过一定的数学变换,状态观测器方程(2-4)可化为如下形式: x ^ ˙ = ( A − L C 1 ) x ^ [ B L ] [ u y ] dot{hat{x}}=(A-LC_1)hat{x} begin{bmatrix} B&L \ end{bmatrix}begin{bmatrix} u\y \ end{bmatrix} x^˙=(A−LC1​)x^ [B​L​][uy​]观测器中的系统矩阵 A 1 = A − L C 1 A_1=A-LC_1 A1​=A−LC1​,即 A 1 = [ − l 1 1 0 − l 2 0 1 − l 3 0 0 ] A_1=begin{bmatrix} -l_1&1&0 \ -l_2&0&1 \-l_3&0&0 \ end{bmatrix} A1​=⎣⎡​−l1​−l2​−l3​​100​010​⎦⎤​,而新的输入矩阵; B 1 = [ B L ] B_1=begin{bmatrix} B&L \ end{bmatrix} B1​=[B​L​],即 B 1 = [ 0 − l 1 c − l 2 0 − l 3 ] B_1=begin{bmatrix}0& -l_1 \ c&-l_2 \0&-l_3 \ end{bmatrix} B1​=⎣⎡​0c0​−l1​−l2​−l3​​⎦⎤​为新的控制矩阵( c c c是原二阶系统中输入 u u u的系数), [ u y ] begin{bmatrix} u\y \ end{bmatrix} [uy​]两个一起作为观测器输入;状态观测器的输出 y ^ hat{y} y^​实际上包含3个分量,即 y ^ = C 1 [ x 1 ^ x 2 ^ x 3 ^ ] hat{y}=C_1begin{bmatrix} hat{x_1} \ hat{x_2} \ hat{x_3} \ end{bmatrix} y^​=C1​⎣⎡​x1​^​x2​^​x3​^​​⎦⎤​那么在观测器的输出方程中, C 1 C_1 C1​就是一个三阶单位矩阵,因为 y ^ = x ^ hat{y}=hat{x} y^​=x^; D 1 D_1 D1​是零矩阵。 为了让观测器系统稳定,需要进行极点配置。假设让这个三阶的状态观测器的三个极点全部位于左半平面的 − ω 0 -ω_0 −ω0​处,则增益 L L L就需要特别设计。令 A 1 A_1 A1​的特征值 = − ω 0 -ω_0 −ω0​,可解得 l 1 = 3 ω 0 , l 2 = 3 ω 0 2 , l 3 = ω 0 2 l_1=3omega_0,l_2=3omega_0^2,l_3=omega_0^2 l1​=3ω0​,l2​=3ω02​,l3​=ω02​。 ω 0 ω_0 ω0​即是观测器的带宽,应当根据实际系统来设计。如果带宽选择过小,可能会导致扩张状态 x 3 x_3 x3​的观测 x 3 ^ hat{x_3} x3​^​的跟随性变差,带宽选择过大的话有可能会引入额外的噪声。 u u u的系数 c c c在设计的时候有可能是不知道的,但是仿真表明 c c c的选择即使跟真实的系统有偏差,ESO也能正常工作(但这一点目前尚无严格的理论证明)。至此,扩张状态观测器设计完成!!

3、NLSEF(控制器)

ADRC的控制器部分的输入包含两个部分,分别是TD的输出结果(输入信号及其微分)和ESO的输出(包含三个元素的状态向量 y ^ hat{y} y^​)。因此它就有5个输入量。其中 y ^ hat{y} y^​的第三个分量 x 3 ^ hat{x_3} x3​^​的作用,是通过观测,将复杂系统转化为纯积分器,简化控制。 依然是这个二阶系统 y ¨ = a y ˙ b y c u d ddot{ y}=adot{y} by cu d y¨​=ay˙​ by cu d扩张状态 x 3 = a y ˙ b y d x_3=adot{y} by d x3​=ay˙​ by d。假设状态观测器工作顺利, x 3 x_3 x3​的观测值 x 3 ^ hat{x_3} x3​^​就等于真实的 x 3 x_3 x3​,即满足 x 3 = x 3 ^ x_3=hat{x_3} x3​=x3​^​那么将系统的输入,也即控制器的输出 u u u设计为 u = u 0 − x 3 ^ c u=frac{u_0-hat{x_3}}{c} u=cu0​−x3​^​​带入上面的二阶系统,可以得到 y ¨ = u 0 ddot{y}=u_0 y¨​=u0​即一个二阶积分器。设计一个PD控制器来控制 u 0 u_0 u0​:(一般稳态的时候给定的目标值(reference)都是恒定的,即 r ˙ = 0 dot{r}=0 r˙=0, r ¨ ddot{r} r¨为前馈项,用于去除稳态误差。但很多时候都是把它忽略的,加上这一项之后有可能会影响响应速度) u 0 = K p ( r − x 1 ) K d ( r ˙ − x 2 ) r ¨ u_0=K_p(r-x_1) K_d(dot{r}-x_2) ddot{r} u0​=Kp​(r−x1​) Kd​(r˙−x2​) r¨同样按照极点配置的方法,可得到 K p = ω c 2 K_p=ω_c^2 Kp​=ωc2​, K = 2 ω c K_=2ω_c K=​2ωc​。如此,控制器传递函数中阻尼系数 ξ = 1 ξ=1 ξ=1,处于临界阻尼,系统无超调。当然 K p 、 K d K_p、K_d Kp​、Kd​设计的方法很多,可以综合超调和响应速度来调节。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/144393.html原文链接:https://javaforall.cn

0 人点赞