大家好,又见面了,我是你们的朋友全栈君。
关于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) hcdot(z_2(k)-beta_{01}e) \ z_2(k 1)=z_2(k) hcdot(z_3(k)-beta_{02}e bu(k)) \ z_3(k 1)=z_3(k)-hcdotbeta_{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)=u0−z3(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}=3omega_o, beta_{02}=3omega_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,之后尽可能选用大的带宽。
代码语言:javascript复制带宽多大合适?
一是,看扰动补偿的输出大小和实际系统可接受的输入范围是否匹配;
二是看是否已经发生了抖震现象。
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.cn/144223.html原文链接:https://javaforall.cn