前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >ADRC自抗扰控制,有手就行「建议收藏」

ADRC自抗扰控制,有手就行「建议收藏」

作者头像
全栈程序员站长
发布于 2022-08-31 07:15:39
发布于 2022-08-31 07:15:39
3.7K012
代码可运行
举报
运行总次数:12
代码可运行

大家好,又见面了,我是你们的朋友全栈君。

ADRC自抗扰控制,有手就行

  关于ADRC的优点本人不会赘述,毕竟作为一个ADRC算法都推导不出来的应用工程师,最希望看到的就是有手就行的操作方法。ARC的缺点就显而易见,就是参数多,一环ADRC大概就有11个参数,但一个粗略的效果很快就出来。本文所有的言论仅以我最近的一次速度闭环控制经验之谈,并没有经过大量的实验验证其绝对正确性,慎用(注:文中公式来自于csdn用户:遥远的乌托邦,有稍作修改)。   ADRC说白了就是PID的升级版,保留了PID的优点,改良了PID的缺点,其结构和PID一样,ADRC可以被看作三个作用效果的结合,分别是TD(跟踪微分器)、ESO(扩张状态观测器)、NLSEF(非线性控制律)。TD是为了防止目标值突变而安排的过渡过程;ADRC的灵魂就在于ESO,其作用下文给客官细细道来;NLSEF是为了改良PID直接线性加权(输出=比例+积分+微分)的缺点而引进的非线性控制律,其更符合非线性系统。

**TD跟踪微分器**

  从上图看到TD只有输入v0(系统的目标值),其输出的v1为v0的过渡过程,例如v0原先是0,突然将v0改成10,那么v0就有个突变,而v1不会随v0突变,而是慢慢的爬升到v0,不会有静差也不会有超调,v1的爬升时间取决于TD参数(具体TD参数在下文给出并做解析)调整,也可以调整成跟随v0突变。v2是v1的导数,即v1的微分。   其数学公式如下:

**ESO扩张状态观测器**

  上图中可以看出ESO的输入是有两项,一项是反馈值y,另一项是输出值u *b0(b0被称为系统系数)。输出则为z1、z2、z3;z1和z2是被称为系统的两个状态,z1的数值是跟随着输出y的,假若系统闭环成功的话,z1,、y、v1三个数值应该是一样的。z2是跟随y的微分的,加入系统闭环成功的话,z2、y的微分、v2三个数值应该是一样的。z3是系统扩张的一个状态,观测的是系统的总扰动,z3是自抗扰的灵魂所在。   ESO数学公式:

**NLSEF非线性控制律**

  NLSEF输入是e1(e1=v1-z1)、e2(e2=v2-z2),其输出是u1,u1并没有叠加系统总扰动补偿,它只是NLSEF的输出,并不是系统的最终输出。系统最终的输出是直接作用到被控对象的量u(u=u-z3/b)。   w(t)是假定的一个系统总扰动。   NLSEF的数学公式有几种那么多,本人仅使用了第二种:

**ADRC程序c语言版**

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/******************ADRC program with C******************** // write by suitcalaw // copy by the high hand net world // https://blog.csdn.net/b457738242 **********************2020-12-07*************************/

//参数区,这11个就是需要用户整定的参数
/****************TD**********/
float r = 0,//快速跟踪因子
      h = 0;//滤波因子,系统调用步长

/**************ESO**********/
float b       = 0,//系统系数
      delta   = 0,//delta为fal(e,alpha,delta)函数的线性区间宽度
      belta01 = 0,//扩张状态观测器反馈增益1
	  belta02 = 0,//扩张状态观测器反馈增益2
	  belta03 = 0;//扩张状态观测器反馈增益3
	  
/**************NLSEF*******/
float alpha1 = 0,//
      alpha2 = 0,//
      belta1 = 0,//跟踪输入信号增益
      belta2 = 0;//跟踪微分信号增益
	  
	  
