关于ADRC算法以及参数整定(调参)的一些心得体会

关于ADRC算法以及参数整定(调参)的一些心得体会关于ADRC算法以及参数整定(调参)的一些心得体会ADRC,全称叫做ActiveDisturbanceRejectionControl,中文名是自抗扰控制技术。这项控制算法是由中科院的韩京清教授提出的。韩教授继承了经典PID控制器的精华,对被控对象的数学模型几乎没有任何要求,又在其基础上引入了基于现代控制理论的状态观测器技术,将抗干扰技术融入到了传统PID控制当中去,最终设计出了适合在工程…

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

关于ADRC算法以及参数整定(调参)的一些心得体会

ADRC,全称叫做Active Disturbance Rejection Control,中文名是自抗扰控制技术。这项控制算法是由中科院的韩京清教授提出的。韩教授继承了经典PID控制器的精华,对被控对象的数学模型几乎没有任何要求,又在其基础上引入了基于现代控制理论的状态观测器技术,将抗干扰技术融入到了传统PID控制当中去,最终设计出了适合在工程实践中广泛应用的全新控制器。

1. ADRC介绍

一般来说,ADRC控制器包括三个组件:跟踪微分器,非线性状态反馈(非线性组合),扩张观测器。ADRC的框图如下(盗图自《从PID技术到“自抗扰控制”技术》):
在这里插入图片描述
简单的介绍下ADRC的结构:

  • 安排过渡过程就是跟踪微分器,主要目的就是为了输入量不要有跳变,便于实际系统实时跟踪。
  • 非线性反馈实际上就是PD控制的进阶版本,PD控制计算控制律的方法是线性加权的,而非线性反馈则先用了非线性函数对误差和误差的微分进行处理,之后再进行加权。
  • 扩张观测器(ESO)是一个状态观测器,一般观测器仅观测系统的状态,只有输出和输出的导数(速度)。但是这里对输出的导数的导数(加速度)也进行了观测,这里也就是所谓的扰动,对扰动进行了观测。观测器的状态量也由此扩张了一维,因此叫做扩张观测器。(目前对观测器的认识还非常粗浅,欢迎大家批评指正。)
  • 扰动补偿部分,也就是框图中间的红框部分。这里是整个ADRC的核心部分,说成是ADRC的灵魂也不为过。扰动补偿的核心思想就是要把原系统通过控制律设计改造成积分器级联的二阶系统,这样即使是最普通的PD控制器也可以对其进行控制。在这个改造过程中,补偿量u综合考虑了系统内部扰动、外部扰动、模型不确定性等等。这个补偿的原理也可以详细阅读韩老师的《从PID技术到“自抗扰控制”技术》,非常简单,但是非常高明。

2. 线性ADRC的参数整定

注意,这里介绍的是线性ADRC的参数整定方式。ADRC分为三部分,跟踪微分器的参数整定比较容易,很多地方都有介绍,这里就不再细说了。这里主要介绍其余参数的整定方法。首先线性ADRC的公式罗列如下:
e = z 1 ( k ) − y ( k ) z 1 ( k + 1 ) = z 1 ( k ) + h ⋅ ( z 2 ( k ) − β 01 e ) z 2 ( k + 1 ) = z 2 ( k ) + h ⋅ ( z 3 ( k ) − β 02 e + b u ( k ) ) z 3 ( k + 1 ) = z 3 ( k ) − h ⋅ β 03 e e 1 = v 1 ( k ) − z 1 ( k ) ,   e 2 = v 2 ( k ) − z 2 ( k ) u 0 = k p e 1 + k d e 2 u ( k ) = u 0 − z 3 ( k ) / b \begin{array}{lcl} e=z_1(k)-y(k) \\ z_1(k+1)=z_1(k)+h\cdot(z_2(k)-\beta_{01}e) \\ z_2(k+1)=z_2(k)+h\cdot(z_3(k)-\beta_{02}e+bu(k)) \\ z_3(k+1)=z_3(k)-h\cdot\beta_{03}e \\ e_1=v_1(k)-z_1(k),\ e_2=v_2(k)-z_2(k)\\ u_0=k_pe_1+k_de_2\\ u(k)=u_0-z_3(k)/b \end{array} e=z1(k)y(k)z1(k+1)=z1(k)+h(z2(k)β01e)z2(k+1)=z2(k)+h(z3(k)β02e+bu(k))z3(k+1)=z3(k)hβ03ee1=v1(k)z1(k), e2=v2(k)z2(k)u0=kpe1+kde2u(k)=u0z3(k)/b
其中,重要的参数包括六个:
β 01 ,   β 02 ,   β 03 ,   k p ,   k d , b \beta_{01},\ \beta_{02},\ \beta_{03},\ k_p,\ k_d, b β01, β02, β03, kp, kd,b

  • β 01 ,   β 02 ,   β 03 \beta_{01},\ \beta_{02},\ \beta_{03} β01, β02, β03 是观测器的参数,根据高志强老师的研究结论(参考论文《Scaling and bandwidth-parameterization based controller tuning》),可以依据观测器带宽的概念来设计参数,即 β 01 = 3 ω o ,   β 02 = 3 ω o 2 ,   β 03 = ω o 3 \beta_{01}=3\omega_o,\ \beta_{02}=3\omega_o^2,\ \beta_{03}=\omega_o^3 β01=3ωo, β02=3ωo2, β03=ωo3。其中, ω o \omega_o ωo是观测器带宽。
  • k p ,   k d k_p,\ k_d kp, kd相当于PD控制器的增益参数。
  • b b b是补偿系数,和被控对象模型有一定关系。

