尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

用SimuPy BlockDiagram做闭环控制仿真:PID控制器手把手教程

用SimuPy BlockDiagram做闭环控制仿真:PID控制器手把手教程 用SimuPy BlockDiagram做闭环控制仿真PID控制器手把手教程【免费下载链接】simupyA framework for modeling and simulating dynamical systems项目地址: https://gitcode.com/gh_mirrors/si/simupySimuPy 是一个开源的 Python 动态系统仿真框架它的BlockDiagram模块让你像搭积木一样把被控对象、PID 控制器和参考信号连接成闭环几行代码即可完成完整的闭环控制仿真。本教程以 examples/pid.py 为例手把手带你从零搭建一个二阶系统的 PID 闭环控制仿真。上图正是 SimuPy 的核心工作图景输入信号经过求和点/-进入被控对象Simu 方块输出再反馈给控制器Py 方块形成经典的闭环控制结构。SimuPy 是什么为什么用它做闭环控制仿真SimuPy 面向模型与系统级的设计仿真工作流支持三种常见系统建模方式LTISystem用矩阵 (A, B, C, D) 直接定义线性时不变系统最适合控制器设计DynamicalSystem基于 SymPy 符号表达式自动生成本状态方程与 JacobianSwitchedSystem带零交叉事件检测的切换系统可仿真弹簧、开关等不连续现象它底层调用 SciPy 的 ODE 求解器默认dopri5支持稠密输出稳定性有保证。快速安装pip install simupy如果你需要仓库里的最新示例代码可以克隆源码git clone https://gitcode.com/gh_mirrors/si/simupy理解闭环BlockDiagram 的 3 个核心概念在写代码前先理解 simupy/block_diagram.py 中BlockDiagram类第 545 行的三个关键词概念作用一句话理解系统 System信号处理单元每个方块如被控对象、控制器、参考信号connect()连接信号流画框图里的箭头第 701 行simulate()求解初值问题按时间积分得到轨迹结果from simupy.systems import LTISystem from simupy.block_diagram import BlockDiagram BD BlockDiagram(sys, ctrl) BD.connect(sys, ctrl) # 状态反馈给控制器 BD.connect(ctrl, sys) # 控制量送回系统 res BD.simulate(10) # 仿真 10 秒就这么简单——建方块、连箭头、按仿真和手绘框图完全对应。PID 控制器教程搭建二阶系统的完整闭环我们仿真的对象是一个经典的二阶弹簧-阻尼系统examples/pid.py 分四步完成闭环。第 1 步构建带积分状态的对象模型被控对象是二阶系统为了消除稳态误差示例采用积分状态扩展的思路把误差积分作为第三个状态并入系统examples/pid.pym, d, b, k 1, 1, 1, 1 Ac np.c_[[0, -k/m], [1, -b/m]] Bc np.r_[0, d/m].reshape(-1, 1) # 增广状态加入积分项 A_aug np.hstack((np.zeros((3,1)), np.vstack((np.r_[1, 0], Ac)))) B_aug np.hstack((np.vstack((0, Bc)), -np.eye(3,1))) aug_sys LTISystem(A_aug, B_aug)第 2 步用 LTISystem 定义 PID 控制器PID 控制器本质上是一个常矩阵增益一行即可创建simupy/systems/__init__.py 中的LTISystem类Kc, tau_I, tau_D 1, 1, 1 K -np.r_[Kc/tau_I, Kc, Kc*tau_D].reshape((1,3)) pid LTISystem(K) # u -Kc/τi·∫e - Kc·e - Kc·τd·ė三个增益Kc比例、τ_I积分时间、τ_D微分时间就是教科书里的 PID 参数。第 3 步定义参考信号参考输入设定值是常值 1用SystemFromCallable把任意函数包装成无记忆系统第 188 行ref SystemFromCallable(lambda *args: np.ones(1), 0, 1)第 4 步3 行代码连线成环 ⚡把三个方块放入BlockDiagram用connect画出信号流examples/pid.pyBD BlockDiagram(aug_sys, pid, ref) BD.connect(aug_sys, pid) # 状态 → PID反馈 BD.connect(pid, aug_sys, inputs[0]) # PID 输出 → 控制输入 BD.connect(ref, aug_sys, inputs[1]) # 参考值 → 指令输入 res BD.simulate(10)当系统有多个输入/输出端口时outputs与inputs参数下标就是你在框图上选哪根线语义非常直观。读懂仿真结果SimulationResult 里的 t / x / y / esimulate()返回一个SimulationResult对象simupy/block_diagram.py四个数组属性对应框图中的全部信息属性含义第一轴第二轴t时间时间步—x各系统状态时间步信号分量按加入顺序y各系统输出时间步信号分量e事件值时间步事件分量在 PID 例子里res.y依次是积分状态、位置、速度、控制量u、参考指令。用 matplotlib 一把画出来即可验证闭环是否收敛import matplotlib.pyplot as plt plt.plot(res.t, res.y[:, 1], labelx) plt.plot(res.t, res.y[:, 4], labelx_c (ref)) plt.legend(); plt.show()进阶技巧与常见问题Q1如何调整求解器精度simulate()支持integrator_class与integrator_options参数默认dopri5 稠密输出只要符合scipy.integrate.ode接口的求解器都能换。对含不连续问题的仿真可参考 examples/bouncing_ball.py 中收紧rtol/atol的写法。Q2有开关、饱和等非线性的对象怎么办用SwitchedSystemsimupy/systems/__init__.py它通过事件方程的零交叉自动检测切换点实现落球、继电器翻转这类硬不连续仿真饱和环节可参考 examples/simple_saturation.py。Q3控制器增益怎么来SimuPy 不内置设计工具通常用 LQR/LQG 等方法离线算出增益再用LTISystem装载——README 中的无限时域 LQR 例子就是这么做的。Q4符号建模更省事的写法用 SymPy 符号直接写状态方程SimuPy 会自动生成本状态方程、输出方程与 Jacobian详见 docs/api/symbolic_systems.rst 与 docs/api/block_diagram.rst。总结把闭环仿真变成三步步骤对应代码框图动作① 建方块LTISystem/SystemFromCallable画出对象、控制器、参考信号② 连箭头BD.connect(from, to, inputs...)把反馈回路连起来③ 按仿真BD.simulate(t_end)得到 t/x/y/e 轨迹掌握这三步你就能在 SimuPy 中复现几乎任何教科书里的框图。建议从 examples/ 目录的六个示例入手pid.py本教程、discrete_lti.py离散 LTI、riccati_system.pyRiccati 方程等配合 docs/index.rst 的官方文档很快就能上手自己的控制仿真项目 【免费下载链接】simupyA framework for modeling and simulating dynamical systems项目地址: https://gitcode.com/gh_mirrors/si/simupy创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表