pid --- 比例-积分-微分控制器

pid 模块提供了一个简单的比例-积分-微分(PID)控制器类,支持微分项低通滤波和积分项饱和(windup)限幅。

示例:

from pid import PID

pid1 = PID(p=0.07, i=0, imax=90)
while True:
    error = 50  # error should be calculated as: target - measure
    output = pid1.get_pid(error, 1)
    # control value with output

class PID

class pid.PID(p: float = 0, i: float = 0, d: float = 0, imax: float = 0)

构造一个 PID 控制器。

  • p 是比例增益(Kp)。

  • i 是积分增益(Ki)。

  • d 是微分增益(Kd)。

  • imax 是积分项被限幅到的绝对最大值(抗饱和限制)。积分输出被限制在 [-abs(imax), +abs(imax)] 范围内。

微分项由一个截止频率为 20 Hz 的固定一阶低通滤波器进行滤波。

get_pid(error: float, scaler: float) float

针对给定的 error 计算并返回 PID 控制器的输出。

  • error 是当前误差(通常为 target - measurement)。

  • scaler 是应用于比例项 + 微分项之和以及积分增量的乘性比例因子。

连续两次调用之间的时间差是在内部使用 time.ticks_ms() 测量的。如果两次调用之间间隔超过 1000 ms(或者是第一次调用),则通过 PID.reset_I() 重置积分器,并将该步的时间差视为零。

float 形式返回 PID 输出。

reset_I() None

重置积分器状态。将累积的积分项清零,并清除缓存的微分值(设为 NaN),以便下次调用 PID.get_pid() 时重新初始化微分滤波器。