根据高老师的结果,那么我们的线性ADRC需要整定的参数就只剩下四个了:
ω o ,   k p ,   k d , b \omega_o, \ k_p,\ k_d, b ωo, kp, kd,b

2.1 关于这四个参数有什么整定规律呢?

关于带宽 ω o \omega_o ωo

  • 当扰动频率低时,用太大的带宽,会让 z 3 z_3 z3的抖震很大,自然输出抖震也很大。但是随着扰动频率增加,用大的带宽就没有问题,也不会有抖震。
  • 当带宽增加时, z 3 z_3 z3的估计值明显变大了,也就是扰动的补偿量会变大。也就是说,当扰动频率增加时,用大一点的带宽可以更好的抑制扰动。

关于补偿系数 b b b

  • 加大 b b b能减少 ω o \omega_o ωo变大带来的抖震,但是加大b就会让扰动的补偿量变小,抑制扰动的效果可能会有折扣。

关于 k p ,   k d k_p,\ k_d kp, kd

  • 固定 ω o \omega_o ωo b b b的情况下,增加 k p k_p kp对扰动补偿的幅值没有任何影响,即与扰动的补偿无关。但是 k p k_p kp增加到一定程度以后,也会引发抖震现象。这个时候增加 ω o \omega_o ωo,又可以减少抖震。另外,大带宽和大 k p k_p kp带来的控制效果会更好。同样,这个时候增加 b b b也可以减少抖震,但是控制效果会变差。
  • k d k_d kd过大的时候,也会引起抖震。当 k d k_d kd比较大的时候,带宽就不能设置得太大了。 k d k_d kd过大引发的抖震绝对不可以用提高带宽来解决,必须通过加大 b b b来解决,但是一般而言,加大 b b b都会使得控制效果大打折扣。可以通过减小 k p k_p kp来克服,这样控制效果不会有太大的损失。

当被控对象发生抖震时,可能的解决方法有:

  • 抖震发生时,减小带宽、增大b、减小 k d k_d kd、或者增大 k p k_p kp(大带宽对应大 k p k_p kp)、减小 k p k_p kp k p k_p kp太大引发抖震)都有可能可以解决问题。

2.2 参数整定策略

1、固定一个 b b b,设定较小的 k p k_p kp k d k_d kd,之后尽可能选用大的带宽。

带宽多大合适?
一是,看扰动补偿的输出大小和实际系统可接受的输入范围是否匹配;
二是看是否已经发生了抖震现象。

2、选定好带宽以后,逐步调高 k p k_p kp k d k_d kd
3、在 ω o ,   k p ,   k d \omega_o, \ k_p, \ k_d ωo, kp, kd三个参数都调好了,但是控制效果依然不满意,可以尝试调整 b b b,之后再进行一次上述过程。

另外,如果对应最开始选定的 b b b,找不到稳定的 ω o ,   k p ,   k d \omega_o, \ k_p, \ k_d ωo, kp, kd,那么就加大 b b b,直到可以找到稳定的 ω o ,   k p ,   k d \omega_o, \ k_p, \ k_d ωo, kp, kd

