原始误差不合理: 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)到达极限不再改变,这时候积分还是会不断增大。等到系统产生一个反向的偏差,由于积分处于一个非常“大”的状态,即使能减掉反方向的误差,也需要花很长时间脱离饱和区。
微分信号的提取: 利用微分近似公式
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代码:
functionout=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
functionout=fsg(x,d)out=(sign(x+d)-sign(x-d))/2;
end
非线性组合的应用: 有了“安排过渡过程”和“跟踪微分器”的手段,我们可以用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) 代码:
functionout=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算是真正意义上的“扩张状态观测器”。 代码如下:
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,感兴趣可以推一下。