他这里让我很好理解了跟踪微分器

非线性PID(准确说是非线性PD,所以可以看到输入是两根线而不是三根线)  也就是说传统PID是线性的?但是不是那些系统是非线性的,比如无人机,平衡车,只是小幅度里近似为线性的。

下面这个来自于:https://zhuanlan.zhihu.com/p/115283894

他这里确实让我对ADRC的理解更进了一个层面。现在对ADRC有了比较清晰的认识,并不神秘并不高深,其实还好。还是很好理解的。

下面这个来自这篇https://zhuanlan.zhihu.com/p/115283894

扩张状态观测器(ESO)

(1)功能
估计系统内外扰动的实时作用值,并在反馈中给予补偿,用补偿的方法消除扰动的影响,从而具有抗干扰的作用。

所以它的输入是从被控对象的前后两个输入,这样也好理解。

摘自:https://blog.csdn.net/zouxu634866/article/details/106287879#comments_12978720

ADRC自抗扰控制自学笔记(包含simulink仿真)

总被蚊子叮的小旭 2020-05-22 17:59:36 1856 收藏 28

分类专栏: 控制

版权

ADRC控制中包含三个主要的部分:

跟踪微分器,非线性状态反馈(非线性组合),扩张观测器。


ADRC特点:

继承了经典PID控制器的精华,对被控对象的数学模型几乎没有任何要求,又在其基础上引入了基于现代控制理论的状态观测器技术,将抗干扰技术融入到了传统PID控制当中去,最终设计出了适合在工程实践中广泛应用的全新控制器。

本博客将从0开始,逐一介绍每一个部分,最后在合起来实现ADRC,每个部分都将介绍其公式原理和仿真实验。


一、跟踪微分器(TD)

这是一个单输入双输出的模块,作用有两个:

所以输出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)>d0a=u2+(a0-d)/2*sign(y);
endif abs(y)<=d0a=u2+y/h;
endif abs(a)>dout1=-r*sign(a);
endif abs(a)<=dout1=-r*a/d;
end
out=out1;
end
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

或者,不用像上面的simulink+m,整个td都可以直接用m脚本写也可以,已经过验证效果一样:

function [y1k,y2k] = fcn(u)
persistent y1k_1 y2k_1
h=0.01;
delta=10;
if isempty(y1k_1)y1k_1=0;
endif isempty(y2k_1)y2k_1=0;
endy1k=y1k_1+h*y2k_1;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%hfst计算内容
d=delta*h;
d0=h*d;
y=y1k_1-u+h*y2k_1;
a0=sqrt(d*d+8*delta*abs(y));
a=0;
out1=0;
if abs(y)>d0a=y2k_1+(a0-d)/2*sign(y);
endif abs(y)<=d0a=y2k_1+y/h;
endif abs(a)>dout1=-delta*sign(a);
endif abs(a)<=dout1=-delta*a/d;
end
out=out1;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%y2k=y2k_1+h*out;y1k_1=y1k;
y2k_1=y2k;y1k=y1k;
y2k=y2k;end
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48

说明:TD模型涉及两个调参:δ和h,h为采样周期,delta决定跟踪快慢(δ越大,过滤后的输出越接近输入),一般的仿真模型r可以尽量大一些,在100~500范围内基本相同,即使再大效果也基本不会有大的提升,我这里delta为50,h=0.001。


二、非线性组合

这一部分对应第一张图中的非线性组合模块,这一模块为双输入单输出,输入的是两个误差,分别是指令信号差和指令信号微分的差,参考指令信号和参考指令信号的微分均由TD产生。

传统的pid或者pd控制就是比例、积分、微分的线性加权之和,但这种线性的组合不是最佳的,后来发现三者的非线性组合效果更好。最常用的就是pd形式的非线性组合

这里面涉及的调参有三个:β1,β2,δ,δ为h的整数倍。

实验:演示非线性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)<=deltafal1=e1/(delta^(1-alfa1));
endif abs(e1)>deltafal1=(abs(e1))^(alfa1)*sign(e1);
endif abs(e2)<=deltafal2=e2/(delta^(1-alfa2));
endif abs(e2)>deltafal2=(abs(e2))^(alfa2)*sign(e2);
endy=beta1*fal1+beta2*fal2;
end

效果:

可见效果好多了,因此非线性pid有效果!!!!!!

当然,我们这里用的是非线性pd控制,我们也可以用论文中的非线性pid控制,同理,这一部分公式为:

这里不再演示了。


三、ESO扩张观测器

