ADRC控制算法框架
ADRC控制算法主要包含了三个部分,对输入信号进行跟踪微分的跟踪微分器、对跟踪信号和微分信号的误差进行补偿的误差补偿控制器、对跟踪信号、微分信号和扰动信号进行观测的扩张状态观测器。其组成部分如下图:
跟踪微分器的内容可以参考我之前的博客 跟踪微分器博客
扩张状态观测器的内容可以参考我之前的博客 扩张状态观测器
第一步 - 对输入信号的滤波和微分
由于系统的输入信号经常会存在高频噪声以及阶跃信号,对系统造成严重扰动,同时一些也会对常规的控制算法带来较大的麻烦(例如 PID)。因此经过跟踪微分器之后,输入控制器的信号就变得更加平滑,其微分信号不至于出现类似于冲激信号的尖峰,可以更好的利用这组微分信号进行前馈控制等控制手段。
跟踪微分器的框架图(NTD)
第二步 - 估计状态
估计的状态变量包括了被控对象状态、对应的微分信号以及系统的扰动信号。
扩张状态观测器的框架图(ESO)
第三步 - 计算控制律
控制律的计算主要包含了两个部分,一部分是对于跟踪信号误差和微分信号误差的补偿,类似于PD控制器,另一部分是对于扰动的抵消补偿。这也是扩张状态观测器的主要意义所在,即观测扰动,补偿扰动。
其中误差补偿控制器的框架图(线性控制器)
其数学描述内容如下
u
0
=
k
1
e
1
+
k
2
e
2
u
=
u
0
−
z
3
b
=
u
0
−
f
(
x
⃗
,
w
,
t
)
b
u_0=k_1 e_1+k_2e_2\\ u = \frac{u_0-z_3}{b}=\frac{u_0-f(\vec{x},w,t)}{b}
u0=k1e1+k2e2u=bu0−z3=bu0−f(x,w,t)
假设被控对象的状态空间如下:
x
1
′
=
x
2
x
2
′
=
f
(
x
⃗
,
w
,
t
)
+
b
u
x_1'=x_2\\ x_2'=f(\vec{x},w,t)+bu
x1′=x2x2′=f(x,w,t)+bu
则将控制律代入后可以得到
x
1
′
=
x
2
x
2
′
=
u
0
=
k
1
e
1
+
k
2
e
2
=
k
1
(
v
−
x
1
)
+
k
2
(
v
′
−
x
2
)
=
−
k
1
x
1
−
k
2
x
2
+
k
2
v
′
+
k
1
v
x_1'=x_2 \\ x_2'=u_0 = k_1e_1+k_2e_2=k_1(v-x_1)+k_2(v'-x_2)=-k_1x_1-k_2x_2+k_2v'+k_1v
x1′=x2x2′=u0=k1e1+k2e2=k1(v−x1)+k2(v′−x2)=−k1x1−k2x2+k2v′+k1v
则其传递函数为
Y
U
=
G
(
s
)
=
k
2
s
+
k
1
s
2
+
k
2
s
+
k
1
\frac{Y}{U} = G(s)=\frac{k_2s+k_1}{s^2+k_2s+k_1}
UY=G(s)=s2+k2s+k1k2s+k1
可以通过调节
k
1
k
2
k_1 k_2
k1k2的值来配置系统的零极点,使系统响应性能达到预期。
可以看出,ADRC是一种状态误差反馈的控制算法,不需要精确的系统模型,对外部扰动以及噪声有很强的抑制作用。
仿真案例
以二阶系统为例,其传递函数为
G
(
s
)
=
s
+
4
s
2
+
4
s
+
6
G(s)=\frac{s+4}{s^2+4s+6}
G(s)=s2+4s+6s+4
其中,误差补偿系数
k
1
=
10
,
k
2
=
10
k_1 = 10,k_2 = 10
k1=10,k2=10(随便给的两个数值,可以自行调试对比控制性能)
响应结果
大家有兴趣的话可以自行修改被控对象,以及添加噪声扰动等因素到系统中,观察ADRC控制器的抗扰动能力以及鲁棒性。文件我会打包发上来。
文件链接