ADRC自抗扰控制自学笔记(包含simulink仿真)
ADRC控制中包含三个主要的部分:
跟踪微分器,非线性状态反馈(非线性组合),扩张观测器。
ADRC特点:
继承了经典PID控制器的精华,对被控对象的数学模型几乎没有任何要求,又在其基础上引入了基于现代控制理论的状态观测器技术,将抗干扰技术融入到了传统PID控制当中去,最终设计出了适合在工程实践中广泛应用的全新控制器。
本博客将从0开始,逐一介绍每一个部分,最后在合起来实现ADRC,每个部分都将介绍其公式原理和仿真实验。
一、跟踪微分器(TD)
这是一个单输入双输出的模块,作用有两个:
- 避免输入量不要有跳变,便于实际系统实时跟踪。因为传统的pid有个问题,就是当跟踪像阶跃信号这种突变信号时超调和上升时间共存的现象,所以我们的思路就是对输入的信号进行平滑处理,也就是避免其出现突变。
- 过滤高频噪声
所以输出1就是处理过的信号,第二个信号是输出1的微分,输出1和2都将用于下一环节,这里不介绍。
先摆出他的输出效果图,输入为阶跃信号:
说明:蓝色为处理后的阶跃信号,显然就好很多,没有那么突变。黄色为微分。
TD公式:
公式不难理解,接下来,我将对TD进行simulink仿真,其中fst函数我用的脚本写的:
友情提示:离散差分方程建模和连续系统微分方程建模一样,先找准输出y(k),再找准y(k-1)…,然后他们之间用单位延迟连接,最后在这基础上连其他东西。
hfst函数模块:
function out = hfst(u1,u2,r,h)
d=r*h;
d0=h*d;
y=u1+h*u2;
a0=sqrt(d*d+8*r*abs(y));
a=0;
out1=0;
if abs(y)>d0
a=u2+(a0-d)/2*sign(y);
end
if abs(y)<=d0
a=u2+y/h;
end
if abs(a)>d
out1=-r*sign(a);
end
if abs(a)<=d
out1=-r*a/d;
end
out=out1;
end
说明:TD模型涉及两个调参:δ和h,h为采样周期,delta决定跟踪快慢(δ越大,过滤后的输出越接近输入),一般的仿真模型r可以尽量大一些,在100~500范围内基本相同,即使再大效果也基本不会有大的提升,我这里delta为50,h=0.001。
二、非线性组合
这一部分对应第一张图中的非线性组合模块,这一模块为双输入单输出,输入的是两个误差,分别是指令信号差和指令信号微分的差,参考指令信号和参考指令信号的微分均由TD产生。
传统的pid或者pd控制就是比例、积分、微分的线性加权之和,但这种线性的组合不是最佳的,后来发现三者的非线性组合效果更好。最常用的就是pd形式的非线性组合:
这里面涉及的调参有三个:β1,β2,δ
实验:演示非线性pd相比传统pd的优越性
咱们先看传统的pd控制:
对象为:
sys = tf([133],[1,25,0])
dsys = c2d(sys,0.001,'z');
[num,den]=tfdata(dsys,'v');
效果:
显然效果不好。
再来看看非线性pd控制:
函数模块代码:
function y =nonlinear_pd(e1,e2)
alfa1=0.75;
alfa2=1.5;
delta=0.002;
beta1=150;
beta2=1;
fal1=1;
fal2=1;
if abs(e1)<=delta
fal1=e1/(delta^(1-alfa1));
end
if abs(e1)>delta
fal1=(abs(e1))^(alfa1)*sign(e1);
end
if abs(e2)<=delta
fal2=e2/(delta^(1-alfa2));
end
if abs(e2)>delta
fal2=(abs(e2))^(alfa2)*sign(e2);
end
y=beta1*fal1+beta2*fal2;
end
效果:
可见效果好多了,因此非线性pid有效果!!!!!!
当然,我们这里用的是非线性pd控制,我们也可以用论文中的非线性pid控制,同理,这一部分公式为:
这里不再演示了。
三、ESO扩张观测器
上一篇: 控制系统|反馈系统的稳定性分析
下一篇: js获取select选中项的文本