ADRC自抗扰控制SIMULINK仿真模型搭建与参数整定避坑指南
简介这份资源面向控制算法学习者和自抗扰控制ADRC入门研究者提供一套可直接运行的SIMULINK仿真模型重点针对二阶惯性环节进行控制器设计与验证。包内包含1个m脚本、1个mdl模型文件和1份PDF参考文献压缩包约136KB共3个文件。其中m文件负责参数初始化与调优mdl模型搭建了完整的仿真回路并内置线性扩张状态观测器LESO对系统状态进行实时估计参数已预先整定完毕还额外加入噪声信号用于测试观测器的抗扰能力与鲁棒性。PDF文档可作为理论补充帮助理解从PID到自抗扰控制的演进思路。使用时需保证m文件与模型文件路径一致在MATLAB 2014a环境下即可打开运行。目前已有3163人学习下载适合希望快速上手ADRC仿真、观察LESO跟踪效果并在此基础上修改参数做对比实验的读者能省去从零搭建模型的时间直接聚焦算法调试与现象分析。1. ADRC的SIMULINK仿真模型为什么你搭的模型一跑就发散如果你在控制领域待过一阵大概率听过自抗扰控制ADRC这个名字。它最吸引人的地方在于不需要被控对象的精确数学模型把内外部扰动统一当成一个“总扰动”去估计并补偿掉。听起来很美好但很多人第一次在 SIMULINK 里搭 ADRC 仿真模型时会遇到一个非常反直觉的现象——参数明明按论文里的值设了一运行输出就发散或者跟踪曲线抖得像心电图。问题往往不在 ADRC 本身而在于仿真模型的搭建方式。ADRC 的核心是扩张状态观测器ESOESO 里有一个带宽参数 ωo这个参数和仿真步长之间有一个隐性的匹配关系。步长太大ESO 的离散化误差会直接让观测器失稳步长太小仿真时间又长得让人抓狂。再加上 TD跟踪微分器和 NLSEF非线性状态误差反馈的离散实现方式不同同一个控制结构在不同搭建方式下表现可能天差地别。这篇笔记面向的是准备在 SIMULINK 里搭一套可复现、可调参、能跑通的 ADRC 仿真模型的工程师。不管你是刚接触 ADRC 想快速验证还是已经搭过一版但效果不理想想排查问题下面从模块拆解、参数整定到避坑排查按实际搭建顺序讲清楚。2. 把 ADRC 拆成 SIMULINK 能落地的四个模块2.1 为什么不能直接照搬连续域公式ADRC 的原始文献大多在连续域给出公式比如经典的非线性 ADRCTD: v1 v2 v2 -r * fal(v1 - v, 0.5, h) ESO: e z1 - y z1 z2 - beta1 * e z2 z3 - beta2 * fal(e, 0.5, h) b0 * u z3 -beta3 * fal(e, 0.25, h) NLSEF: u0 beta1_nl * fal(e1, a1, delta) beta2_nl * fal(e2, a2, delta) u u0 - z3 / b0如果你直接把v1 v2这样的微分方程用 Integrator 模块搭出来在连续求解器下确实能跑。但一旦换成离散求解器或者你想把控制器部署到实际数字控制器上就必须做离散化。离散化方式选不对fal 函数在零点附近的非线性特性会被破坏ESO 的收敛性直接崩掉。常见做法是TD 和 ESO 都用前向欧拉离散NLSEF 保持代数运算不变。前向欧拉虽然精度一般但胜在实现简单、和实际代码的对应关系清晰。如果你追求更高精度可以用双线性变换但 fal 函数里的幂次项在双线性变换下会引入额外的计算量仿真阶段不一定划算。2.2 四个核心模块的 SIMULINK 搭建步骤下面按信号流向从 TD 到被控对象逐个说明搭建方式。假设被控对象是一个二阶系统比如y -a*y - b*y c*u d(t)其中 d(t) 是外部扰动。TD 模块跟踪微分器TD 的作用是安排过渡过程给出跟踪信号 v1 及其微分 v2。在 SIMULINK 里用一个 MATLAB Function 模块实现最方便function [v1, v2] TD(v, v1_prev, v2_prev, r, h) % v: 参考输入 % v1_prev, v2_prev: 上一时刻状态 % r: 跟踪速度因子 % h: 仿真步长 fh fal(v1_prev - v, 0.5, h); v1 v1_prev h * v2_prev; v2 v2_prev h * (-r * fh); end function y fal(e, alpha, delta) if abs(e) delta y e / (delta^(1-alpha)); else y (abs(e)^alpha) * sign(e); end end这段代码里r决定 TD 的跟踪速度r越大跟踪越快但噪声放大越明显。h必须和 SIMULINK 的固定步长一致否则 TD 输出的微分信号会带一个系统性偏差。fal函数里的delta是线性区宽度一般取h的 5 到 10 倍太小会导致零点附近抖振太大则退化成线性环节。ESO 模块扩张状态观测器ESO 是 ADRC 的心脏负责估计状态和总扰动。同样用 MATLAB Function 实现function [z1, z2, z3] ESO(y, u, z1_prev, z2_prev, z3_prev, beta1, beta2, beta3, b0, h) % y: 系统输出 % u: 控制量 % beta1, beta2, beta3: 观测器增益 % b0: 控制增益估计值 e z1_prev - y; z1 z1_prev h * (z2_prev - beta1 * e); z2 z2_prev h * (z3_prev - beta2 * fal(e, 0.5, h) b0 * u); z3 z3_prev h * (-beta3 * fal(e, 0.25, h)); end三个增益的整定有明确的带宽配置法把 ESO 的极点配置在-ωo处则beta1 3*ωobeta2 3*ωo^2beta3 ωo^3。这是线性 ESO 的配置方式非线性 fal 函数下这个关系近似成立。ωo一般取控制器带宽ωc的 3 到 5 倍但要注意ωo * h不能太大经验上ωo * h 0.1比较安全。NLSEF 模块非线性状态误差反馈NLSEF 根据 TD 给出的 v1、v2 和 ESO 给出的 z1、z2 计算控制量function u0 NLSEF(v1, v2, z1, z2, kp, kd, alpha1, alpha2, delta) e1 v1 - z1; e2 v2 - z2; u0 kp * fal(e1, alpha1, delta) kd * fal(e2, alpha2, delta); endkp和kd按kp ωc^2、kd 2*ωc配置ωc是期望的闭环带宽。alpha1常取 0.75alpha2常取 1.25这是经验值实际可以根据跟踪误差的收敛速度微调。扰动补偿与对象最终控制量u u0 - z3 / b0。这里b0的取值很关键它不需要精确等于对象的真实控制增益但偏差太大会导致 ESO 的 z3 估计范围超出线性区补偿效果变差。一般取真实增益的 0.5 到 2 倍之间都能接受。被控对象用 Transfer Fcn 或 State-Space 模块搭建扰动可以用 Band-Limited White Noise 或正弦叠加。2.3 离散求解器与步长的匹配关系SIMULINK 里必须选固定步长离散求解器不要用变步长。变步长求解器会在 fal 函数的非线性区反复试探导致仿真速度极慢甚至卡死。步长h的选择有一个经验公式h 1 / (10 * ωo)。比如ωo 100 rad/s则h 0.001 s。如果ωo 500h要小于 0.0002 s。这个约束来自 ESO 离散化后的稳定性条件超过这个界限z3 会振荡发散。仿真总时长一般取闭环响应时间的 5 到 10 倍。比如期望调节时间 1 秒仿真 5 到 10 秒足够看到稳态。3. 参数整定从 ωc 和 ωo 出发的三步法3.1 先定控制器带宽 ωc再定观测器带宽 ωoADRC 的参数整定可以归结为两个带宽的配置。ωc决定闭环响应速度ωo决定扰动估计速度。一般ωo 3*ωc到5*ωc。如果对象有较大延迟ωc要适当降低否则 NLSEF 的输出会剧烈振荡。具体操作先设ωc 10 rad/sωo 50 rad/sb0取对象真实增益的 1 倍。跑一次仿真看阶跃响应的上升时间和超调。如果上升太慢增大ωc如果超调太大减小ωc或增大ωo。3.2 b0 的粗调与精调b0的粗调方法是给对象一个已知的阶跃输入测量稳态输出变化量b0 ≈ Δy / Δu。如果对象有积分环节b0取积分增益。精调时观察 ESO 的 z3 输出。如果 z3 在稳态时明显偏离零说明b0和真实增益不匹配。b0偏大z3 会偏负b0偏小z3 会偏正。调整b0使 z3 在稳态时接近零。3.3 用表格对比不同参数下的响应下面这张表是某二阶对象在相同 TD 和 NLSEF 参数下只改ωo和h的响应对比。对象为G(s) 1 / (s^2 2s 1)ωc 20b0 1。组别ωo (rad/s)步长 h (s)上升时间 (s)超调量稳态误差是否发散A600.0010.184.2%0.001否B1000.0010.158.7%0.001否C1000.005———是D2000.00050.1215.3%0.002否E2000.002———是从表里能看出两个规律第一ωo增大能加快扰动估计但超调也会增大第二ωo和h必须匹配C 组和 E 组都是因为ωo * h超过了 0.1 而发散。A 组和 B 组的ωo * h分别是 0.06 和 0.1都在安全边界内。提示如果你不确定ωo * h是否安全先设ωo 50h 0.001跑通后再逐步增大ωo每次增大后观察 z3 是否振荡。4. 避坑排查ADRC 仿真模型最常见的五个翻车点4.1 现象一运行就报代数环错误原因ESO 的 MATLAB Function 里用了当前时刻的u计算z2而u又依赖z3形成代数环。解决在 ESO 输出到 NLSEF 的路径上加一个 Unit Delay 模块或者把 ESO 里的u换成上一时刻的u_prev。前者更通用后者需要多存一个状态变量。我一般用 Unit Delay步长就是h对控制性能影响可以忽略。4.2 现象跟踪曲线在稳态时高频抖振原因fal 函数的delta设得太小ESO 在零点附近频繁切换线性区和非线性区。解决把delta增大到5*h到10*h。如果抖振还在检查 TD 的r是否过大r过大会让 v2 信号噪声放大进而通过 NLSEF 传到控制量上。4.3 现象z3 估计的扰动和实际扰动方向相反原因b0的符号搞反了。ADRC 的补偿量是-z3/b0如果b0符号错了补偿方向就反了。解决确认对象的控制增益符号。如果对象是y ... b*ub为正则b0取正。如果对象是y ... - b*ub0取负。不确定的话先给一个正的小阶跃看输出是增大还是减小。4.4 现象仿真跑得很慢步长已经很小了原因用了变步长求解器或者 MATLAB Function 里用了persistent变量导致每次调用都重新初始化。解决求解器换成 Fixed-step Discrete步长按1/(10*ωo)设。MATLAB Function 里不要用persistent状态用输入输出端口传递。如果还是慢把 fal 函数里的abs(e)^alpha换成查表法仿真阶段没必要用精确幂运算。4.5 现象换一组参数后 ESO 的 z1 跟踪不上 y原因ωo太小ESO 的带宽低于对象输出 y 的变化频率。解决增大ωo同时按比例减小h保持ωo * h 0.1。如果对象输出本身有高频噪声先加一个低通滤波器再送入 ESO否则 ESO 会把噪声当成扰动去补偿导致控制量抖振。5. 进阶技巧用 MATLAB 脚本批量扫参和自动验证5.1 把 SIMULINK 模型参数化手动改参数、点运行、看波形效率太低。我一般会把所有可调参数写到 MATLAB 脚本里用set_param批量赋值再用sim命令跑仿真最后用To Workspace模块把数据导出来做自动分析。% 批量扫参脚本 wc_list [10, 20, 30]; wo_ratio [3, 4, 5]; h 0.001; results []; for wc wc_list for ratio wo_ratio wo wc * ratio; if wo * h 0.1 continue; % 跳过不安全组合 end % 设置 SIMULINK 模型参数 set_param(adrc_model/ESO, beta1, num2str(3*wo)); set_param(adrc_model/ESO, beta2, num2str(3*wo^2)); set_param(adrc_model/ESO, beta3, num2str(wo^3)); set_param(adrc_model/NLSEF, kp, num2str(wc^2)); set_param(adrc_model/NLSEF, kd, num2str(2*wc)); % 运行仿真 simOut sim(adrc_model, StopTime, 5); y simOut.yout{1}.Values.Data; % 计算性能指标 overshoot (max(y) - 1) * 100; rise_time find(y 0.9, 1) * h; results [results; wc, wo, overshoot, rise_time]; end end % 找超调小于 10% 且上升时间最短的组合 idx results(:,3) 10; best results(idx, :); [~, min_idx] min(best(:,4)); disp([最佳参数: wc, num2str(best(min_idx,1)), ... , wo, num2str(best(min_idx,2))]);这段脚本的逻辑是遍历ωc和ωo/ωc的组合跳过ωo*h 0.1的不安全组合跑仿真后提取超调和上升时间最后筛选出超调小于 10% 且上升时间最短的参数。set_param里的路径adrc_model/ESO需要替换成你实际模型里的模块路径。5.2 用频域分析验证 ESO 的观测带宽时域扫参只能看最终响应如果想确认 ESO 本身是否工作正常可以做一个小信号频域测试给对象输出叠加一个已知频率的正弦扰动看 z3 能否跟踪上这个扰动。如果 z3 的幅值在某个频率后明显衰减说明 ESO 的观测带宽不够需要增大ωo。具体操作在扰动通道加一个 Sine Wave 模块频率从 1 rad/s 扫到ωo记录 z3 的幅值和相位。如果 z3 在ωo/3处幅值衰减到 70% 以下说明ωo偏小。5.3 一个容易被忽略的细节TD 的 h 和仿真步长必须一致TD 里的h参数如果和 SIMULINK 的固定步长不一致v2 信号会带一个比例误差。这个误差在低速跟踪时不明显但在快速跟踪时会让 NLSEF 的微分项补偿过量导致超调。我一般会在脚本里把h设成和set_param(adrc_model, FixedStep, 0.001)完全一样的值避免手动改参数时漏掉。5.4 从仿真到代码生成的注意事项如果你打算把 ADRC 从 SIMULINK 仿真推到实际控制器MATLAB Function 里的 fal 函数需要改成定点或单精度浮点实现。abs(e)^alpha在定点下会溢出常见做法是用查表加线性插值替代。另外ESO 的三个状态变量在代码里要显式声明为全局或静态变量不能像仿真里那样靠端口传递。我自己的习惯是仿真阶段用双精度浮点参数整定完成后把 fal 函数替换成定点查表版本再跑一次仿真对比。如果定点版本的性能下降超过 20%说明查表精度不够需要加密表格。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