ESO是一个双输入单输出模块,输入的值为对象的输出以及对象的控制输入,见第一张图,而输出有三个,分别是对象输出的估计值、对象输出的估计值的一阶导数、对象输出的估计值的二阶导数。而对象输出的估计值、对象输出的估计值的一阶导数将反馈给最开始的跟踪微分器(TD),而对象输出的估计值的二阶导数将反馈给非线性组合的输出上用于弥补扰动。

一般观测器仅观测系统的状态,只有输出和输出的导数(速度)。但是这里对输出的导数的导数(加速度)也进行了观测,这里也就是所谓的扰动(即第一张图中的w),对扰动进行了观测。观测器的状态量也由此扩张了一维,因此叫做扩张观测器。

ESO的公式见下图:

simulink模型:

里面的代码如下:

function [z1_k,z2_k,z3_k] = ESO(yk,uk)
%%参数初始化
persistent  z1_k_1 z2_k_1 z3_k_1
bata01=30;
beta02=300;
beta03=1000;
b=5;
h=0.001;
alfa1=0.75;
alfa2=1.5;
delta=0.002;
fal1=1;
fal2=1;
if isempty(z1_k_1)z1_k_1=0;
end
if isempty(z2_k_1)z2_k_1=0;
end
if isempty(z3_k_1)z3_k_1=0;
ende1=z1_k_1-yk;
z1_k=z1_k_1+h*(z2_k_1-bata01*e1);
z1_k_1=z1_k; %%迭代更新z1_k_1%%计算fal函数
if abs(e1)<=deltafal1=e1/(delta^(1-alfa1));
end
if abs(e1)>deltafal1=(abs(e1))^(alfa1)*sign(e1);
end
if abs(e1)<=deltafal2=e1/(delta^(1-alfa2));
end
if abs(e1)>deltafal2=(abs(e1))^(alfa2)*sign(e1);
endz2_k=z2_k_1+h*(z3_k_1-beta02*fal1+b*uk);
z2_k_1=z2_k;%%迭代更新z2_k_1z3_k=z3_k_1-h*beta03*fal2;
z3_k_1=z3_k;%%迭代更新z3_k_1end
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48

但要注意:因为ESO的公式里面已经加入了b*u,所以在搭最后的模型时第一张图中的b0就不要了,即不用再乘上b0,直接将补偿后的u输入ESO。同理,如果你要在similink模型里要显示用上b0这个比例系数,那么ESO里的公式里就要改为:z2_k=z2_k_1+h*(z3_k_1-beta02*fal1+uk);即去掉最后的uk前的系数b


四、完整的ADRC

这一节将把前面的组合起来构成一个完整的ADRC,也就是第一张图中的形式。搭好的结构如下:


注意点:
1.因为这是一个离散的模型,所以确保所有模块的采样时间一致
2.注意检查所有的求和模块的正负
3.注意上面第三节的黑色注意部分

开始仿真,报错了:

翻译过来就是说存在代数环的原因,这个问题我搜了百度:

https://wenku.baidu.com/view/c3be45de763231126fdb1143.html

这个问题很同意理解,我们知道,我们在求解反馈环的时候,首先反馈的初始值是为o的,也就是反馈系统的顺序是:我们先根据主路输入计算得到主路的输出(即得到反馈路的输入),在根据反馈路的输入计算出反馈路的输出(即反馈值),然后进行下一次循环。而在simulink中,他不像我们之前写的m脚本(我们自己写脚本就是从主路开始),他不知道首先应该计算主路还是首先计算反馈路,所以我们需要告诉他,解决办法就是在反馈路的输出端加上单位延迟,也就是告诉反馈路你等等,别太急,等主路先走。

其实我们还可以这样去理解代数环,将其理解为初始状态时反馈量没有初始值,我们以前的控制模型比如pid啥的,我们反馈的反馈量都会有一个初始值,而这个模型的ESO的输出作为反馈量是没有初始值的,所以他报错的原因还可以理解为反馈量没有初始值,所以我们就去给反馈量设一个初始值,我们就可以用memory模块(这个模块的作用就是有输入时输出=输入,没输入时输出保持原先状态,且当输入改变时输出才改变,否则一直保持输出不变),在memory模块里设置一个初始值,这样反馈量就有初始值了。而上面我们用的单位延迟模块就是一个memory模块,二者本来就是一样的。所以上面用单位延迟模块也可以这样理解。

修改后的simulink为:

或者(两者等价):


仿真后结果没报错,且结果令人满意:

其中黄色为初始阶跃信号,红色为经过td的信号,蓝色为控制输出。


模型已上传csdn和百度云,大家有需要自取哈!!!!!!

