当前位置: 首页 > article >正文

ADRC实战:用Python从零搭建一阶系统自抗扰控制器(附完整代码)

ADRC实战用Python从零搭建一阶系统自抗扰控制器附完整代码控制工程领域一直在追求更鲁棒、更智能的算法来应对复杂系统中的不确定性。自抗扰控制Active Disturbance Rejection Control, ADRC作为一种不依赖精确模型的控制方法近年来在工业界获得广泛应用。本文将带您用Python从零实现一个完整的一阶系统ADRC控制器通过代码级解析揭示其核心原理。1. ADRC核心思想与架构设计自抗扰控制由韩京清研究员在1998年正式提出其核心思想是通过扩张状态观测器(ESO)实时估计并补偿系统内外扰动。与PID控制相比ADRC具有三大优势扰动估计与补偿ESO将系统模型不确定性、外部扰动等统一视为总扰动进行实时估计过渡过程安排通过跟踪微分器(TD)实现设定值的平滑过渡非线性组合采用非线性函数组合误差信号改善动态性能一阶系统ADRC的标准结构包含跟踪微分器(TD)处理阶跃指令扩张状态观测器(ESO)估计系统状态和总扰动非线性误差反馈(NLSEF)生成控制量class ADRC1stOrder: def __init__(self): # 控制器参数初始化 self.r 10 # TD速度因子 self.h 0.01 # 采样周期 self.beta01 100 # ESO参数 self.beta02 300 self.b0 1.0 # 系统系数 self.alpha 0.5 # 非线性因子 self.delta 0.1 # 线性区间宽度2. 关键模块实现与参数整定2.1 跟踪微分器(TD)实现TD的核心作用是安排过渡过程避免设定值突变引起的超调。我们采用最速跟踪算法def td(self, v): 跟踪微分器实现 :param v: 目标值 :return: (v1, v2) 过渡信号及其微分 e self.v1 - v fe self.fal(e, 0.5, self.h) self.v1 self.h * self.v2 self.v2 self.h * self.r * fe return self.v1, self.v2 def fal(self, x, alpha, delta): 非线性函数小误差大增益大误差小增益 if abs(x) delta: return x / (delta**(1-alpha)) else: return abs(x)**alpha * np.sign(x)参数整定要点r决定跟踪速度通常取5-50h为采样周期需与实际控制周期一致delta影响线性区间一般取h的5-10倍2.2 扩张状态观测器(ESO)实现ESO是ADRC的核心通过将扰动扩张为额外状态进行观测def eso(self, y, u): 扩张状态观测器 :param y: 系统输出 :param u: 控制输入 :return: (z1, z2) 状态估计和扰动估计 e self.z1 - y fe self.fal(e, 0.5, self.h) self.z1 self.h * (self.z2 self.b0*u self.beta01*e) self.z2 self.h * (self.beta02*fe) # 幅值限制 self.z1 np.clip(self.z1, -1e5, 1e5) self.z2 np.clip(self.z2, -1e5, 1e5) return self.z1, self.z2参数整定经验| 参数 | 作用 | 典型取值规律 | |----------|--------------------|-------------------| | beta01 | 状态跟踪带宽 | 50-200 | | beta02 | 扰动观测带宽 | 100-500 | | b0 | 系统增益估计 | 实际系统增益的0.8-1.2倍 |2.3 非线性误差反馈设计采用非线性组合取代PID的线性加权提升控制性能def nlf(self, e1, e2): 非线性误差反馈 :param e1: 误差 :param e2: 误差微分 :return: 控制量 fe1 self.fal(e1, self.alpha, self.delta) fe2 self.fal(e2, self.alpha0.5, self.delta) return 10*fe1 0.1*fe2 # 权重系数需根据系统调整3. 完整控制系统实现将各模块集成构建闭环控制系统def control_loop(self, target_func, plant, T30): 完整控制循环 N int(T/self.h) logger {t: [], y: [], v: [], u: [], z2: []} for i in range(N): t i * self.h v target_func(t) # 目标信号 # 各模块执行 v1, v2 self.td(v) y plant.observe() # 获取系统输出 z1, z2 self.eso(y, self.u) e1 v1 - z1 u0 self.nlf(e1, v2-z1) self.u (u0 - z2)/self.b0 # 扰动补偿 plant.update(self.u) # 施加控制量 # 数据记录 logger[t].append(t) logger[y].append(y) logger[v].append(v) logger[u].append(self.u) logger[z2].append(z2) return logger4. 仿真对比与性能分析4.1 测试环境搭建构建含复杂扰动的一阶测试系统class FirstOrderSystem: def __init__(self): self.x 0 self.h 0.01 def f(self, x, t): 总扰动未知 return x**2 0.5*np.sign(np.sin(2*t)) np.cos(x*t) def update(self, u): 系统状态更新 w self.f(self.x, self.t) self.x self.h * (w u) self.t self.h def observe(self): 系统输出 return self.x 0.01*np.random.randn() # 加入测量噪声4.2 ADRC与PID性能对比通过阶跃响应测试对比控制效果def compare_adrc_pid(): # 初始化控制器 adrc ADRC1stOrder() pid PID(Kp1.2, Ki0.5, Kd0.1) # 运行仿真 plant_adrc FirstOrderSystem() plant_pid FirstOrderSystem() logger_adrc adrc.control_loop(target_step, plant_adrc) logger_pid pid.control_loop(target_step, plant_pid) # 绘制对比曲线 plt.figure(figsize(12,6)) plt.plot(logger_adrc[t], logger_adrc[y], labelADRC) plt.plot(logger_pid[t], logger_pid[y], labelPID) plt.plot(logger_adrc[t], logger_adrc[v], k--, labelTarget) plt.legend() plt.xlabel(Time(s)) plt.ylabel(Output) plt.title(ADRC vs PID Performance Comparison) plt.show()典型对比结果特征调节时间ADRC比PID快约30%超调量ADRC接近零超调PID约15%抗扰动ADRC在扰动下保持更好跟踪性能4.3 参数调试技巧通过系统辨识初步确定参数范围def parameter_tuning_guide(): 参数调试指南 print( 1. 先调TD参数 - 保持h实际采样周期 - 增大r直到过渡过程速度满足需求 2. 再调ESO参数 - beta01 ≈ 带宽的平方 - beta02 ≈ 带宽的立方 - 实际带宽从5-50Hz开始尝试 3. 最后调NLSEF - 先设alpha0.5, delta0.1 - 调整权重使控制量不过大 )5. 工程应用建议在实际工程中应用ADRC时需要注意采样周期选择一般取系统响应时间的1/10~1/20需考虑控制器计算能力扰动补偿限制# 在控制量计算后加入限幅 u np.clip(u, -umax, umax)参数自适应策略# 根据工作点自动调整参数 if abs(y) threshold: self.beta01 * 1.2 # 增大观测带宽与现有系统集成可先替换PID的D项为ADRC逐步替换整个控制回路完整代码已托管在GitHub仓库包含详细注释和测试案例。实际应用中建议先进行系统辨识确定大致参数范围再通过本文介绍的方法精细调节。对于更高阶系统可采用相似思路扩展ESO的阶数。

