news 2026/4/23 11:26:22

【自动控制入门2B】从零搭建全连续控制系统:基于抗积分饱和PID的输入限制直线运动物体位置控制仿真程序

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【自动控制入门2B】从零搭建全连续控制系统:基于抗积分饱和PID的输入限制直线运动物体位置控制仿真程序

目录

  • 引言
  • 1 python 仿真程序
    • 1.1 实验数据导出效果
    • 1.2 实验记录导出效果
    • 1.3 完整程序
  • 2 matlab/simulink 仿真模型
    • 2.1 simulink 建模
    • 2.2 S-Function 函数文件
    • 2.3 参数文件
    • 2.4 绘图文件

引言

本文分享【自动控制入门2A】从零搭建全连续控制系统:基于抗积分饱和PID的输入限制直线运动物体位置控制文章里仿真使用的程序,包括从零搭建的python仿真程序和用于对比的matlab/simulink仿真模型,其中python程序仅用到常用数据处理库和绘图库,控制系统的核心逻辑均为从零实现。编程不难,贵在逻辑梳理。

1 python 仿真程序

程序主要包括被控对象类、控制器类、传感器类、参数设置、仿真循环、控制性能计算、仿真数据导出、仿真结果绘图等几个模块,均有详细注释。

程序中设有打开输入限幅、打开抗积分饱和、仿真结果绘图、实验记录导出和实验数据导出等开关,可以根据需要打开。实验记录导出和实验数据导出效果见1.1和1.2展示。

被控对象类的微分方程函数ode_plant(self,state0=[0,0,0,0])包含分别考虑空气阻力重力的四种情况,可以根据需要取消注释对应微分方程的代码,共可以观察四种系统的特性(包括线性系统非线性系统)。

1.1 实验数据导出效果

1.2 实验记录导出效果

1.3 完整程序

本文使用python=3.10环境,需要提前安装如下第三方库
pip install numpy、pandas、matplotlib、openpyxl
之后如下完整代码可直接运行

frommatplotlibimportpyplotaspltimportnumpyasnpimporttimeimportpandasaspdimportos# 2025.12.4# 针对考虑空气阻力的竖直方向运动质点的位置控制问题,设计了一种条件积分的PID控制器# 使用RK4方法进行全连续系统仿真classPlant:"""被控对象:考虑空气阻力的竖直方向运动质点模型"""def__init__(self,state0=[0,0],params=None,dt=0.001)->None:self.m=params['m']# 质量self.g=params['g']# 重力加速度self.k=params['k']# 空气阻力系数self.dt=dt# 时间步长# 初始状态self.h=state0[0]# 初始竖直方向位置self.v=state0[1]# 初始竖直方向速度# TODO: 调整传感器噪声水平self.sensor_h=Sensor(noise_level=params['noise_level'])# TODO: 调整 PID 参数 和 控制器kp=params['kp']ki=params['ki']kd=params['kd']amplitude_limit=params['amplitude_limit']# 控制输入限幅开关,False 表示不启用限幅rate_limit=params['rate_limit']# 控制输入变化率限幅开关,False 表self.controller_h2u=ControllerPID(kp=kp,ki=ki,kd=kd,amplitude_limit=amplitude_limit,rate_limit=rate_limit,dt=dt)defode_plant(self,state0=[0,0,0,0]):""" 常微分方程组 (ODE):质点的动力学模型(h, v)+ 控制器状态(i_e, e) F_net = F_control - F_gravity + F_air_resistance dv/dt = (u - m*g + f_air) / m """# 状态变量初值h,v=state0[0],state0[1]i_e,e=state0[2],state0[3]# 控制器微分方程组de=-v di_e,u=self.controller_h2u.control(e,i_e,de)# 空气阻力计算air_resist=-self.k*v*abs(v)# 质点运动微分方程组dh=v# 考虑重力和空气阻力dv=(u-self.m*self.g+air_resist)/self.m# 不考虑重力,只考虑空气阻力# dv = (u + air_resist) / self.m# 不考虑空气阻力,只考虑重力# dv = (u - self.g * self.m) / self.m# 重力和空气阻力都不考虑# dv = u / self.mdstate=np.array([dh,dv,di_e,de],dtype=float)returndstate.reshape((len(dstate),1))defupdate(self):"""使用 RK4 方法更新系统状态"""self.controller_h2u.e=self.controller_h2u.state_desired-self.sensor_h.measure(self.h)state=np.array([self.h,self.v,self.controller_h2u.i_e,self.controller_h2u.e],dtype=float)state=state.reshape((len(state),1))k1=self.ode_plant(list(state.flatten()))state1=state+k1*self.dt/2k2=self.ode_plant(list(state1.flatten()))state2=state+k2*self.dt/2k3=self.ode_plant(list(state2.flatten()))state3=state+k3*self.dt k4=self.ode_plant(list(state3.flatten()))d_state=(k1+2*k2+2*k3+k4)/6state+=d_state*self.dt# state 和 d_state 是 (4,1) 的 numpy 数组,直接取标量 floatself.h=float(state[0,0])self.v=float(state[1,0])self.controller_h2u.i_e=float(state[2,0])self.controller_h2u.e=float(state[3,0])returnstateclassControllerPID:"""PID 控制器,采用条件积分法实现抗积分饱和 (Anti-Windup)"""def__init__(self,kp=6,ki=0,kd=0,amplitude_limit=False,rate_limit=False,dt=0.1)->None:self.kp=kp self.ki=ki self.kd=kd self.dt=dt self.state_desired=0self.i_e=0self.e=0self.amplitude_limit=amplitude_limit self.rate_limit=rate_limit self.u_raw=0self.u=0defamplitude_restriction(self,u):"""控制信号幅值限制"""upper_bound=self.amplitude_limit lower_bound=-self.amplitude_limit flag_restrict=
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 7:51:10

