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

2023-05-16

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

非线性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公式:
在这里插入图片描述

在这里插入图片描述

公式不难理解,接下来,我将对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
  • 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;
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;
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');
  • 1
  • 2
  • 3

在这里插入图片描述

效果:
在这里插入图片描述

显然效果不好。

再来看看非线性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
  • 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

效果:

在这里插入图片描述

可见效果好多了,因此非线性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;
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));
end
if abs(e1)>delta
    fal1=(abs(e1))^(alfa1)*sign(e1);
end
if abs(e1)<=delta
    fal2=e1/(delta^(1-alfa2));
end
if abs(e1)>delta
    fal2=(abs(e1))^(alfa2)*sign(e1);
end

z2_k=z2_k_1+h*(z3_k_1-beta02*fal1+b*uk);
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
  • 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和百度云,大家有需要自取哈!!!!!!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 自抗扰控制(ADRC)仿真系统(matlab/simulink)的搭建

    一 现在关于自抗扰控制技术方面的研究已经比较成熟了 xff0c 基本上熟悉结构以后都可以找到例子实现 xff0c 今天以一个简单的例子来介绍自抗扰控制的仿真系统搭建 xff0c 不必畏惧 xff0c 熟悉皆可达 1 首先自抗扰控制分为TD
  • Simulink建模:PID控制-串级PID

    本文研究串级PID控制的概念 应用场景以及Simulink模型实现 文章目录 1 问题引入2 串级PID控制3 Simulink建模3 1 建模前的理解3 2 建模过程3 3 代码生成 4 总结 1 问题引入 在之前的博客 Simulink
  • simulink bus总线创建方法

    在simulink中创建bus总线 xff0c 主要包含2种方法 xff1a 基于模块创建总线对象 使用模块 xff0c 根据输入信号创建总线 基于 MATLAB 数据创建总线对象 可以使用 Simulink Bus cellToObjec
  • Keil+Simulink生成Xcp标定协议A2L文件

    Keil 43 Simulink生成Xcp标定协议A2L文件 由于最近要为ECU移植XCP协议 xff0c 所以记录一下 xff0c 我使用的MCU为NXP S32K144 IDE选用MDK 官方IDE S32DS无代码联想功能 xff0c
  • 使用Simulink进行无刷直流电机控制仿真

    这段时间刚开始接触Matlab中的Simulink仿真 xff0c 我就结合自己的专业 xff0c 利用Simulink进行了无刷直流电机的仿真 xff0c 因为Simulink工具箱里面有很多可用的模块 xff0c 所以建模过程变得非常简
  • 1699_simulink代码生成配置初级方案

    全部学习汇总 xff1a GreyZhang g matlab MATLAB once used to be my daily tool After many years when I go back and read my old lea
  • 1708_Simulink中取数组元素

    全部学习汇总 xff1a GitHub GreyZhang g matlab MATLAB once used to be my daily tool After many years when I go back and read my
  • 无人机六旋翼数学建模[matlab-simulink]

    写在前面 xff0c 这篇文章是借鉴Drexel University 的Senior Design project的matlab simulink四旋翼模型 xff0c 在此基础上针对六旋翼进行的基本改进 xff0c 这里只对 43 型模
  • 从Simulink到PX4——Simulink-PX4插件安装与环境搭建

    从Simulink到PX4 Simulink PX4插件安装与环境搭建 前言0 准备工作1 安装WSL2 Setting up the PX4 Toolchain on Windows3 Setting up the PX4 Tool Ch
  • Simulink中的Simscape

    Simscape是在Simulink环境下创建物理系统模型的工具和语言 8 它可以通过基于Matlab语法的Simscape语法来制作自己的物理仿真系统 如果使用Simscape中现有的基础库 xff08 Foundation Librar
  • 手把手教你使用simulink配合STM32CUBEMX (生成keil项目实战)

    本文的作者在自学过程中发现该类资料的缺少 以及前人叙述不够完善的情况下 进行了本文的创作 文章将一步一步的讲解如何使用simulink将F4的灯点亮 更多的功能我们一起探索 别的型号的 cpu 大家可以类比进行 1 首先是将MATLAB安装
  • simulink电力电子仿真(3)单相桥式全控整流电路

    simulink电力电子仿真 3 单相桥式全控整流及有源逆变电路 返回目录 主要是赶上了疫情 然后期末要疯狂补实验报告 就索性写一下吧 万一以后再做电力电路仿真 可能会有用的 也希望可以帮助别人 器件的选择及位置 MATLAB的版本 201
  • 【通信原理课设--基于MATLAB/Simulink的2ASK数字带通传输系统建模与仿真】课程设计报告大纲

    1 摘要 研究现状 对本设计模型的介绍 2 目录 自动生成即可 3 概述 3 1 课程设计背景 该设计的应用现状 针对应用部分 3 2 国内外研究背景 对该设计的研究状况 针对学术研究 3 3 报告组织形式 介绍本报告的框架结构 4 系统模
  • 单相半桥逆变器仿真技巧

    1 拓扑与控制 单相半桥逆变器拓扑如下 电压环和电流环控制图如下 调制方式如下 2 仿真步骤 单相半桥逆变器的仿真应该遵循以下步骤 1 选择合适的滤波电感和滤波电容 一般是mH级别 2 选择合适的调制度 注意由于半桥电容电压波动过大 往往不
  • 基于相干解调法和基于相位比较法的2DPSK数字通信系统 MATLAB Simulink仿真

    1 课程设计目的 通过课程设计 巩固已经学过的通信原理课程中有关数字调制系统的知识 加深对相关知识的理解和应用 学会应用Matlab Simulink工具对通信系统进行仿真和调试 设计与实现的过程中充分利用图书馆和网络资源 提高发现问题和自
  • 2021-02-28

    simulink控制器封装库 控制器封装库 一 封装库的安装和LADRC模块的使用
  • 1. 模型的代码生成 - 代码生成方法

    文章目录 1 模型的代码生成 代码生成方法 1 1 模型的解算器solver设置 1 2 生成的系统目标文件设置 1 3 其它生成代码的设置 1 3 1 硬件平台设置 1 3 2 Optimization页面的设置 1 3 3 Report
  • VSC/SMC(十六)——自适应鲁棒滑模控制

    目录 1 参数不定和扰动不定但有界的系统 2 滑模控制自适应律设计 2 1控制律设计总结 3 仿真分析 3 1 PD控制 3 2普通自适应律 3 3映射自适应律 3 4总结 4学习问题 1 参数不定和扰动不定但有界的系统 其中 2 滑模控制
  • 如何在simulink中创建计数器

    我想计算我的信号变为零的次数 例如 将脉冲信号作为输入 我想要一个变量来计算脉冲变为零的次数 我正在疯狂地思考某事 有人可以帮助我吗 谢谢 figure 1 is a pulse counter model and figure 2 is
  • 以编程方式连接两个子系统

    我正在尝试以编程方式重用我之前开发的一些自定义块 模型来构建一个复杂的模型 但我无法设法连接两个 PMC Port 这就是我所拥有的 Main system sys name model sys new system sys name op

随机推荐