相关文章:

ADRC实战:用Python从零搭建一阶系统自抗扰控制器(附完整代码)

ADRC实战:用Python从零搭建一阶系统自抗扰控制器(附完整代码) 控制工程领域一直在追求更鲁棒、更智能的算法来应对复杂系统中的不确定性。自抗扰控制(Active Disturbance Rejection Control, ADRC)作为一种不依赖精确模…...

LibreELEC新手必看:用PVR IPTV Simple Client搞定电视直播(附免费m3u8源)

LibreELEC电视直播实战指南:从零搭建稳定流畅的IPTV系统 第一次在树莓派上打开央视高清频道时,那种用开源软件替代广电机顶盒的成就感至今难忘。LibreELEC作为专为Kodi优化的轻量级系统,配合PVR IPTV Simple Client插件,确实能打造…...

避坑指南:Unity触发器(Trigger)的5个典型误用场景与正确解决方案

Unity触发器(Trigger)实战避坑指南:5个高频误用场景与优化方案 在Unity物理交互开发中,触发器(Trigger)就像一把双刃剑——用得巧妙可以创造丝滑的游戏体验,用错地方则会导致诡异的bug和性能灾难。本文将揭示那些连资深开发者都可能踩中的陷阱…...

MedGemma医疗助手实战:从部署到问诊,小白也能用的AI医生

MedGemma医疗助手实战:从部署到问诊,小白也能用的AI医生 1. 引言:您的私人医疗AI助手 当深夜突然出现不明症状,或是阅读病历遇到难懂的医学术语时,您是否希望有个随时待命的专业医疗顾问?MedGemma医疗助手…...

douyin-downloader:突破平台限制的视频高效获取解决方案

douyin-downloader:突破平台限制的视频高效获取解决方案 【免费下载链接】douyin-downloader 项目地址: https://gitcode.com/GitHub_Trending/do/douyin-downloader 在数字内容快速迭代的时代,视频资源的高效获取面临平台访问限制、动态签名验证…...

VibeVoice模型推理加速:TensorRT优化实战

VibeVoice模型推理加速:TensorRT优化实战 1. 为什么VibeVoice需要TensorRT加速 VibeVoice作为微软推出的前沿语音合成模型,能生成长达90分钟的多角色自然对话,但它的计算复杂度也相当可观。我在实际部署时发现,直接用PyTorch运行…...