51单片机动态数码管显示:原理、消隐与定时器扫描实现

51单片机动态数码管显示:原理、消隐与定时器扫描实现

如果你玩51单片机做过几个基础实验,点灯、按键、中断都跑通之后,多半会走到数码管这一步。网上很多教程会让你先点亮一位数码管,然后告诉你它还有个升级玩法叫“动态扫描显示”。老实说,我第一次看到动态显示的代码是有点懵的&…

2026/10/15 16:49:55 阅读更多 →
Vector CAN/CAN FD/LIN库:工业级协议栈胶水层解析

Vector CAN/CAN FD/LIN库:工业级协议栈胶水层解析

简介:本资源是面向汽车电子与工业自动化领域开发者的Vector官方通信协议集成开发包,聚焦CAN、CAN FD及LIN总线协议在C#、C和VB等主流语言中的工程化落地。资源提供完整的跨语言调用示例与底层驱动支持,解决嵌入式通信开发中协议适配难、API封…

2026/10/15 16:49:55 阅读更多 →
一网统飞定义、痛点、逻辑与落地试点

一网统飞定义、痛点、逻辑与落地试点

基层低空政务治理中长期存在一个典型痛点现象:城管、水利、公安、应急、自然资源等政务部门,各自独立采购无人机、机巢、地面站等硬件设备,各自搭建专属管理系统、各自组建运维队伍、各自开展飞行作业。各部门设备独立管控、飞行独立审批、数…

