Contents — find the section you need

Change parameters and verify

Open the panel, then press Run to load Python. You can stop execution and reset parameters. Results are computed on this device. No Python installation is required.

Local execution steps below are optional for reproducing the source results; they are not required for the browser experiment.

The experiment controls are in English.

Open experiment panel in a new tab

Download reproduction source

一个小型可执行模型使得PID增益变化和执行器饱和更容易检查。这些结果是使用Python 3.12.3于2026年9月7日计算得出的。它们是数值模拟结果,而非测量数据或已识别的电机模型。

模型和条件

被控对象为\ddot y+2\dot y+y=u。输出y和控制量u已归一化;时间单位为秒。初始输出、速度和积分均为零。目标值从零时刻开始为1,然后从6秒开始为0.4。步长为0.005秒,时间范围为0-12秒,每个工况下采集2401个样本。

控制器为u=K_pe+K_iI-K_d\dot y_m,并带有e=r-y_m。其中y_m是测量输出。微分作用于该测量输出,而非目标值。基准增益分别为 K_p=3、K_i=2 和 K_d=1。积分和微分显式地使用时间步长;被控对象使用半隐式欧拉积分。有关原理,请参阅 PID 基础。

运行代码

将 pid_lab.py 保存到空的工作目录中,然后运行以下命令。它仅需要 Python 标准库,并且会覆盖同名的结果文件。

python3 --version
python3 pid_lab.py

它会生成 CSV 和 摘要 JSON。要重新生成图形,请将 plot_pid.py 保存到同一目录并运行;绘图已使用 matplotlib 3.6.3 进行检查。CSV 文件的列分别为:场景、时间、目标值、输出值、控制值和积分值。

比较延迟和饱和

Diagram 1 · Use the button to switch views
模拟 PID 输出和控制,测量延迟为 0.4 秒,控制限值为 0.8,采用条件积分

上图显示输出值;下图显示控制值。黑线为目标值。场景标签与 CSV 文件一致,aw 表示抗积分饱和。

场景 变化 12 秒时的输出值 积分绝对误差
标称值 无延迟,控制限值为 ±3 0.4008 1.7913
delay_0.4s 测量延迟 0.4 秒 0.3883 1.8860
limit_0.8_aw 控制 ±0.8,条件积分 0.4003 3.3424
limit_0.8_no_aw 控制 ±0.8,无限制积分 0.6602 5.0996

积分绝对误差采用左矩形积分,积分时间范围为 0-12 秒。其单位为归一化输出乘以秒,而非以米为单位的物理位置误差。请检查振荡情况、控制量以及最终采样值。

抗饱和不会提高执行器能力

在平衡状态下,该系统具有 y=u,因此 0.8 的控制限值无法达到 1 的目标值。如果误差持续累积,即使目标值降至 0.4,积分仍可能需要过大的输入。代码会拒绝进一步导致饱和的积分操作,同时允许有助于脱离饱和状态的积分操作。

这会改变控制器的内部状态,而不是电机或电源容量。实现目标是否可行是另一个需要单独考虑的问题。

每次只改变一个增益

from pid_lab import simulate
for kp in (1., 3., 6.):
    rows = simulate("gain", kp=kp)
    print(kp, max(row[3] for row in rows if row[1] < 6))

比较初始目标区间内的峰值。然后分别只改变 ki,最后只改变 kd,并记录最大控制量。更大的增益并非总是更好;重复上述比较,并考虑延迟和饱和效应。

限制和后续检查

该模型忽略了测量噪声、摩擦、量化、通信抖动和微分滤波。将时间步长减半:如果响应发生显著变化,请先研究数值近似。在未识别被控对象并匹配单位和时间尺度之前,请勿将这些增益复制到硬件中。请继续阅读 MPC 以研究控制问题中的约束条件。

在本地运行相同的计算

解压完整的可运行源代码 ZIP,或将实验入口点、生成的内核和原始 PID 源文件保存在一个文件夹中。PID 使用 Python 标准库;卡尔曼滤波和 ICP 需要 NumPy。原始图形生成命令仍然可用。

python3 experiment.py pid --parameters '{"kp":3,"ki":2,"kd":1,"delay":0,"limit":3,"antiwindup":true}' > result.json

将延迟设置为 0.4 或将限制设置为 0.8,并比较启用和禁用抗饱和时的 IAE 和最终输出。

Code, data and reproduction

The ZIP contains the same computation code as the browser, synthetic data and comparison cases. These are not physical measurements.

Download reproduction package · Instructions (EN/JA) · Files and experiment conditions (JSON)

Extract the ZIP into a new directory, then run:

python3 reproduce.py --experiment pid

This Lab compares 4 cases. PID uses Python’s standard library; Kalman/ICP require NumPy. See the instructions for dependencies and tested versions.

Related reading

Study control with constraints控制工程入门:模型预测控制——在约束条件下运行Explore another aspect of this fieldMPC 实验室——在时域和转向限制内重新求解曲率序列Explore another aspect of this field路径跟踪比较实验室——在相同条件下运行 PP、APP、RPP、Stanley 和 MPC