基于MATLAB的自抗扰控制器(ADRC)全流程仿真与验证系统
项目简介
本项目构建了一套完整的自抗扰控制器(ADRC)算法仿真平台,旨在验证二阶系统在复杂工况下的控制性能。系统基于MATLAB脚本开发,完全实现了自抗扰控制技术的三个核心模块:跟踪微分器(TD)、扩张状态观测器(ESO)和非线性状态误差反馈控制律(NLSEF)。
通过内置的对比实验,本项目直观展示了ADRC相较于传统PID控制器在解耦、抗干扰(包括内部模型失配和外部负载突变)以及鲁棒性方面的显著优势。
功能特性
- 全流程算法实现:完整复现了非线性ADRC的控制回路,包括过渡过程安排、状态与扰动观测、非线性误差反馈。
- 双闭环对比验证:在同一仿真环境下同时运行ADRC与PID控制算法,支持实时性能对比。
- 复杂扰动模拟:内置多阶段扰动发生器,能够模拟突加负载(阶跃扰动)和加性正弦噪声(时变扰动)。
- 模型失配仿真:支持设定被控对象的实际参数与控制器预估参数不同,从而验证算法对内部参数摄动的鲁棒性。
- 可视化分析:自动生成多维度图表,包括跟踪性能、误差分析、扰动观测效果及内部状态估计详情。
系统要求
- MATLAB R2016b 及以上版本
- 无需额外工具箱(Control System Toolbox 可选,但本脚本主要基于基础数学运算实现)
核心算法与实现逻辑
本项目的主程序脚本通过欧拉法(Euler Method)对连续系统进行离散化仿真,仿真步长设定为0.001秒。以下是代码实现的详细逻辑分析:
1. 被控对象模型
系统针对一个典型的二阶物理系统(如伺服电机系统)进行建模。
- 数学模型:采用二阶微分方程
y_ddot = -a*y_dot + b*u + w。 - 参数设置:包含系统阻尼/摩擦系数
sys_a 和控制增益 sys_b。 - 离散化更新:在仿真循环中,根据当前的控制量和扰动,手动计算下一时刻的加速度、速度和位置。
2. ADRC 控制器实现
ADRC 算法在代码中分为四个严格的执行步骤:
* 利用
fhan 函数处理参考输入信号,输出平滑后的过渡信号
v1 和高质量的微分信号
v2。
* 主要作用是解决超调与快速性之间的矛盾,并在仿真中设定了速度因子
r_td 和滤波因子
h_td。
* 采用非线性观测结构,利用
fal 函数构建观测器。
* 状态定义:
z1 估计系统位置,
z2 估计系统速度,
z3 估计包含内部模型不确定性和外部干扰在内的“总扰动”。
* 代码中通过比较观测值与实际输出,利用三个增益参数
beta01、
beta02、
beta03 实时校正状态。
* 计算TD输出
v1, v2 与ESO估计值
z1, z2 之间的误差。
* 利用非线性函数
fal 对误差进行处理,计算初级控制量
u0。此环节包含比例和微分增益
beta1、
beta2。
* 核心补偿逻辑:
u = (u0 - z3) / b0,其中
b0 为控制器对系统的预估增益。
* 代码包含控制量限幅逻辑,模拟物理执行器的饱和特性(限制在 +/- 20 范围内)。
3. PID 控制器实现(对比组)
- 实现了标准的位置式PID算法。
- 包含积分分离和微分项计算,同样具备输出限幅功能。
- 用于提供基准性能数据,以便评估ADRC的改进效果。
4. 扰动生成机制
仿真脚本模拟了分段式的复杂工况:
- 0-3秒:无外部扰动,纯净阶跃响应。
- 3-7秒:突加恒定负载扰动(幅值为5.0),测试抗负载突变能力。
- 7秒后:在恒定负载基础上叠加正弦噪声(2.0*sin(10t)),测试对时变高频干扰的抑制能力。
结果可视化
代码运行结束后,会自动生成三组图形窗口,分别展示以下分析结果:
图表 1: ADRC vs PID 跟踪性能
- 上子图:展示参考信号(Ref)、PID输出和ADRC输出的重叠曲线。用户可以直观看到ADRC在快速性和超调抑制上的表现。
- 下子图:绘制两者的跟踪误差曲线,重点展示在扰动加入瞬间带来的误差峰值及恢复时间。
图表 2: ESO 扰动观测能力
- 上子图:对比“真实总扰动”与“ESO估计值 z3”。
* *注意*:代码中不仅计算了外部干扰,还实时计算了由模型参数差异(
sys_b vs
b0)引起的内部扰动,将其合成真实总扰动用于验证观测器的准确性。
- 下子图:展示PID与ADRC的控制量输入曲线,反映控制器在对抗干扰时的能量输出情况。
图表 3: TD 与 ESO 状态详情
- 上子图:对比TD安排的过渡位置
v1、ESO估计位置 z1 和系统实际位置 y,验证观测器的跟踪性能。 - 下子图:对比TD生成的微分信号
v2、ESO估计速度 z2 和系统实际速度 dy,评估微分信号提取的质量。
使用方法
- 将主程序脚本保存至MATLAB当前工作路径。
- 确保辅助函数(
fhan, fal 等ADRC基础算子)已在同一路径下定义或包含在脚本内(注:当前描述基于主逻辑,实际运行需确保子函数存在)。 - 直接运行主函数。
- 观察弹出的三个Figure窗口进行性能分析。
- 用户可通过修改代码顶部的“全局仿真参数设置”和“控制器参数”区域,来调试不同工况下的控制效果。