2026/10/15 16:48:54 阅读更多 →

最新新闻

COMSOL热传导仿真全流程:从方程设定到网格与边界排查

COMSOL热传导仿真全流程:从方程设定到网格与边界排查

简介:COMSOL是一款功能强大的多物理场仿真软件,在热传导领域应用十分广泛。这份docx文档以“一维固体中的热传导”为例,完整演示了如何通过COMSOL的PDE模块求解热传导方程。文档涵盖物理场添加、瞬态研究设置、几何与边界条件配置&#xff0c…

2026/10/15 17:33:53 阅读更多 →
pycharm中将光标快速定位到下一行

pycharm中将光标快速定位到下一行

如果只是想换行:按 Shift Enter,或者直接按 Enter(如果在行尾)。

2026/10/15 17:33:53 阅读更多 →
Notepad++ 7.3.2免安装版:便携配置、插件迁移与避坑实操

Notepad++ 7.3.2免安装版:便携配置、插件迁移与避坑实操

简介:Notepad 7.3.2官方免安装版是一款面向程序员及文本处理用户的轻量级源代码编辑器,无需安装即可解压使用,适合U盘便携或临时环境快速部署。它支持C、C、Java、Python、JavaScript、HTML、XML等多种语言,借助SciLexer.dll等核心…

