ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

三阶LADRC自抗扰控制器Simulink仿真模型搭建与参数整定

三阶LADRC自抗扰控制器Simulink仿真模型搭建与参数整定 做控制真的绕不开PID但用久了你会发现PID最难受的地方不是结构复杂而是面对强扰动、模型参数大幅变化的时候调参逻辑很容易崩。三阶线性自抗扰控制器LADRC恰恰是在这个痛点上站稳脚跟的方案——它能在不依赖精确被控对象模型的前提下自己用一个扩张状态观测器ESO把“总扰动”实时估出来再在反馈里把它抵消掉。这篇博文不聊虚的我直接把一个已经封装好、能在Simulink里拿起来就用的三阶LADRC仿真模型完整拆给你看从原理到建模、从参数整定到排错把整个搭建过程都走一遍。适合正在做运动控制、伺服系统、飞行器控制等方向的同学也适合想把手里的PID方案升级一波的工程师参考。按照我的习惯文章不会只贴一张模型截图就完事。我会把每个模块为什么要这么搭、每个参数怎么影响系统行为都讲清楚这样你照着搭完不仅能跑通还能在Demo模型基础上改出适合自己对象的一套东西。尤其最后封装成子系统那一步做项目的同学应该深有体会——一个能拖拽复用的模块比一段反复复制的散装模型省心太多了。1. 先搞懂三阶LADRC到底在做什么1.1 自抗扰控制的核心思想把“未知”变成“已知”我在实际项目里发现很多人一开始会把自抗扰想得太玄其实它的出发点非常朴素。假设被控对象可以近似写成二阶积分器串联[ \ddot{y}f(y,\dot{y},d,t)b_0u ]这里把模型内部不确定性、参数偏差、外部扰动全部打包进一个标量 f 里。传统的做法是想办法建立精确模型把 f 拆开或者用积分器慢慢消除它的影响自抗扰的做法则完全不同——先假设 f 未知然后设计一个观测器把它当成一个扩张出来的状态在线估计出来最后在控制量里减掉。它叫“扩张状态观测器”就是因为比普通的观测器多了一个“扩张状态”这个状态不是被控对象的物理变量而是总扰动。整篇文章所有公式和模块都是围着“估计并抵消总扰动”这件事转的。这里可以打个比方。你管理一支小团队某个员工的真实产出其实由两部分组成一部分是工作能力本身另一部分是当天的各种干扰比如临时会议、系统卡顿、临时任务。如果你能把这些干扰预测出来并且从业绩评估里扣掉剩下的就是对这个人能力的真实度量。ESO干的就是这件事它每个采样周期都在把“干扰”从测量输出中分离出来。理解了这一点后面看Simulink里那一堆Gain、Sum、Integrator就不会觉得乱了。1.2 “三阶”到底指哪个阶命名习惯先对齐这个点特别容易踩坑因为文献里有两种称呼方式。一种按扩张状态观测器的阶数来叫一种按被控对象的相对阶来叫。比如同样是控制一个二阶对象按ESO阶数称呼它是“三阶LADRC”因为对象两个状态加上总扰动一个状态一共三个按对象相对阶称呼它是“二阶LADRC”。如果是三阶对象那ESO就要扩成四阶按对象阶数称呼才是“三阶LADRC”。我在这篇博文里采用工程论坛和论文里更常见的第一种称呼三阶LADRC指的是ESO为三阶、被控对象相对阶为2的经典结构。这也是运动控制里用得最多的构型比如电机转速环、伺服位置环把机械环节近似成二阶是合理的。如果你手里的对象确实是三阶也不用慌设计思路完全一样ESO矩阵往上加一维控制器增益按闭环特征多项式 (sωc)³ 展开就行第5章我会给出推广公式。先把二阶对象这个最常见的情况吃透其他都是照猫画虎。1.3 和PID、状态观测器放在一起看很多同学问我既然PID用了这么多年为什么还要用LADRC我一般直接列一张对比表方案模型依赖程度需要整定的参数扰动处理方式适合场景PID低3个Kp、Ki、Kd靠积分项慢慢磨工况稳定、扰动平缓全维状态观测器高模型参数必须准靠精确建模模型已知且确定性高LADRC低3个b0、wc、wo在线估计并主动抵消强扰动、模型不确定性大从表格能看出来LADRC把“模型依赖”和“参数数量”这两件事同时压下来了。PID虽然模型依赖也低但它本质上是被动抵抗扰动积分器有滞后遇到大幅突加负载恢复时间往往不好看。LADRC因为把扰动当成状态来观测补偿动作更主动动态响应自然就快。这也是为什么标题里说“动态响应迅速、参数调节方便”不是宣传话术——它的整定参数确实就三个而且物理含义很直观后面讲整定流程时你就知道有多方便了。2. 控制器结构拆解ESO、控制律和b0是怎么协同工作的2.1 ESO的状态方程与增益计算三阶LADRC的观测器设计基础是这样一个模型重写对象本来是一个二阶微分方程我们把总扰动 f 当成第三个状态。令 z1yz2ẏz3f那么状态方程就是[ \dot{z}_1z_2 ] [ \dot{z}_2z_3b_0u ] [ \dot{z}_3\dot{f} ]写成矩阵形式就是教科书里常见的样子。核心操作来了虽然 f 的真实变化率未知我仍然可以给这个三阶系统设计一个经典龙伯格观测器[ \dot{\hat{z}}A\hat{z}BuL(y-\hat{z}_1) ]这里的 L 是观测器增益向量决定ESO的收敛速度。传统做法是尝试配几个极点参数一堆调起来麻烦。LADRC最聪明的地方是引入了带宽化设计让L只由一个参数ωo决定。把三个观测器极点全部配置在 -ωo 处利用二项式展开[ s^3\beta_1s^2\beta_2s\beta_3(s\omega_o)^3 ]于是得到[ \beta_13\omega_o,\quad \beta_23\omega_o^2,\quad \beta_3\omega_o^3 ]这一步是整个LADRC参数调节方便的关键。三个观测器增益被压缩成一个ωo你只需要知道“观测器要比闭环快多少”而不是分别去调三个系数。放在Simulink里就是几个Gain模块的事但理解了背后的极点配置逻辑你才能根据仿真现象判断是该加ωo还是该减ωo。2.2 控制律双重带宽带来的“参数调节方便”ESO把总扰动 f 估出来之后剩下的控制律设计就非常简单了。先构造一个中间控制量 u0让对象变成一个双积分器[ u_0k_p(r-z_1)-k_dz_2 ]然后做扰动补偿[ u\frac{u_0-z_3}{b_0} ]代回原对象方程如果ESO估计够准那么 f≈z3对象就会降阶成[ \ddot{y}\approx u_0 ]换句话说ESO把乱七八糟的模型不确定性和外部扰动全部抵消掉之后控制器只需要对付一个双积分器就行了。对这个双积分器闭环特征多项式配成[ s^2k_dsk_p(s\omega_c)^2 ]所以[ k_p\omega_c^2,\quad k_d2\omega_c ]这里又出现了一个带宽 ωc和观测器带宽 ωo 合起来整个控制器的参数就是两个带宽加一个 b0。实际操作的时候我一般把ωo设在ωc的3到10倍让ESO比外环控制快但又不能太快把噪声放大。这个比例关系就是你调参时最核心的抓手。2.3 b0的作用唯一需要的模型信息b0在式子里是“控制输入到输出二阶导”的放大系数是整个LADRC里唯一需要知道的模型信息。这个参数到底有多重要从公式就能看出来如果b0估计得和实际b不一致那么(b-b0)u这一项会被ESO当成总扰动的一部分估出来并补偿掉。所以LADRC对b0的误差有一定容忍度这正是它比传统状态观测器鲁棒的原因。但也不能指望b0随便猜一个就能工作。b0偏离太远时ESO需要花很大带宽去补偿这个偏差可能导致控制量抖动甚至发散。我的经验是b0定准到实际值的30%以内LADRC都能工作得很好如果差一个数量级那就别想稳了。估算b0的常用方法有三种机理建模直接算、阶跃响应法、软件辨识。第一和第三种比较常规阶跃响应法我多说一句——在工作点附近给一个控制输入阶跃Δu记录输出二阶导的稳定值Δÿb0就近似等于Δÿ/Δu。这个办法在仿真和现场都试过挺实用。3. Simulink模型搭建全过程从对象到可拖拽子系统3.1 模型整体架构与模块清单先给出一份模块清单你照着往下搭就行。这个Demo我用的是带模型偏差和外部扰动的二阶对象参数故意和控制器里的b0留一点偏差这样才能看出ESO的补偿效果。模块数量作用关键设置Step1参考输入 r阶跃时间0.5s幅值1Step Sine Wave2外部扰动 d(t)5s后突加1.0正弦幅值0.2两个Integrator2构成被控对象初始值0Gain若干对象模型系数a14a040b30State-Space1ESO矩阵按2.1节配置Gain Sum若干控制律kp、kd、b0Saturation1执行器限幅[-10, 10]Scope / To Workspace若干记录y、u、z3方便后续分析整个模型的结构是参考信号进控制器控制器输出经过限幅后同时送进“真实对象”和“ESO”对象输出y也同时送进ESOESO输出z1、z2、z3控制律根据误差信号和z3算出控制量。这个结构看起来简单但每个细节都有讲究下面一节一节讲。3.2 搭建被控对象和扰动注入通道被控对象我用了一个带阻尼和固有频率的典型二阶模型[ \ddot{y}-a_1\dot{y}-a_0ybud(t) ]参数取 a14a040b30。这个对象有自然振荡倾向不是光秃秃的积分器更像实际伺服系统。控制器里我故意把b0设成25和真实b30差20%这样能直观看到ESO在这种失配下仍然能完成扰动补偿。搭建过程不复杂先放两个Integrator串联第一个积分器输出速度量第二个输出位置量。输入u经过Gain模块增益30进加法器速度量经过Gain增益4负反馈位置量经过Gain增益40负反馈加法器输出进第一个积分器。扰动通道我用一个Step信号在5s时突加1.0再叠加一个幅值0.2、频率1Hz的正弦波模拟时变扰动。这样扰动既有阶跃分量又有连续变化分量ESO到底有没有干活看z3的波形就一目了然。我特别建议你把扰动的突变时刻和幅值记录在注释里方便后面做参数对比时知道每次仿真里发生了什么。实际项目里这个扰动通道就对应突加负载、摩擦力跳变、机械间隙等物理现象后面做实验时只要把阶跃扰动换成负载力矩就行。3.3 ESO观测器模块的两种搭建方式ESO的搭建方式我推荐两种各有适用场景。第一种是直接用State-Space模块矩阵配置干净适合快速验证。在State-Space模块里填入[ A_{eso}\begin{bmatrix} -3\omega_o 1 0\ -3\omega_o^2 0 1\ -\omega_o^3 0 0 \end{bmatrix},\quad B_{eso}\begin{bmatrix} 0 3\omega_o\ b_0 3\omega_o^2\ 0 \omega_o^3 \end{bmatrix} ]注意这里B矩阵有两列输入向量是 [u; y]第一列对应控制输入u的增益第二列对应测量输出y反馈到每个积分器通道的增益。输出矩阵设成单位矩阵这样z1、z2、z3三个估计值都能送到外部。初始条件要设置成 [0;0;0] 或者和对象初值一致。第二种是用Integrator加Gain手动搭状态变量可视化调试方便。三个积分器串联第一级输出z1第二级输出z2第三级输出z3在z1输出端加一个增益β1反馈到第一级输入端z2反馈端加β2z3反馈端加β3。控制输入u则通过增益b0注入第二级输入端测量输出y通过增益β1、β2、β3分别注入到三级。这种搭建虽然模块多但你可以随时用Scope看出每一级估计状态遇到ESO估计异常时排查速度特别快。我实际项目中通常是先用State-Space把闭环
返回列表