Meta-Llama-3-8B-Instruct零基础部署:5分钟用vLLM+Open WebUI搭建对话机器人

Meta-Llama-3-8B-Instruct零基础部署:5分钟用vLLMOpen WebUI搭建对话机器人 1. 准备工作:了解你的工具 Meta-Llama-3-8B-Instruct是Meta公司最新开源的80亿参数对话模型,相比前代产品,它在指令遵循、多轮对话和代码理解方面都有…...

MySQL连接查询实战:从头歌平台案例学多表联合查询技巧

MySQL连接查询实战:从头歌平台案例学多表联合查询技巧 在数据库应用开发中,多表联合查询是每个开发者必须掌握的核心技能。想象一下,当你需要从学生表中获取姓名,同时从成绩表中查询对应分数,再关联课程表获取课程名称…...

ComfyUI低显存模式避坑指南:如何正确使用--disable-cuda-malloc和--normalvram参数

ComfyUI低显存GPU优化实战:参数调优与性能平衡指南 当你在4GB显存的显卡上运行ComfyUI时,是否经常遇到RuntimeError: CUDA error: operation not supported的报错?这可能是显存管理策略与你的硬件不兼容导致的。本文将带你深入理解ComfyUI的显…...

3步解锁图像数据:让科研图表开口说话

3步解锁图像数据:让科研图表开口说话 【免费下载链接】WebPlotDigitizer Computer vision assisted tool to extract numerical data from plot images. 项目地址: https://gitcode.com/gh_mirrors/web/WebPlotDigitizer 在科研分析、工程计算和商业决策中&a…...

AI辅助开发:借助快马平台为你的网盘注入智能文件摘要与语义搜索能力

最近在捣鼓一个网盘项目,想着怎么让它更“聪明”一点。传统的网盘就是个文件仓库,找东西全靠文件名,有时候文件多了,或者名字起得随意,找起来真是费劲。正好看到大家都在玩AI,我就琢磨着,能不能…...

Qwen3-14b_int4_awq惊艳效果:输入‘画一个架构图:用户登录流程’生成PlantUML代码

Qwen3-14b_int4_awq惊艳效果:输入"画一个架构图:用户登录流程"生成PlantUML代码 1. 模型简介 Qwen3-14b_int4_awq是基于Qwen3-14b模型的int4量化版本,采用AngelSlim技术进行压缩优化,专门用于高效文本生成任务。这个量…...

Qwen3-14b_int4_awqvLLM部署详解:engine_args配置、tokenizer路径指定与量化权重加载

Qwen3-14b_int4_awq LLM部署详解:engine_args配置、tokenizer路径指定与量化权重加载 1. 模型简介 Qwen3-14b_int4_awq是基于Qwen3-14b模型的int4量化版本,采用AngelSlim技术进行压缩优化,专门用于高效文本生成任务。这个量化版本在保持模型…...

Matlab中如何灵活定制坐标轴标签:深入解析set(gca,xtick)与set(gca,xticklabel)

1. 为什么需要定制坐标轴标签? 在数据可视化过程中,默认的坐标轴标签往往不能满足我们的需求。比如绘制一个正弦函数时,Matlab会自动生成均匀分布的刻度值,但这些数值可能并不直观。想象一下,如果你要给非技术背景的同…...

SpringBoot+Vue3无人机AI巡检:从实时流处理到智能预警的闭环实践

1. 项目背景与技术选型 最近几年无人机巡检在安防、电力、农业等领域快速普及,但很多团队在落地时都会遇到视频延迟高、AI识别不准、预警响应慢等问题。去年我们团队用SpringBootVue3完整实现了一套无人机AI巡检系统,实测在2km范围内能做到500ms以内的端…...

3步激活旧Mac潜能:OpenCore Legacy Patcher让不支持的设备重获新生