/*****************************fhan函数*********************************/
float fhan(float x1,float x2,float r,float h)
{ 
   
 /*****************************第一套************************/
// float d = 0,
// a = 0,
// a0 = 0,
// a1 = 0,
// a2 = 0,
// y = 0,
// fhan = 0;
// 
// d = r*h*h;
// a0 = h*x2;
// y = x1+a0;
// a1 = sqrtf(d*(d+8*fabsf(y)));
// a2 = a0 + sign(y)*(a1 - d)/2.0;
// a = (a0+y)*(sign(y+d)-sign(y-d))/2.0 + a2*(1-(sign(y+d)-sign(y-d))/2.0);
// fhan = -r*(a/d)*(sign(y+d)-sign(y-d))/2.0 - r*sign(a)*(1-(sign(a+d)-sign(a-d))/2.0);
 /******************************第二套**********************/
	float deltaa  =0,
		  deltaa0 =0,
	      y       =0,
	      a0      =0,
	      a       =0,
	      fhan    =0;
	
	deltaa = r*h;
	deltaa0 = deltaa*h;
	y=x1+x2*h;
	a0 = sqrtf(deltaa*deltaa+8*r*fabsf(y));
	if(fabsf(y)<=deltaa0)
		a=x2+y/h;
	else
		a=x2+0.5*(a0-deltaa)*sign(y);
	if(fabsf(a)<=deltaa)
		fhan = -r*a/deltaa;
	else
		fhan = -r*sign(a);
	
  return fhan;
}
/************************************sign函数***************************/
float sign(float x)
{ 
   
	if(x>0)
		return 1;
	else if(x<0)
		return -1;
	else
		return 0;
}
/*******************************fal函数**********************************/
float fal(float e,float alpha,float delta)
{ 
   
  float result = 0,fabsf_e = 0;
  
  fabsf_e = fabsf(e);
  
  if(delta>=fabsf_e)
    result = e/powf(delta,1.0-alpha);
  else //if(delta<fabsf_e)
    result = powf(fabsf_e,alpha)*sign(e);
 
 return result;     
}
//中间变量区,不需要用户管理以及赋值
/****************TD*******************/
float x1 = 0,//跟踪输入
      x2 = 0,//跟踪输入的微分
/****************ESO******************/
      e  = 0,//误差
	  z1 = 0,//跟踪反馈值
	  z2 = 0,//跟踪反馈值的而微分
	  z3 = 0,//跟踪系统的扰动(总扰动)
/**************NLSEF******************/
      u = 0;//输出值
/********************************ADRC************************************/
float ADRC(float v,float y)  // 参数:v:输入的目标值; y:反馈值
{ 
   
  float u0 = 0,
        e1 = 0,
		e2 = 0;
/******************************TD****************************************/
  x1 = x1 + h*x2;
  x2 = x2 + h*fhan(x1-v,x2,r,h);
/******************************ESO***************************************/
  e = z1 - y;
  z1 = z1 + h*(z2-belta01*e);
  z2 = z2 + h*(z3-belta02*fal(e,0.5,delta)+b*u);
  z3 = z3 + h*(-belta03*fal(e,0.25,delta));
/******************限幅,ADRC正常的话不会达到限幅条件********************/
  if(z1>=30000) z1=30000;
  if(z1<=-30000) z1 = -30000;
  if(z2>=30000) z2=30000;
  if(z2<=-30000) z2 = -30000;
  if(z3>=30000) z3=30000;
  if(z3<=-30000) z3 = -30000;
/******************************NLSEF*************************************/
  e1 = x1 - z1;
  e2 = x2 - z2;
  
  u0 = belta1*fal(e1,alpha1,delta) + belta2*fal(e2,alpha2,delta);//其中0<alpha1<1<alpha2
  
  u = u0 - z3/b;
  
  return u;
}

  代码是根据上面的公式直接撸过来的,下图是ADRC的11个参数,就是我们需要整定的参数了。

**参数整定**

  参数整定的规律是先将TD参数整定好,再整定ESO和NLSEF。   TD的参数整定是最简单的,观测v1的输出和输入v0的线性,其跟随的快慢并没有规定一定要多快多慢,取决于你想要的效果。TD参数只有两个:快速因子r 和滤波因子h 。其中,r 与跟踪速度呈正相关,然而,随之带来的是噪声放大的副作用;h与滤波效果呈正相关,但当h增大时,跟踪信号的相位损失也会随之增加。滤波因子经常取值为ADRC控制周期,比如1ms调用一次,h就是0.001,这也不是死定的,可以根据自己的效果做细微调整。

TD随动跟踪效果图

  ESO共有b、delta、belta01、belta02、belta03共5个参数,其中delta取值范围在5h<=delta<=10h,h为ADRC控制周期。参数整定可以先将b定下来,比如取1或者2(最好还是能够知道你的二阶系统系数),然后先后调整belta01、belta02、belta03,观测z1能不能够很好的跟随反馈y,如果是,那么大概参数就调好了;如果不是,可以改动一下b,还是不行的话就得认认真真的检测一下反馈y是不是出了什么问题,比如变量数据类型转换有没有做好。如果懂得自己在输出中加入随机数(白噪声),注意幅值不能过大,观测一下z3是不是能够很好的观测到随机扰动。若以上两个条件都成立,那么ADRC就几乎被整定好了。   NLSEF参数有alpha1,alpha2,belta1,belta2四个,其中0<alpha1<1<alpha2。belta1和belta2则视效果而定,通常ESO和NLSEF一起调,在整定ESO参数时,可以先把delta1和delta2定为1,再调ESO,待ESO有一定效果后,反复调整ESO参数无果,可以加入NLSEF参数整定,取得更好的效果。   以上是本人的一次电机闭环ADRC的经历,其中曲曲折折,非自动化专业的我,跟着论文也推不出ADRC算法,只好这样先用着,效果也显著。我还是会继续修读自动控制原理,终有一天也会将ADRC算法推导明白,再细细分析。如有错误,也请见谅,如有侵犯,请联系修改。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/144267.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年5月1,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