ADRC自抗扰控制自学笔记(包含simulink仿真)(转载)相关推荐

  1. (一)ADRC自抗扰控制-各部分简介与仿真

    前言 简单的说,ADRC可以理解为PID增强版,主要由ESO(扩展状态观测器).非线性(或线性)控制器.TD(跟踪微分器)组成,其灵魂也是最核心的地方是ESO. TD(跟踪微分器) 跟踪微分器是对输入 ...

  2. ADRC自抗扰控制从Simulink仿真到PLC控制实现

    ADRC自抗扰算法专栏有详细学习笔记和PLC完整源代码,大家可以自行查看,链接如下: ADRC自抗扰控制算法(含梯形图完整源代码和算法公式)_RXXW_Dor的博客-CSDN博客PLC的自抗扰控制(A ...

  3. 2020-12-28 Matlab自动化控制-Adrc自抗扰控制

    Matlab自动化控制-Adrc自抗扰控制 想要初步了解ADRC,可以从韩京清教授的一篇文献和一本书看起 1.文献: 从PID技术到"自抗扰控制"技术(<控制工程>,2 ...

  4. 博途PLC ADRC自抗扰控制完整SCL源代码

    关于自抗扰控制框图可以参看专栏的其它文章,这里不再讲解具体算法过程,详细了解也可以参看韩京清研究员写的 <ADRC自抗扰>一书.限于本人水平和能力,文中难免出现错误和不足之处,诚恳的欢迎大 ...

  5. 2020-12-29 Matlab自动化控制-Adrc自抗扰控制参数调节

    Matlab自动化控制-Adrc自抗扰控制参数调节 上篇参看:https://blog.csdn.net/qingfengxd1/article/details/111830762 以最简单的线性组合 ...

  6. 交流异步电机矢量控制(四)——simulink仿真搭建

    前言:前面的三篇文章已将理论部分基本分析完了,下阶段就是对异步电机的矢量控制仿真模型进行搭建,结合前面梳理的理论知识看看矢量控制是不是那回事儿,能不能够实现这个转矩.电流和转速三个指标的控制,另外,验 ...

  7. 【电力电子技术DC-AC】电流跟踪PWM控制三相逆变器的simulink仿真

    电力电子技术 电流跟踪PWM控制三相逆变器的simulink仿真 一.电流跟踪PWM定义 二.Simulink仿真分析 1.问题提出 2.分析问题 3.Simulink元件选取 4.PWM信号发生电路 ...

  8. 车道检测、自适应巡航控制和编队matlab simulink仿真建模模型

    车道检测.自适应巡航控制和编队matlab simulink仿真建模模型 ID:8630672358957146一無所有`

  9. ADRC自抗扰控制总结

    目录 前言 1.ADRC形式 1.1形一 1.2形二 2.被控对象 3.仿真分析 3.1仿真模型 3.2仿真结果 4.学习问题 前言 前面的3篇文章依次介绍了微分跟踪器TD.状态观测器ESO和非线性状 ...

最新文章

  1. [文摘20070307]英语表示“走”的20种形式
  2. MyEclipse-Web开发时何时重启tomcat、重新部署
  3. 手机长时间不用自动断网_不用蓝牙的感应音箱,只需百元!放上手机自动播放,媲美千元音质...
  4. Linux下完全卸载ORACLE 10G的方法
  5. centos启动Nginx提示nginx: [emerg] still could not bind()
  6. ethercat主站给从站分配多个地址_Profinet 与 EtherCAT 网关使用方法
  7. Exchange 2016部署实施案例篇-01.架构设计篇(上)
  8. require.js使用(一)
  9. 读书笔记--Head First Programming 目录
  10. 用 Ajax 和 RSS 攒个首页新闻——(上)
  11. 存储在U盘中的文件被误删后怎么免费恢复
  12. Android平台集成华为AGC性能管理服务问题处理指南
  13. 成功解决android 网络视频边下载变播放。
  14. Mysql查询各科成绩前三名并分别排序
  15. bat脚本实现遍历文件夹下所有jar文件名
  16. deny of sb sth_deny的短语
  17. Spark技术内幕:究竟什么是RDD
  18. AJAX基础入门实例教程(含代码)
  19. 银行数据采集,数据补录与指标管理3大问题如何解决?
  20. STRAIGHT之基频提取

热门文章

  1. 高通平台开发系列讲解(外设篇)高通Camera软件架构
  2. sqlserver wait millis 60003, active 0, maxActive 20, creating 0(String)
  3. 谷歌移动UI框架Flutter教程之Widget
  4. 入行多年软件测试总结的经验
  5. unity,通俗解释什么是协程
  6. Orin 调试GMSL camera遇到问题之MIPI CSI2 报文解析
  7. 微耕门禁控制器的刷卡开刷卡关功能
  8. FL Studio教程之扫弦器命令
  9. 准独角兽已出现,火爆的隐私计算赛道谁是头部玩家?
  10. Android MultiDex 源码分析