Venera漫画阅读器:重新定义跨平台阅读体验

Venera漫画阅读器:重新定义跨平台阅读体验 【免费下载链接】venera A comic app 项目地址: https://gitcode.com/gh_mirrors/ve/venera 还在为不同设备间的漫画阅读体验割裂而烦恼?手机上看了一半的漫画,在电脑上找不到进度&#xff1…

作者头像 李华
网站建设 2026/4/22 12:23:26

快速搭建个人专属音乐空间:any-listen私有化部署终极指南

快速搭建个人专属音乐空间:any-listen私有化部署终极指南 【免费下载链接】any-listen A cross-platform private song playback service. 项目地址: https://gitcode.com/gh_mirrors/an/any-listen 厌倦了商业音乐平台的广告轰炸和功能限制?想要…

作者头像 李华
网站建设 2026/4/23 7:52:12

Wan2.2-Animate-14B终极指南:零基础打造电影级角色动画

Wan2.2-Animate-14B终极指南:零基础打造电影级角色动画 【免费下载链接】Wan2.2-Animate-14B 项目地址: https://ai.gitcode.com/hf_mirrors/Wan-AI/Wan2.2-Animate-14B 还在为制作专业动画而头疼吗?🤔 现在,你只需要一张…

作者头像 李华
网站建设 2026/4/23 7:49:53

20、Python编程基础与网络通信应用

Python编程基础与网络通信应用 1. Python基础特性 Python与其他一些编程语言不同,在给变量赋值前无需声明变量。同时,Python支持添加注释,注释是代码的一部分,用于解释代码的功能。Python会忽略注释内容。 单行注释 :使用 # 符号开始,例如: python # 这是一个单…

作者头像 李华
网站建设 2026/4/23 9:16:31

电视盒子系统改造:Armbian系统完整部署指南

挑战记录:从废弃盒子到功能服务器的蜕变之旅 【免费下载链接】amlogic-s9xxx-armbian amlogic-s9xxx-armbian: 该项目提供了为Amlogic、Rockchip和Allwinner盒子构建的Armbian系统镜像,支持多种设备,允许用户将安卓TV系统更换为功能强大的Arm…

作者头像 李华
网站建设 2026/4/23 9:18:44

Wan2.2-T2V-A14B在跨境电商产品视频批量生成中的ROI分析

Wan2.2-T2V-A14B在跨境电商产品视频批量生成中的ROI分析技术背景与行业挑战 在全球电商渗透率持续攀升的今天,内容已成为决定转化效率的核心变量。尤其是跨境电商平台,面对多语言、多市场、高SKU密度的运营现实,传统依赖人工拍摄剪辑的产品视…

作者头像 李华