自抗扰控制(ADRC)仿真系统(matlab/simulink)的搭建
一、现在关于自抗扰控制技术方面的研究已经比较成熟了,基本上熟悉结构以后都可以找到例子实现,今天以一个简单的例子来介绍自抗扰控制的仿真系统搭建,不必畏惧,熟悉皆可达。 1.首先自抗扰控制分为TD(跟踪微分器),非线性组合,ESO扩张状态观测器。而每部分的公式推导均可在《自抗扰控制技术-估计补偿不确定因素的控制技术》这本书中找到,很推荐,如果有些不了解的地方也可以搜索韩老师的论文看看。
全栈程序员站长
2022/08/26
2.6K1
自抗扰控制(ADRC)仿真系统(matlab/simulink)的搭建
ADRC例程
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/144311.html原文链接:https://javaforall.cn
全栈程序员站长
2022/08/26
5930
ADRC例程
(ADRC)自抗扰控制器学习总结(一)
1.标准型与总扰动,扩张状态与扰动整体辨识,微分信号生成与安排过渡过程以及扰动的消减与控制量产生。
全栈程序员站长
2022/08/31
1.3K0
(ADRC)自抗扰控制器学习总结(一)
Matlab自动化控制-Adrc自抗扰控制
想要初步了解ADRC,可以从韩京清教授的一篇文献和一本书看起 1.文献: 从PID技术到“自抗扰控制”技术(《控制工程》,2002) 2.书: 自抗扰控制技术——估计补偿不确定因素的控制技术
用户9925864
2022/07/27
1.1K2
Matlab自动化控制-Adrc自抗扰控制
初步认识ADRC(自抗扰控制)与应用
想要初步了解ADRC,可以从韩京清教授的一篇文献和一本书看起 1.文献: 从PID技术到“自抗扰控制”技术(《控制工程》,2002) 2.书: 自抗扰控制技术——估计补偿不确定因素的控制技术
全栈程序员站长
2022/08/31
5.9K0
关于ADRC算法以及参数整定(调参)的一些心得体会
ADRC,全称叫做Active Disturbance Rejection Control,中文名是自抗扰控制技术。这项控制算法是由中科院的韩京清教授提出的。韩教授继承了经典PID控制器的精华,对被控对象的数学模型几乎没有任何要求,又在其基础上引入了基于现代控制理论的状态观测器技术,将抗干扰技术融入到了传统PID控制当中去,最终设计出了适合在工程实践中广泛应用的全新控制器。
全栈程序员站长
2022/08/31
3.4K0
第三周编程作业-Planar data classification with one hidden layerPlanar data classification with one hidden l
Planar data classification with one hidden layer Welcome to your week 3 programming assignment. It's time to build your first neural network, which will have a hidden layer. You will see a big difference between this model and the one you implemented using
致Great
2018/04/11
3.3K0
第三周编程作业-Planar data classification with one hidden layerPlanar data classification with one hidden l
ADRC学习心得(持续更新)[通俗易懂]
两年前第一次接触到PID觉得很高深,很神奇;后来逐渐觉得单纯的PID小儿科了,又了解到专家PID,模糊PID,神经网络PID这些改进算法,再后来又知道了ADRC,便感控制领域浩如烟海,所学不过沧海一粟。然便纵真理无穷,进一寸自有一寸的欢喜。 不敢说看了几篇论文,听了几节报告,做了几次仿真,就吃透ADRC了,不过只是一些粗浅的理解,记录一行歪歪斜斜的足迹。以便回首过眼云烟之时,可以安慰自己一句,我已经飞过。
全栈程序员站长
2022/08/31
1.2K0
Matlab自动化控制-Adrc自抗扰控制参数调节
以最简单的线性组合方法(1)为例,大概有如下参数需要调节: TD: delta h ESO: B01、B02、B03和观测器带宽w0 非线性反馈:(beta1、beta2)用kp和kd代替,alpha 对于TD,一般的仿真模型delta 可以尽量大一些,在100~500范围内基本相同,即使再大效果也基本不会有大的提升。h即仿真模型中的仿真步长。 ESO的三个参数和观测器带宽有关,依次设置为3w0、3w0^2、 w0^3就可以满足要求。 所以最终需要调节的参数只有四个:kp kd w0 alpha。这时候就可以控制变量了。 基本规律是: alpha越小调节时间越短,但是过小会导致震荡。 w0越小调节时间越长,震荡幅度越小。 Kp越大调节时间越短,震荡越大。 kd效果不太明显,可在稳定后微调。 经验就是: 1、确保ADRC建模过程中没有错误 2、确保输入的测试信号的幅值对你的被控对象是合理的
用户9925864
2022/07/27
9720
自抗扰控制(ADRC)—— python 实战「建议收藏」
本文利用跟踪微分器(TD)+ 扩张状态观测器(ESO)+ 非线性 PID 实现了受外扰的未知系统的控制,使得受控系统输出了期望的信号。
全栈程序员站长
2022/08/30
1.4K0
自抗扰控制(ADRC)—— python 实战「建议收藏」
ADRC学习笔记(二)
参数中:V(t)是目标值h、h0为积分步长,一般来说h可以等于h0,但是为了减少超调和减少震荡,才把他们分开,一般h0比h大,比如大20倍。当h0较大时,能够明显减少震荡,所以也叫滤波因子。减小h可以抑制噪声放大作用。r为速度因子,值越大,逼近速度越快,但是最好根据实际被控对象的可承受能力而定。 表达式中:其中fhan函数第一种表达式为:
全栈程序员站长
2022/08/26
8970
ADRC学习笔记(二)
adrc过渡过程 c语言,初步认识ADRC与应用「建议收藏」
二、为什么PID好,以及,为什么PID不够好1.为什么PID好——基于模型的现代控制理论不实用
全栈程序员站长
2022/08/31
1K0
adrc过渡过程 c语言,初步认识ADRC与应用「建议收藏」
一文搞定BP神经网络——从原理到应用(原理篇)「建议收藏」
本文着重讲述经典BP神经网络的数学推导过程,并辅助一个小例子。本文不会介绍机器学习库(比如sklearn, TensorFlow等)的使用。 欲了解卷积神经网络的内容,请参见我的另一篇博客一文搞定卷积神经网络——从原理到应用。
全栈程序员站长
2022/09/09
4.7K1
一文搞定BP神经网络——从原理到应用(原理篇)「建议收藏」
Convolution_model_Application_v1a
Welcome to Course 4's second assignment! In this notebook, you will:
列夫托尔斯昊
2020/08/25
1.7K0
Convolution_model_Application_v1a
matlab的三维绘图和四维绘图「建议收藏」
光照是利用方向官员照亮物体的技术,这项技术能使表面微妙的差异更容易看到,光照也能用来对三维的图像增加现实感。
全栈程序员站长
2022/11/10
6.5K0
matlab的三维绘图和四维绘图「建议收藏」
卡尔曼滤波应用及其matlab实现
房间温度在25摄氏度左右,测量误差为正负0.5摄氏度,方差0.25,R=0.25。Q=0.01,A=1,T=1,H=1。
全栈程序员站长
2022/09/07
1.2K0
卡尔曼滤波应用及其matlab实现
机器学习开发者应该收藏的 DIY 计算机视觉和深度学习项目
受到 Akshay Bahadur 所做伟大工作的鼓舞,在这篇文章中你将看到一些应用计算机视觉和深度学习的项目,包括具体实现和细节,你可以在自己的电脑上复现这些项目。
AI研习社
2018/07/26
6400
机器学习开发者应该收藏的 DIY 计算机视觉和深度学习项目
bzoj 3225: [Sdoi2008] 立方体覆盖 题解「建议收藏」
Time Limit: 2 Sec Memory Limit: 128 MB Submit: 51 Solved: 36 [ Submit][ Status]
全栈程序员站长
2022/07/10
2100
深入机器学习系列之:隐式狄利克雷分布(1)
这一系列我们将会分两篇推送来详细介绍隐式狄利克雷分布,今天为大家带来LDA的数学预备知识以及LDA主题模型的介绍。
数据猿
2019/11/20
1.1K0
深入机器学习系列之:隐式狄利克雷分布(1)
不对称因子g的理论计算
不对称因子g是分子不对称程度的一种度量,在研究手性化合物的光物理性质时是一个很重要的参数。手性化合物与光发生作用,会产生圆二色谱(CD)和圆偏振发光(CPL)两种光谱,前者为吸收,后者为发射,它们的关系类似紫外-可见吸收和荧光发射间的关系。大致原理可参考下图[1]:
用户7592569
2023/09/03
4.6K0
不对称因子g的理论计算
推荐阅读
相关推荐
自抗扰控制(ADRC)仿真系统(matlab/simulink)的搭建
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验