ADRC(自抗扰控制器)技术附Matlab代码框架
自抗扰控制器 ( Auto/Active Disturbances Rejec ion Controller, ADRC)是韩京清学者提出的,是一种继PID控制器后的一种新型的实用的控制技术。
它不是一种独立的技术,可以理解为是对PID现有技术的一种改进,它吸收了PID的精髓,并弥补了PID的一些缺陷。
引用一句话对ADRC的评价:“自抗扰控制器不只是停留在对 PID进行一些修修补补的工作‚而是一次对经典调节理论的脱胎换骨的革新.”
ADRC主要是由跟踪微分器(TD)、非线性组合、扩张状态观测器(ESO)组成。
PID的一些缺陷
PID是现在大部分工业控制的主流技术,它具有很多优点,像结构简单,适用性强,稳定性好等等。PID的精髓在于用目标和实际被控对象的输出之间的误差来消除此误差,这是留给人类的宝贵思想。虽然PID在控制领域的地位无可替代,但是随着对控制品质要求的提高,它的一些“不足之处”就显露出来。
- 原始误差不合理: PID是用 e = r − y e=r-y e=r−y生成误差,但是目标信号是可以“跳变”的(比如初始时刻,突然从一个目标值到另一个目标值),但输出信号y是有惯性的,不能跳变,让缓慢的遍量y来跟踪快速变化的变量r是不合理的。
- 微分器不好用: 误差信号 e e e的微分信号 d e d t \frac{de}{dt} dtde没有太好的办法,一般用 d e d t = e ( t ) − e ( t − h ) h \frac{de}{dt}=\frac{e(t)-e(t-h)}{h} dtde=he(t)−e(t−h)来实现。但这样会导致一个问题,当信号被噪声 n ( t ) n(t) n(t)污染之后,就会产生噪声放大效应,如有噪声的信号的微分是 d e d t = e ( t ) − e ( t − h ) + n ( t ) h \frac{de}{dt}=\frac{e(t)-e(t-h)+n(t)}{h} dtde=he(t)−e(t−h)+n(t),往往时间常数 h h h的取值一般都很小, h h h越小 n ( t ) h \frac{n(t)}{h} hn(t)越大,这个信号因此便被噪声所淹没,失去使用价值。
- 线性组合并不是最好: PID控制器采用的是误差的现在 e ( t ) e(t) e(t)、误差的过去 ∫ 0 t e ( t ) d t \int_{0}^{t}e(t)dt ∫0te(t)dt和误差的未来 d e d t \frac{de}{dt} dtde三者之和相加,但实际表明,这种仅仅相加的线性组合方式并不是最好的,在非线性的领域找到合适的组合是值得探索的。
- 积分带来负面影响: 如果使用位置式PID,也就是 u ( t ) = k p e ( t ) + k i ∫ 0 t e ( t ) d t + k d d e d t u(t)=k_pe(t)+k_i\int_{0}^{t}e(t)dt+k_d\frac{de}{dt} u(t)=kpe(t)+ki∫0te(t)dt+kddtde,在使用的过程中会产生积分饱和。这个很好理解,当系统存在一个方向的偏差,那么由于积分的存在, ∫ 0 t e ( t ) d t \int_{0}^{t}e(t)dt ∫0te(t)dt越来越大,会使 u ( t ) u(t) u(t)越来越大,从而使 u ( t ) u(t) u(t)到达极限不再改变,这时候积分还是会不断增大。等到系统产生一个反向的偏差,由于积分处于一个非常“大”的状态,即使能减掉反方向的误差,也需要花很长时间脱离饱和区。
ADRC
- 安排过渡过程: 根据控制目标和对象承受能力先安排合适的过渡过程,安排过渡过程的手法在控制工程实 践中已常被采用。如, 升温过程中的“升温曲线”, 热处理过 程中的“温度曲线”等。但是, 大多情形并不利用这些温度曲 线的微分信号。
ADRC提倡的“安排过渡过程”,是同时要给出过渡微分信号的 - 微分信号的提取: 利用微分近似公式
d
e
d
t
=
e
(
t
)
−
e
(
t
−
h
)
h
\frac{de}{dt}=\frac{e(t)-e(t-h)}{h}
dtde=he(t)−e(t−h)会带来噪声放大效应,甚至会淹没噪声。但是如果采用两个惯性环节相减的方式,就能降低噪声放大效应,将原近似公式变为
d
e
d
t
=
e
(
t
−
h
1
)
−
e
(
t
−
h
2
)
h
2
−
h
1
\frac{de}{dt}=\frac{e(t-h_1)-e(t-h_2)}{h_2-h_1}
dtde=h2−h1e(t−h1)−e(t−h2),其中的
h
2
,
h
1
h_2,h_1
h2,h1仍是时间常数,这种方式是用二阶动态环节实现微分功能的。
在这个基础上,引入bang-bang最速曲线,实现用最快速度跟踪上输入信号,将“尽可能快”变为“最快”。同时,避免系统在进入稳态时有颤振现象(bang-bang特性),整合出最速综合函数 f h a n ( x 1 , x 2 , r , h ) fhan(x1,x2,r,h) fhan(x1,x2,r,h)
公式如下:
{ d = r h 2 a 0 = h x 2 y = x 1 + a 0 a 1 = d ( d + 8 ∣ y ∣ ) a 2 = a 0 + s i g n ( y ) ( a 1 − d ) / 2 a = ( a 0 + y ) f s g ( a , d ) − r s i g n ( a ) ( 1 − f s g ( a , d ) ) f h a n = − r ( a b ) − r s i g n ( a ) ( 1 − f s g ( a , d ) ) \begin{cases} d=rh^2\\ a_0=hx_2\\ y=x_1+a_0\\ a_1=\sqrt{d(d+8|y|)}\\ a_2=a_0+sign(y)(a_1-d)/2\\ a=(a_0+y)fsg(a,d)-rsign(a)(1-fsg(a,d))\\ fhan=-r(\frac{a}{b})-rsign(a)(1-fsg(a,d)) \end{cases} ⎩⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎧d=rh2a0=hx2y=x1+a0a1=d(d+8∣y∣)a2=a0+sign(y)(a1−d)/2a=(a0+y)fsg(a,d)−rsign(a)(1−fsg(a,d))fhan=−r(ba)−rsign(a)(1−fsg(a,d))
其中
f s g ( x , d ) = ( s i g n ( x + d ) − s i g n ( x − d ) ) / 2 fsg(x,d)=(sign(x+d)-sign(x-d))/2 fsg(x,d)=(sign(x+d)−sign(x−d))/2
Fhan代码:
function out=fhan(x1,x2,r,h)
d=r*h^2;
a0=h*x2;
y=x1+a0;
a1=sqrt(d*(d+8*abs(y)));
a2=a0+sign(y)*(a1-d)/2;
a=(a0+y)*fsg(y,d)+a2*(1-fsg(y,d));
out=-r*(a/d)*fsg(a,d)-r*sign(a)*(1-fsg(a,d));
end
function out=fsg(x,d)
out=(sign(x+d)-sign(x-d))/2;
end
以下的系统我们称为跟踪微分器(Tracking Differentiator, TD)
%TD-Fhan input为目标信号,v1跟踪信号,v2微分信号
v1=v10+h*v20;
v2=v20+h*fhan(v10-input(i),v20,r,h0);
- 非线性组合的应用: 有了“安排过渡过程”和“跟踪微分器”的手段,我们可以用TD产生的误差信号
e
1
=
v
1
−
x
1
e_1=v_1-x_1
e1=v1−x1和误差的微分信号
e
2
=
v
2
−
x
2
e_2=v_2-x_2
e2=v2−x2,再加一个积分信号
e
0
=
∫
0
t
e
1
(
t
)
d
t
e_0=\int_{0}^{t}e_1(t)dt
e0=∫0te1(t)dt,就可以设计出PID控制器了,但是大量研究表明,采用非线性组合的方式效果更好。
有如下非线性函数
f a l ( x , α , σ ) = { e σ 1 − α , ∣ e ∣ < = σ ∣ e ∣ α s i g n ( e ) , ∣ e ∣ > σ fal(x,\alpha,\sigma)= \begin{cases} \frac{e}{\sigma ^{1-\alpha}},\quad |e|<=\sigma\\ |e|^\alpha sign(e),\quad |e|>\sigma \end{cases} fal(x,α,σ)={σ1−αe,∣e∣<=σ∣e∣αsign(e),∣e∣>σ
等效为:
s = = s i g n ( e + σ ) − s i g n ( e − σ ) 2 ; f a l ( x , α , σ ) = e σ 1 − α s + ∣ e ∣ α s i g n ( e ) ( 1 − s ) s==\frac{sign(e+\sigma)-sign(e-\sigma)}{2};\\ \\ fal(x,\alpha,\sigma)=\frac{e}{\sigma ^{1-\alpha}}s+|e|^\alpha sign(e)(1-s) s==2sign(e+σ)−sign(e−σ);fal(x,α,σ)=σ1−αes+∣e∣αsign(e)(1−s)
代码:
function out=fal(e,alpha,sigma)
s=(sign(e+sigma)-sign(e-sigma))/2;
out=s*e/(sigma^(1-alpha))+abs(e)^alpha*sign(e)*(1-s);
end
- 扩张状态观测器(Extended State Observer, ESO) 与扰动估计补偿: ESO的设计提出解决了积分带来的负面作用,同时它还可以跟踪系统的原信号并对系统总扰动进行估计预测,可以说ESO时整个ADRC框架的核心部分。
假设有这样的系统:
{ x 1 ˙ = x 2 x 2 ˙ = f ( x 1 , x 2 , ω ( t ) , t ) + b u y = x 1 \begin{cases} \dot{x_1}=x_2\\ \dot{x_2}=f(x_1,x_2,\omega(t),t)+bu\\ y=x_1 \end{cases} ⎩⎪⎨⎪⎧x1˙=x2x2˙=f(x1,x2,ω(t),t)+buy=x1
其中, ω ( t ) \omega(t) ω(t)是外部扰动,我们将总扰动f设为:
x 3 ( t ) = f ( x 1 , x 2 , ω ( t ) , t ) x_3(t)=f(x_1,x_2,\omega(t),t) x3(t)=f(x1,x2,ω(t),t)
那么,新的系统方程就变成了:
{ x 1 ˙ = x 2 x 2 ˙ = x 3 + b u x 3 ˙ = ω 0 ( t ) y = x 1 \begin{cases} \dot{x_1}=x_2\\ \dot{x_2}=x_3+bu\\ \dot{x_3}=\omega_0(t)\\ y=x_1 \end{cases} ⎩⎪⎪⎪⎨⎪⎪⎪⎧x1˙=x2x2˙=x3+bux3˙=ω0(t)y=x1
注意,这边的 ω 0 ( t ) \omega_0(t) ω0(t)和 ω ( t ) \omega(t) ω(t)没有太大关系,我们也不知道它等于什么,我们只需要了解用 x 3 x_3 x3构建了一个新的变量——扰动。
线性扩张状态观测器(LESO)方程如下:
{ e = z 1 − y z 1 ˙ = z 2 − β 01 e z 2 ˙ = z 3 − β 02 e + b u z 3 ˙ = − β 03 e \begin{cases} e=z_1-y\\ \dot{z_1}=z_2-\beta_{01}e\\ \dot{z_2}=z_3-\beta_{02}e+bu\\ \dot{z_3}=-\beta_{03}e\\ \end{cases} ⎩⎪⎪⎪⎨⎪⎪⎪⎧e=z1−yz1˙=z2−β01ez2˙=z3−β02e+buz3˙=−β03e
在扰动不是很剧烈的情况下,选取合适的参数 β 01 、 β 02 、 β 03 \beta_{01}、\beta_{02}、\beta_{03} β01、β02、β03, z i z_i zi可以很好的跟踪上 x i x_i xi。尽管我们在LESO中没有用到未知函数 ω 0 ( t ) \omega_0(t) ω0(t), 但是在系统运行过程中它是实实在 在地起作用的, 为了消除其影响, 采用非线性效应, 把方程改造成:
{ e = z 1 − y z 1 ˙ = z 2 − β 01 e z 2 ˙ = z 3 − β 02 f a l ( e , 0.5 , h ) + b u z 3 ˙ = − β 03 f a l ( e , 0.25 , h ) \begin{cases} e=z_1-y\\ \dot{z_1}=z_2-\beta_{01}e\\ \dot{z_2}=z_3-\beta_{02}fal(e,0.5,h)+bu\\ \dot{z_3}=-\beta_{03}fal(e,0.25,h)\\ \end{cases} ⎩⎪⎪⎪⎨⎪⎪⎪⎧e=z1−yz1˙=z2−β01ez2˙=z3−β02fal(e,0.5,h)+buz3˙=−β03fal(e,0.25,h)
改造以后的扩张观测器的跟踪效果更好, 适应范围更大。非线性的ESO算是真正意义上的“扩张状态观测器”。
代码如下:
e=z10-y1;
fe=fal(e,0.5,0.005);fe1=fal(e,0.25,0.005);
z1=z10+eso_h*(z20-beta01*e);
z2=z20+eso_h*(z30-beta02*fe+b*x1);
z3=z30+eso_h*(-beta03*fe1);
ESO如何消除积分呢?
过程很有意思,利用公式
u
=
u
0
−
z
3
b
0
u=\frac{u_0-z_3}{b_0}
u=b0u0−z3就能代替积分项
k
i
∫
0
t
e
(
t
)
d
t
k_i\int_{0}^{t}e(t)dt
ki∫0te(t)dt,感兴趣可以推一下。
程序链接:
添加链接描述
更多推荐
所有评论(0)