3步激活旧Mac潜能:OpenCore Legacy Patcher让不支持的设备重获新生 【免费下载链接】OpenCore-Legacy-Patcher 体验与之前一样的macOS 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher OpenCore Legacy Patcher(OCLP&…...

如何用动态深度学习提升锂电池故障检测准确率?清华团队最新研究实践

动态深度学习在锂电池故障检测中的突破性实践 电动汽车的普及让锂电池安全问题日益凸显。传统检测方法在面对复杂工况时,往往表现出高误报率或漏检率,而清华大学团队的最新研究为这一难题提供了创新解决方案——通过动态深度学习技术,实现了锂…...

Aria2配置避坑指南:从自启动到浏览器插件联调(附完整.conf文件)

Aria2配置避坑指南:从自启动到浏览器插件联调(附完整.conf文件) 在Windows环境下配置Aria2自启动并实现浏览器插件联调,看似简单却暗藏诸多细节陷阱。许多用户在完成基础配置后,常遇到服务静默崩溃、RPC连接失败或下载…...

手把手教你修复libgit2报错:从corrupted loose reference到完整恢复Git仓库

手把手教你修复libgit2报错:从corrupted loose reference到完整恢复Git仓库 当你正在专注地开发项目,突然遇到corrupted loose reference file: refs/heads/master这样的Git错误时,那种感觉就像是在高速公路上突然爆胎。这个错误不仅会中断你…...

百度网盘下载加速:突破限速的高效解决方案

百度网盘下载加速:突破限速的高效解决方案 【免费下载链接】pan-baidu-download 百度网盘下载脚本 项目地址: https://gitcode.com/gh_mirrors/pa/pan-baidu-download 面对百度网盘动辄几十KB的下载速度,你是否也曾经历过等待大文件传输完成的煎熬…...

基于立创逻辑派与高云FPGA的100MHz双通道数字示波器DIY全解析

基于立创逻辑派与高云FPGA的100MHz双通道数字示波器DIY全解析 最近有不少朋友问我,想深入学习FPGA和嵌入式系统,有没有什么能动手又有挑战性的项目?今天我就来分享一个自己刚做完的“大玩具”——一个基于立创逻辑派开发板和高云FPGA的100MH…...

得物sign签名逆向避坑指南:常见MD5加密错误及解决方案

得物sign签名逆向避坑指南:常见MD5加密错误及解决方案 在逆向分析领域,sign签名机制一直是开发者关注的焦点。得物作为国内领先的潮流电商平台,其sign签名算法采用了经典的MD5加密方式,但在实际逆向过程中,开发者常常会…...

Phi-3-vision-128k-instruct保姆级部署教程:开源多模态模型GPU算力优化实操

Phi-3-vision-128k-instruct保姆级部署教程:开源多模态模型GPU算力优化实操 1. 模型简介 Phi-3-Vision-128K-Instruct是一个轻量级的开源多模态模型,属于Phi-3模型家族的最新成员。这个模型特别适合处理需要同时理解文本和图像的复杂任务,比…...

Phi-3-vision-128k-instruct代码实例:自定义Chainlit UI实现多图批量问答

Phi-3-vision-128k-instruct代码实例:自定义Chainlit UI实现多图批量问答 1. 模型简介 Phi-3-Vision-128K-Instruct是微软推出的轻量级多模态模型,属于Phi-3系列的最新成员。这个模型特别擅长处理图文结合的复杂任务,支持长达128K的上下文理…...

XTDrone--解决roslaunch px4 indoor1.launch依赖问题的实战指南

1. XTDrone环境搭建与依赖问题概述 第一次在XTDrone环境中运行roslaunch px4 indoor1.launch时,十有八九会遇到各种依赖报错。这就像组装一台新电脑,明明所有硬件都插好了,开机却总是提示缺少驱动。我刚开始接触XTDrone时,光是解决…...

SecGPT-14B企业级应用:与Jira/飞书打通,自动生成工单描述、复现步骤与修复方案

SecGPT-14B企业级应用:与Jira/飞书打通,自动生成工单描述、复现步骤与修复方案 1. 企业安全运维的痛点与解决方案 在当今企业IT环境中,安全团队每天需要处理大量安全工单,从漏洞报告到异常行为分析,再到修复方案制定…...

用Kubernetes搭建大数据分析平台:Spark on K8s完整配置指南(附Flink集成方案)

Kubernetes大数据平台实战:Spark与Flink的容器化部署与优化 大数据处理框架的容器化部署已经成为企业级数据平台的标准配置。本文将深入探讨如何在Kubernetes上构建高性能的Spark和Flink集群,从基础配置到高级优化,为大数据工程师提供一站式解…...

PX4固件源码结构解析:从零开始理解飞控代码的组织逻辑

PX4固件源码结构解析:从零开始理解飞控代码的组织逻辑 第一次打开PX4固件的代码仓库时,面对密密麻麻的文件夹和文件,很多开发者都会感到无从下手。这就像走进一个巨大的图书馆,如果没有明确的分类系统和导航标识,很容易…...

Qwen3-14b_int4_awq效果惊艳:中文古籍风格仿写、方言表达生成、网络新词融合能力展示

Qwen3-14b_int4_awq效果惊艳:中文古籍风格仿写、方言表达生成、网络新词融合能力展示 1. 模型简介 Qwen3-14b_int4_awq是基于Qwen3-14b模型的int4量化版本,采用AngelSlim技术进行压缩优化,专门用于文本生成任务。这个版本在保持高质量文本生…...

渗透率超50%!AI家电告别噱头,中国家电业的变革与隐忧

前言:AI不再是营销噱头,家电业真的变天了最近,AWE2026在上海开幕,一组数据彻底打破了我的固有认知:2025年中国人工智能家电渗透率已超过50%,彩电AI渗透率更是高达70%以上。这意味着,现在走进电器…...