2.3 前面一切都是浮云,这才是重点!!!

最后,我想说,前面的这些都是我的经验之谈,没有经过任何的理论分析,未必适合你的应用。尽管我花了很长时间,希望找到一份资料,给出关于ADRC参数整定的权威的理论,但是最后也是徒劳无功。所以,我要给出最重要的一个方法论了。 如果你只想把ADRC在你的实验平台上用一用的话,你完全可以按照我提供的路数来行事!

首先,在Simulink里搭建被控对象的仿真模型;其次,固定三个参数,单纯改变一个参数,观察每个状态量的变化趋势;再次,总结每个参数对系统的影响;最终,你就能找到对于你的系统的参数整定方法啦!

你要相信,虽然我说的是最基本的控制变量法>_<,但是一定会比你无脑瞎调节省很多很多时间的。(别问我为什么知道,毕竟我就是这样过来的。。。)

3. 最后的最后,关于实际控制的一点小贴士

  • 如果你是控制电机的话,除了电机本身,电机驱动板的选择对于你的控制精度也是非常非常非常重要的。
  • 在仿真里做得很好,但是实际系统里是有限幅的,这是导致系统非线性的一个重要原因。
  • 传感器的采样频率也是影响控制效果的重要因素,尤其是控制频率比较高时。
  • 仿真还是很有必要的!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

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

(0)
上一篇 2022年5月20日 上午6:00
下一篇 2022年5月20日 上午6:00


相关推荐

  • uuid生成方法

    uuid生成方法UUID 生成方法算法原理 UidGenerator 是百度开源的 Java 语言实现 基于 Snowflake 算法的唯一 ID 生成器 而且 它非常适合虚拟环境 比如 Docker 另外 它通过消费未来时间克服了雪花算法的并发限制 UidGenerator 提前生成 ID 并缓存在 RingBuffer 中 压测结果显示 单个实例的 QPS 能超过 6000 000 托管地址 https github com baidu uid generator 依赖环境 JDK8 MySQL 用于分配 WorkerI

    2026年3月20日
    3
  • 如何关闭135端口、139端口、445端口

    如何关闭135端口、139端口、445端口都知道 135 端口 139 端口以及 445 端口 这三个端口容易被黑客或者病毒利用 所以我们今天就来教下大家如何关闭它 太难的方法就不教给大家了 什么实用策略组之类的 新手感觉很麻烦 所以下面给大家来简单的教程方法一 直接用软件关闭它 工具下载点击 Close Disable 就可以了方法二 打开可以将下面的代码复制到文本里面然后保存为 1

    2026年3月16日
    2
  • Ubuntu Pycharm部分问题

    Ubuntu Pycharm部分问题不能显示中文 1 添加字体 下载新的 ttf 字体 然后放入在 jbr lib fonts 文件夹中 重启 Pycharm2 修改 Fallbackfont 为可以显示中文的字体 如微软雅黑不能输入中文修改 pycharm bin pycharm sh 文件 ibus 类型的输入法 exportGTK IM MODULE ibusexportQT IM MODULE ibusexportXM im ibusfcitx 类型的输入法 exportGTK IM MODULE fcitx

    2026年3月17日
    2
  • 元宝DeepSeek-R1满血版!免费稳定不排队

    元宝DeepSeek-R1满血版!免费稳定不排队

    2026年3月12日
    3
  • 索引覆盖

    索引覆盖索引覆盖如果查询的列恰好是索引的一部分 那么查询只需要在索引文件上进行 不需要回行到磁盘再找数据 这种查询速度非常快 称为 索引覆盖 假设有一张 t15 表 在表中建立了一个联合索引 cp cat id price 当我们使用下面的 sql 语句 会出现索引覆盖的情况 不信我们可以来查看一下 这里的 Extra 中显示了 Usingindex 表示这条 sql 语句刚好用到了索引覆盖 selectpricef

    2026年3月26日
    2
  • Informix 常用函数

    Informix 常用函数一、内部函数1、内部合计函数1)COUNT(*)返回行数2)COUNT(DISTINCTCOLNAME)返回指定列中唯一值的个数3)SUM(COLNAME/EXPRESSION)返回指

    2022年7月3日
    25

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号