Matlab自动化控制-Adrc自抗扰控制

想要初步了解ADRC,可以从韩京清教授的一篇文献和一本书看起
1.文献: 从PID技术到“自抗扰控制”技术(《控制工程》,2002)
2.书: 自抗扰控制技术——估计补偿不确定因素的控制技术

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

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

ADRC特点:

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

一、跟踪微分器(TD)

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

  • 避免输入量不要有跳变,便于实际系统实时跟踪。因为传统的pid有个问题,就是当跟踪像阶跃信号这种突变信号时超调和上升时间共存的现象,所以我们的思路就是对输入的信号进行平滑处理,也就是避免其出现突变。

  • 过滤高频噪声

所以输出1就是处理过的信号,第二个信号是输出1的微分,输出1和2都将用于下一环节,这里不介绍。

先摆出他的输出效果图,输入为阶跃信号:

说明:蓝色为处理后的阶跃信号,显然就好很多,没有那么突变。黄色为微分。

TD公式

Simulink仿真模型:

友情提示:离散差分方程建模和连续系统微分方程建模一样,先找准输出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;endout=out1;end

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

function [y1k,y2k] = fcn(u)persistent y1k_1 y2k_1h=0.01;delta=10;if isempty(y1k_1)    y1k_1=0;end
if isempty(y2k_1)    y2k_1=0;end
y1k=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)>d0    a=y2k_1+(a0-d)/2*sign(y);end
if abs(y)<=d0    a=y2k_1+y/h;end
if abs(a)>d    out1=-delta*sign(a);end
if abs(a)<=d    out1=-delta*a/d;endout=out1;% 更新变量y2k=y2k_1+h*out;
y1k_1=y1k;y2k_1=y2k;
end

验证效果:

t = 0:0.01:2;u = zeros(length(t), 1);u (t >=1) = 1;figureplot(t,u)y1k = zeros(length(t), 1);y2k = zeros(length(t), 1);for i = 1:length(t)    [y1k(i),y2k(i)] = fcn(u(i));endfigureplot(t,y1k)figureplot(t,y2k)

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


二、非线性组合

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

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

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

对比一下传统PID和非线性PID

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有效果!!!!!!

三、ESO扩张观测器

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

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

ESO的公式见下图:

Simulink fcn模型:

里面的代码如下:

function [z1_k,z2_k,z3_k] = ESO(yk,uk)%%参数初始化persistent  z1_k_1 z2_k_1 z3_k_1bata01=30;beta02=300;beta03=1000;b=5;h=0.001;alfa1=0.25;alfa2=0.5;delta=0.002;fal1=1;fal2=1;if isempty(z1_k_1)    z1_k_1=0;endif isempty(z2_k_1)    z2_k_1=0;endif isempty(z3_k_1)    z3_k_1=0;end
e1=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)<=delta    fal1=e1/(delta^(1-alfa1));endif abs(e1)>delta    fal1=(abs(e1))^(alfa1)*sign(e1);endif abs(e1)<=delta    fal2=e1/(delta^(1-alfa2));endif abs(e1)>delta    fal2=(abs(e1))^(alfa2)*sign(e1);end
z2_k=z2_k_1+h*(z3_k_1+b*uk)-beta02*fal1;z2_k_1=z2_k;%%迭代更新z2_k_1
z3_k=z3_k_1-h*beta03*fal2;z3_k_1=z3_k;%%迭代更新z3_k_1
end

但要注意:因为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.注意上面第三节的黑色注意部分

开始仿真,报错了:

翻译过来就是说存在代数环的原因

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

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

修改后的simulink为:

或者(两者等价):

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

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

2020-12-28 Matlab自动化控制-Adrc自抗扰控制相关推荐

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

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

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

    他这里让我很好理解了跟踪微分器 非线性PID(准确说是非线性PD,所以可以看到输入是两根线而不是三根线)  也就是说传统PID是线性的?但是不是那些系统是非线性的,比如无人机,平衡车,只是小幅度里近似 ...

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

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

  4. 基于自抗扰控制ADRC的主动悬架控制

    目录 前言 1. 悬架系统 2.ADRC流程图 3.仿真分析 3.1  性能指标和观测效果对比 3.2控制输入对比 3.3 性能指标均方根对比 4.总结 前言 之前通过4篇文章介绍了ADRC,并且在最 ...

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

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

  6. ADRC自抗扰控制总结

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

  7. 如何将谷歌浏览器的背景色(包括显示的网站界面等)全部调为黑色?2020.12.28

    (请先看置顶博文)https://blog.csdn.net/GenuineMonster/article/details/104495419 因为电脑显示器正对窗户的原因,平时为了透气通风不能使用遮 ...

  8. 458、Java框架112 -【MyBatis - 一级缓存、二级缓存】 2020.12.28

    目录 0.一级缓存 1.在一个Session里查相同id的数据 2.在不同Session里查相同id的数据 3.二级缓存 4.基于前一个知识点 5.观察无二级缓存 6.启动二级缓存 7.在Catego ...

  9. 2020.12.28 ps临摹

    欢迎观看阿贝贝啊的今日成果 今天临摹了一张书本上的作业 涉及的工具不是很多,都是基础小玩意. 需要素材可私聊. 感谢观看阿贝贝啊的今日划水 日常 .

最新文章

  1. centOS7 LNMP+phpmyadmin环境搭建 第三篇phpmyadmin安装
  2. Log4j官方文档翻译(一、基本介绍)
  3. containerd镜像导入import和push命令 gzip压缩解压缩命令
  4. rocketmq 消息 自定义_RocketMQ的消息发送及消费
  5. 面试官问我:什么是JavaScript闭包,我该如何回答
  6. Python 爬虫: 抓取花瓣网图片
  7. 不附加数据库 ASP.NET调用.sql文件
  8. centos php 绑定域名,centos如何绑定域名?
  9. go及IDE LiteIDE的安装及环境变量配置
  10. 软路由安装openwrt
  11. iOS - Carthage的安装和使用,以及常见报错解决
  12. 记录一次组装台式机设置U盘启动
  13. 基本内置类型 声明与定义 static与entern const auto register volatile
  14. ibm mq 编程_IBM SOA编程模型简介
  15. sphinx在windows下的简单安装与使用
  16. 仅改变rowspan背景_真实的他们《王者荣耀》全英雄历史故事以及设定背景介绍...
  17. SceneKit做一个旋转的地球效果
  18. 获取电脑桌面上图标的信息
  19. 关于2022考研报名,这些你需要知道
  20. 两组数据的相关性分析

热门文章

  1. 基于Keras的LSTM多变量时间序列预测
  2. 支持向量机原理(二)
  3. 线性回归实例-鸢尾花数据集
  4. LeetCode-链表-203. 移除链表元素
  5. HJ12 字符串反转
  6. redis 面试问题问答Top 10
  7. Java 实现 SSH 协议的客户端登录认证方式--转载
  8. 源代码解读Cas实现单点登出(single sign out)功能实现原理--转
  9. 【Mysql】纯sql报表
  10. Quorum企业以太坊环境搭建教程