ADRC自抗扰控制自学笔记(包含simulink仿真)(转载)
他这里让我很好理解了跟踪微分器
非线性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)
- 避免输入量不要有跳变,便于实际系统实时跟踪。因为传统的pid有个问题,就是当跟踪像阶跃信号这种突变信号时超调和上升时间共存的现象,所以我们的思路就是对输入的信号进行平滑处理,也就是避免其出现突变。
- 过滤高频噪声
所以输出1就是处理过的信号,第二个信号是输出1的微分,输出1和2都将用于下一环节,这里不介绍。
说明:蓝色为处理后的阶跃信号,显然就好很多,没有那么突变。黄色为微分。
公式不难理解,接下来,我将对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产生。
实验:演示非线性pd相比传统pd的优越性
sys = tf([133],[1,25,0])
dsys = c2d(sys,0.001,'z');[num,den]=tfdata(dsys,'v');
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
当然,我们这里用的是非线性pd控制,我们也可以用论文中的非线性pid控制,同理,这一部分公式为:
三、ESO扩张观测器
一般观测器仅观测系统的状态,只有输出和输出的导数(速度)。但是这里对输出的导数的导数(加速度)也进行了观测,这里也就是所谓的扰动(即第一张图中的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仿真)(转载)相关推荐
- (一)ADRC自抗扰控制-各部分简介与仿真
前言 简单的说,ADRC可以理解为PID增强版,主要由ESO(扩展状态观测器).非线性(或线性)控制器.TD(跟踪微分器)组成,其灵魂也是最核心的地方是ESO. TD(跟踪微分器) 跟踪微分器是对输入 ...
- ADRC自抗扰控制从Simulink仿真到PLC控制实现
ADRC自抗扰算法专栏有详细学习笔记和PLC完整源代码,大家可以自行查看,链接如下: ADRC自抗扰控制算法(含梯形图完整源代码和算法公式)_RXXW_Dor的博客-CSDN博客PLC的自抗扰控制(A ...
- 2020-12-28 Matlab自动化控制-Adrc自抗扰控制
Matlab自动化控制-Adrc自抗扰控制 想要初步了解ADRC,可以从韩京清教授的一篇文献和一本书看起 1.文献: 从PID技术到"自抗扰控制"技术(<控制工程>,2 ...
- 博途PLC ADRC自抗扰控制完整SCL源代码
关于自抗扰控制框图可以参看专栏的其它文章,这里不再讲解具体算法过程,详细了解也可以参看韩京清研究员写的 <ADRC自抗扰>一书.限于本人水平和能力,文中难免出现错误和不足之处,诚恳的欢迎大 ...
- 2020-12-29 Matlab自动化控制-Adrc自抗扰控制参数调节
Matlab自动化控制-Adrc自抗扰控制参数调节 上篇参看:https://blog.csdn.net/qingfengxd1/article/details/111830762 以最简单的线性组合 ...
- 交流异步电机矢量控制(四)——simulink仿真搭建
前言:前面的三篇文章已将理论部分基本分析完了,下阶段就是对异步电机的矢量控制仿真模型进行搭建,结合前面梳理的理论知识看看矢量控制是不是那回事儿,能不能够实现这个转矩.电流和转速三个指标的控制,另外,验 ...
- 【电力电子技术DC-AC】电流跟踪PWM控制三相逆变器的simulink仿真
电力电子技术 电流跟踪PWM控制三相逆变器的simulink仿真 一.电流跟踪PWM定义 二.Simulink仿真分析 1.问题提出 2.分析问题 3.Simulink元件选取 4.PWM信号发生电路 ...
- 车道检测、自适应巡航控制和编队matlab simulink仿真建模模型
车道检测.自适应巡航控制和编队matlab simulink仿真建模模型 ID:8630672358957146一無所有`
- ADRC自抗扰控制总结
目录 前言 1.ADRC形式 1.1形一 1.2形二 2.被控对象 3.仿真分析 3.1仿真模型 3.2仿真结果 4.学习问题 前言 前面的3篇文章依次介绍了微分跟踪器TD.状态观测器ESO和非线性状 ...
最新文章
- [文摘20070307]英语表示“走”的20种形式
- MyEclipse-Web开发时何时重启tomcat、重新部署
- 手机长时间不用自动断网_不用蓝牙的感应音箱,只需百元!放上手机自动播放,媲美千元音质...
- Linux下完全卸载ORACLE 10G的方法
- centos启动Nginx提示nginx: [emerg] still could not bind()
- ethercat主站给从站分配多个地址_Profinet 与 EtherCAT 网关使用方法
- Exchange 2016部署实施案例篇-01.架构设计篇(上)
- require.js使用(一)
- 读书笔记--Head First Programming 目录
- 用 Ajax 和 RSS 攒个首页新闻——(上)
- 存储在U盘中的文件被误删后怎么免费恢复
- Android平台集成华为AGC性能管理服务问题处理指南
- 成功解决android 网络视频边下载变播放。
- Mysql查询各科成绩前三名并分别排序
- bat脚本实现遍历文件夹下所有jar文件名
- deny of sb sth_deny的短语
- Spark技术内幕:究竟什么是RDD
- AJAX基础入门实例教程(含代码)
- 银行数据采集,数据补录与指标管理3大问题如何解决?
- STRAIGHT之基频提取
热门文章
- 高通平台开发系列讲解(外设篇)高通Camera软件架构
- sqlserver wait millis 60003, active 0, maxActive 20, creating 0(String)
- 谷歌移动UI框架Flutter教程之Widget
- 入行多年软件测试总结的经验
- unity,通俗解释什么是协程
- Orin 调试GMSL camera遇到问题之MIPI CSI2 报文解析
- 微耕门禁控制器的刷卡开刷卡关功能
- FL Studio教程之扫弦器命令
- 准独角兽已出现,火爆的隐私计算赛道谁是头部玩家?
- Android MultiDex 源码分析