2026/10/15 17:33:53 阅读更多 →
微信公众号原创认证与排版的系统化运营逻辑

微信公众号原创认证与排版的系统化运营逻辑

1. 这不是“开通原创”而是内容信用体系的准入门槛很多人点开这篇标题,第一反应是:“哦,又一个教你怎么点几下鼠标开通原创功能的教程”。但如果你真这么想,接下来的操作大概率会卡在第三步——因为微信公众号的“原创”从来就不是…

2026/10/15 17:33:53 阅读更多 →
酒店管理系统开题报告怎么写?从需求边界到技术选型全攻略

酒店管理系统开题报告怎么写?从需求边界到技术选型全攻略

1. 先把这个老题目做“窄”:需求边界决定开题报告生死 很多人一看到“酒店管理系统设计与开发”这个题目,第一反应就是“这题我会”:无非是做个房间管理、订房、入住退房、再配个会员模块。等真正把开题报告交上去,评委一句“你的…

2026/10/15 17:33:53 阅读更多 →
Seldon Core 2 实战:用 Pipeline 把 CIFAR10 图像分类器与异常检测、漂移监控打包为生产级推理服务

Seldon Core 2 实战:用 Pipeline 把 CIFAR10 图像分类器与异常检测、漂移监控打包为生产级推理服务

人工智能大模型MLOpsLLMOps模型推理服务云原生后端 【免费下载链接】seldon-core An MLOps framework to package, deploy, monitor and manage thousands of production machine learning models 项目地址: https://gitcode.com/gh_mirrors/se/seldon-core 点击查看…

2026/10/15 17:32:52 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 9:49:14 阅读更多 →