pid --- 比例・積分・微分(PID)コントローラ

pid モジュールは、微分項のローパスフィルタリングと積分器のワインドアップクランプを備えた、シンプルな比例・積分・微分(PID)コントローラクラスを提供します。

例:

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() を介してリセットされ、そのステップの時間差はゼロとして扱われます。

PID出力を float として返します。

reset_I() None

積分器の状態をリセットします。累積された積分項をゼロにクリアし、キャッシュされた微分値をクリア(NaN に設定)して、次回 PID.get_pid() を呼び出したときに微分フィルタが再初期化されるようにします。