自抗扰控制(ADRC)这玩意儿挺有意思的,核心就仨部件:跟踪微分器、扩张观测器、非线性反馈。咱们直接上硬货,手撕代码看门道
基于扩张状态观测器的自抗扰控制ADRC仿真模型 ①跟踪微分器TD:为系统输入安排过渡过程得到光滑的输入信号以及输入信号的微分信号。 ②非线性状态误差反馈律NLSEF:把跟踪微分器产生的跟踪信号和微分信号与扩张状态观测器得到的系统的状态估计通过非线性函数进行适当组合作为被控对象的控制量 ③扩张状态观测器ESO作用是得到系统状态变量的估计值及扩张状态的实时作用量。 附赠相关自抗扰学习资料跟踪微分器TD干的事儿就像给控制信号套个缓冲垫。举个栗子突然让电机从0转到1000转TD能让指令变成个平滑曲线。看这段离散实现function [v1, v2] TD(v1_prev, v2_prev, target, r, h) d r*h; a0 h*v2_prev; y v1_prev a0; a1 sqrt(d^2 8*r*abs(y - target)); if abs(y - target) d v1 v1_prev h*v2_prev - r*h*sign(y - target); else v1 v1_prev h*v2_prev - (y - target)*h*r/d; end v2 v2_prev - r*h*sat((y - target), d); end参数r控制跟踪速度越大越快但可能抖。h是步长工程上常取采样周期。重点在非线性函数saturate处理避免微分信号突变。注意第7行的分段处理这就是安排过渡过程的精髓——离目标远时猛追近了就温柔刹车。扩张观测器ESO是ADRC的灵魂能把系统状态和扰动都扒出来。比如二阶系统def eso(z1, z2, z3, y, u, beta1, beta2, beta3, h): e y - z1 z1 h*(z2 beta1*e) z2 h*(z3 beta2*nonlinear_fal(e, 0.5, 0.01) b*u) z3 h*(beta3*nonlinear_fal(e, 0.25, 0.01)) return z1, z2, z3这里z3就是扩张状态——专门吃扰动。nonlinear_fal函数用指数平滑误差避免高频噪声。beta参数组决定观测器带宽经验公式beta13w, beta23w², beta3w³w大概取系统带宽的3~5倍。重点看第4行把控制量u和模型参数b耦合进去这样观测器才能区分系统动态和扰动。基于扩张状态观测器的自抗扰控制ADRC仿真模型 ①跟踪微分器TD:为系统输入安排过渡过程得到光滑的输入信号以及输入信号的微分信号。 ②非线性状态误差反馈律NLSEF:把跟踪微分器产生的跟踪信号和微分信号与扩张状态观测器得到的系统的状态估计通过非线性函数进行适当组合作为被控对象的控制量 ③扩张状态观测器ESO作用是得到系统状态变量的估计值及扩张状态的实时作用量。 附赠相关自抗扰学习资料非线性反馈NLSEF玩的是组合艺术float nlsef(float v1, float v2, float z1, float z2, float z3, float alpha, float delta){ float e1 v1 - z1; float e2 v2 - z2; float u0 alpha1 * fal(e1, 0.5, delta) alpha2 * fal(e2, 0.25, delta); return (u0 - z3) / b; }fal()函数长这样function f fal(e, alpha, delta) if abs(e) delta f abs(e)^alpha * sign(e); else f e / (delta^(1-alpha)); end end这里alpha1时误差大时增益小防止超调误差小时增益大提高精度。z3直接补偿扰动这才是自抗扰的抗字精髓。注意最后除以b把模型参数从控制量里解耦出来实现动态线性化。仿真时注意三点耦合顺序先TD生成理想轨迹再ESO估计状态扰动最后NLSEF生成控制量。参数调试先从ESO开始确保观测器收敛后再调TD速度最后微调非线性函数参数。代码里那些0.5、0.25的指数不是玄学是多次实验后平衡响应速度与稳定性的经验值。完整Simulink模型和调试记录已打包评论区留言获取下次聊聊怎么把这套理论移植到STM32上用C语言手搓实时控制器。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2457449.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!