大家好,又见面了,我是你们的朋友全栈君。
初步认识ADRC与应用
初步认识ADRC与应用
这是一个目录ADRC的基本原理一、参考资料推荐
二、为什么PID好,以及,为什么PID不够好1.为什么PID好——基于模型的现代控制理论不实用
2.为什么PID不够好——PID的缺点
三、ADRC给出的方案——如何保留PID的优点,同时弥补PID的缺点1. 误差的取法——安排过渡过程
2. 由误差提取误差微分的方法——跟踪微分器
3. 加权和的策略不一定最好——非线性反馈
4. 积分反馈的副作用——扩张状态观测器
ADRC的公式以及参数整定一、跟踪微分器(TD)
二、非线性反馈函数
三、扩张状态观测器(ESO)
ADRC应用到二阶导弹模型matlab脚本
simulink模型
一、参考资料推荐
想要初步了解ADRC,可以从韩京清教授的一篇文献和一本书看起
1.文献: 从PID技术到“自抗扰控制”技术(《控制工程》,2002)
2.书: 自抗扰控制技术——估计补偿不确定因素的控制技术
不过文章里讲的不是很细,是把之前多篇文章内容综合到一起提出了ADRC整体的控制框架。想要更深入学习当然还是看书更好一些。
二、为什么PID好,以及,为什么PID不够好
1.为什么PID好——基于模型的现代控制理论不实用
经典的PID控制直到如今都还是应用最广泛的控制算法,大部分的控制系统里用的都还是这个。它的好处主要在于,不需要被控对象的模型。
什么是被控对象的模型?
举个例子,假设我们以小车的速度VVV为被控量,但是推动小车的力FFF才是我们的控制量。
考虑阻力并假设阻力和速度成正比的话,根据牛顿第二定律我们可以得到小车的动力学方程 F?kV=maF-kV=maF?kV=ma,其中kkk为阻力系数,mmm为小车质量。
根据质点运动学方程又有 V˙=a\dot{V}=aV˙=a,
这样就可以得到利用外力FFF控制小车速度VVV的模型 V˙=?kmV+1mF\dot{V}=-\frac{k}{m}V+\frac{1}{m}FV˙=?mk?V+m1?F
(也就是 x˙=?Ax+Bu\dot{x}=-Ax+Bux˙=?Ax+Bu的线性模型的结构)
OK,这个方程通常就是我们需要的,如果要应用现代控制理论(比如最优控制)设计一个控制器,那么我们就需要知道这个模型的全部信息东西,在这里就是模型的结构以及阻力系数kkk和小车质量mmm。
获得这个模型存在两个问题:
实际工程的模型结构远比这复杂。比如阻力和速度的关系可能并不是成正比,我们只是这么假设的,实际的的关系可能是一个复杂的非线性函数。
模型的参数难以获得。这里的阻力系数kkk和小车质量mmm好像挺容易获得的,但是实际被控对象的模型参数可能要多的多,有些是很难获得的。
由于模型难获得,而现代控制理论又大多基于模型设计,因此大都不够实用,这也就导致了PID一直称霸各个控制领域。因为PID是只利用误差 eee 来计算控制量的,只需要调一调 KP,KI,KDK_P,K_I,K_DKP?,KI?,KD? 三个参数就能得到可以接受的效果。
2.为什么PID不够好——PID的缺点
注意到前面说 PID 能得到可以接受的效果,我们当然希望PID能够得到更好的控制效果,那么PID还有哪些不足呢?
以下摘自前面说的韩京清的那篇文章
误差的取法
由误差提取误差微分的方法
加权和的策略不一定最好
积分反馈有许多副作用
三、ADRC给出的方案——如何保留PID的优点,同时弥补PID的缺点
上一节写了PID的几个缺点,下面一条一条解释这些缺点的意思,并给出ADRC的解决方案:
1. 误差的取法——安排过渡过程
直接根据给定指令计算误差可能会导致控制效果变差,比如有些指令里包含了我们不希望的高频信号,这类信号的例子有:阶跃指令,方波指令。
为了将高频信号解决掉,ADRC提出了安排“过渡过程”的方法,类似于把给定指令进行低通滤波,得到一个更容易实现的指令。
这里给个例子,考虑两个系统,一个带有指令滤波,一个不带:
当指令为单位阶跃指令,只用一个增益K=2K=2K=2来控制二阶系统1s2+s\frac{1}{s^2+s}s2+s1?的时候,有无指令滤波器的效果如下:
不难看到,加了指令滤波器之后,虽然上升速度变慢了,但是超调更小了,调节时间基本没变,甚至还缩短了。
安排过渡过程也是类似这样的道理。
2. 由误差提取误差微分的方法——跟踪微分器
利用经典的滤波器来获得微分信号,如果想要使得微分更加准确,会不可避免的放大噪声。能不能即使微分准确,又不使得噪声被过度放大?
结合1和2,ADRC提出了一种跟踪-微分器,在安排过渡过程的同时获得指令微分。跟踪的意思就是跟踪指令信号。
3. 加权和的策略不一定最好——非线性反馈
传统的线性反馈方式(就是误差直接乘上一个增益)在收敛速度以及抗扰动能力上存在不足。
ADRC的方案是 用非线性函数代替传统的增益(用非线性反馈代替线性反馈)。
这里也可以举个例子,比较两个系统,分别使用线性反馈和非线性反馈:(1) x˙=?Kx\dot{x}=-Kxx˙=?Kx
以及 (2) x˙=?K?sign(x)?∣x∣α(α<1)\dot{x}=-K*sign(x)*|x|^\alpha(\alpha<1)x˙=?K?sign(x)?∣x∣α(α<1)
假设x0≠0x_0≠0x0??=0,则可以证明系统(2)能在有限时间内收敛到0,而系统(1)是指数收敛的,意思是永远收敛不到0。
这里也给一个仿真例子:
初始值为1时,仿真结果:
可以看到非线性反馈更快地收敛到0了,不过需要注意的是非线性反馈相对于线性反馈的快速性的优势只在x<1x<1x<1的时候才有,而且在靠近x=1x=1x=1的附近容易引起颤振。
4. 积分反馈的副作用——扩张状态观测器
积分的主要作用之一就是消除扰动(可以认为它是简单的扰动观测器),但是积分起作用比较慢,而且还会引起超调。
所以ADRC直接把积分舍弃了,使用扩张状态观测器来观测总扰动,将系统补偿成纯积分链(不知道这个学名是啥)的形式。这样控起来就容易多了,可以说,扩张状态观测器是ADRC的灵魂和精髓所在,在它面前,前面几个都是次要的。
用一个例子说明一下上面所说的几点:
假设某系统 x˙=u+w\dot{x}=u+wx˙=u+w,其中xxx为状态量(也是被控量),uuu为控制量,www为未知的总扰动(包括模型偏差或者外部扰动等等)。
比较两种情况,一种是www没有被补偿,在线性反馈的基础上加上积分反馈去抵消,以达到无静差的目的。另一种是把www补偿掉,只剩一个积分环节,采用普通的线性反馈。
第一种情况:u=?KP?x?KI?∫xdτu=-K_P*x-K_I*\int{x}d\tauu=?KP??x?KI??∫xdτ
w=0.2,x0=1w=0.2,x_0=1w=0.2,x0?=1,取KP=2K_P=2KP?=2
先看一下没有积分反馈(也就是KI=0K_I=0KI?=0)时xxx最后能控成什么样子
得到的 xxx 的仿真结果为:
接着给出有积分反馈(如上上图,也就是KI=0.8K_I=0.8KI?=0.8)时xxx最后能控成什么样子
得到的 xxx 的仿真结果为:
再看一下KI?∫xdτK_I*\int{x}d\tauKI??∫xdτ与www的对比情况
这里说的是积分器对扰动的观测效果,其实应该是补偿效果。可以看到积分环节产生的超调现象比较明显,并且如果积分增益取大了则超调就大,如果取的小则收敛就慢,没辙。
第二种情况我们把扰动去掉(假设被观测出来然后补偿掉了),只用一个KPK_PKP?来控,那么结果的就很容易想到了:闭环之后这是一个单纯的惯性环节,没有超调,收敛的快慢只和增益有关,增益越大,收敛越快。
和前面的图4一样:
对于一阶系统来说,就是把模型补偿成一个积分环节(nnn阶系统补偿之后就是nnn个积分串在一起)。
xxx 的仿真结果:
通过对比可以发现,还是把扰动补偿掉更好。
利用扩张状态观测器,ADRC理论上可以把一个任意阶的系统补偿成任意阶的积分链,然后就可以用简单的线性控制方法去实现控制了,而且也能得到较好的控制效果。所以说扩张状态观测器是ADRC的精髓(个人理解哈)
前面一直是一些简单的例子解释说明ADRC的各个组成部分,只是对概念的理解。接下来要给出ADRC的公式以及我对其参数的理解,理解参数的含义能够大大提升参数整定的能力。
一、跟踪微分器(TD)
二、非线性反馈函数
三、扩张状态观测器(ESO)
matlab脚本
simulink模型
初步认识ADRC与应用相关教程
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/144456.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...