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()を呼び出したときに微分フィルタが再初期化されるようにします。