PID制御の理論とチューニング手法

自動車のクルーズコントロールは、設定した速度を維持するために自動的にアクセルとブレーキを調整します。上り坂では速度が落ちるのでアクセルを踏み、下り坂では速度が上がるのでアクセルを緩めます。しかし、単に「現在の速度と目標値の差」だけを見てアクセルを調整すると、坂道が続くと速度のずれが残ったり、逆にアクセルの調整が急すぎて速度が揺れたりします。

この問題を解決するのがPID制御(Proportional-Integral-Derivative control)です。PID制御は「現在の偏差」「過去の偏差の蓄積」「偏差の変化速度」の3つの情報を組み合わせることで、高速かつ正確な制御を実現します。産業界で使われる制御器の90%以上がPID制御であると言われており、制御工学の中で最も実用的な技術の一つです。

PID制御の発想自体は直感的です。人間がお湯の温度を調節するときも、「今どれくらいずれているか」(比例)、「しばらくずれたままだから修正量を増やそう」(積分)、「急に温度が変わったから操作を緩めよう」(微分)という3つの判断を無意識に行っています。PID制御はこの人間的な判断を数式で表現したものです。

PID制御を理解すると、以下のような応用が開けます。

  • 温度制御: 工場の炉、エアコン、3Dプリンタのヒーテッドベッドなどの温度を正確に制御できる
  • モータ制御: ロボットアームや電動車両のモータ速度・位置を精密に制御できる
  • プロセス制御: 化学プラントの流量、圧力、液位などの制御に広く使われている
  • 航空宇宙: 航空機のオートパイロットや衛星の姿勢制御にPIDが基盤技術として使われている
  • ドローン制御: マルチコプターの姿勢安定化にPIDが標準的に使われている

本記事の内容

  • P・I・D各要素の役割と数学的定義
  • PID制御器の伝達関数と閉ループ特性への影響
  • ジーグラ・ニコルス法をはじめとするチューニング手法
  • Pythonでの実装と各手法の比較

前提知識

この記事を読む前に、以下の記事を読んでおくと理解が深まります。

PID制御とは — 3つの「知恵」の組み合わせ

日常のアナロジーで理解する

PID制御の3つの要素を、お風呂のお湯の温度調節で説明しましょう。

P(比例)制御: 「今のお湯が冷たいから、蛇口をもっと開ける」— 現在の偏差に比例した操作量を加えます。偏差が大きいほど大きく操作します。ただし、比例制御だけでは目標値にピッタリ到達できない「定常偏差」が残ることがあります。

I(積分)制御: 「ずっとちょっとだけ冷たいなら、じわじわ蛇口を開けていく」— 偏差の時間積分に比例した操作量を加えます。偏差が少しでも残っていれば、時間とともに操作量が蓄積され、最終的に偏差をゼロにします。ただし、積分の蓄積が行き過ぎるとオーバーシュートや振動の原因になります。

D(微分)制御: 「お湯が急に熱くなってきたから、早めに蛇口を絞る」— 偏差の変化速度に比例した操作量を加えます。偏差が急速に変化するとき(目標値に近づく速度が速いとき)にブレーキ的な役割を果たし、オーバーシュートを抑制します。未来の偏差を予測する「先読み」の効果があります。

PID制御器の数学的定義

PID制御器の出力 $u(t)$ は、偏差 $e(t) = r(t) – y(t)$($r$: 目標値、$y$: 出力)に対して次のように定義されます。

$$ \begin{equation} u(t) = K_p e(t) + K_i \int_0^t e(\tau) \, d\tau + K_d \frac{de(t)}{dt} \end{equation} $$

ここで

  • $K_p$: 比例ゲイン(Proportional gain)
  • $K_i$: 積分ゲイン(Integral gain)
  • $K_d$: 微分ゲイン(Derivative gain)

ラプラス変換を取ると、PID制御器の伝達関数は

$$ \begin{equation} C(s) = K_p + \frac{K_i}{s} + K_d s \end{equation} $$

これは標準形(parallel form)と呼ばれます。別の表記として、理想形(ideal / ISA form)があります。

$$ \begin{equation} C(s) = K_p \left(1 + \frac{1}{T_i s} + T_d s\right) \end{equation} $$

ここで $T_i = K_p/K_i$ は積分時間、$T_d = K_d/K_p$ は微分時間です。この表記では $K_p$ がコントローラ全体のゲインを調整し、$T_i$ と $T_d$ が積分と微分の効果の強さを独立に調整します。

$T_i$ の直感的な意味は「偏差が一定のとき、積分項の寄与がP項の寄与と等しくなるまでの時間」です。$T_i$ が小さいほど積分の効果が強く、大きいほど弱くなります。$T_d$ は「偏差が一定速度で変化しているとき、微分項の寄与がP項の寄与と等しくなるまでの時間」を表し、大きいほど微分の効果が強くなります。

2つの表記形式の使い分け

標準形と理想形のどちらを使うかは状況によります。標準形($K_p, K_i, K_d$)は各項が独立しているため、ソフトウェア実装ではこちらが使われることが多いです。一方、理想形($K_p, T_i, T_d$)は全体ゲインの調整が $K_p$ 一つで行えるため、チューニングの際に直感的で、ジーグラ・ニコルス法などのチューニング規則はこの形式で与えられるのが一般的です。

各要素が閉ループ特性にどう影響するか、詳しく見ていきましょう。

各要素の役割と特性

P制御(比例制御)

P制御のみの場合、$C(s) = K_p$ です。単位フィードバック系の閉ループ伝達関数は

$$ G_{\text{cl}}(s) = \frac{K_p G(s)}{1 + K_p G(s)} $$

P制御の定常偏差を確認するために、プラント $G(s) = 1/(s+a)$ の場合のステップ応答の定常値を計算します。最終値の定理から

$$ y(\infty) = \lim_{s \to 0} s \cdot \frac{1}{s} \cdot \frac{K_p/(s+a)}{1 + K_p/(s+a)} = \frac{K_p}{a + K_p} $$

目標値が1のとき、定常偏差は $e_{\text{ss}} = 1 – K_p/(a + K_p) = a/(a + K_p)$ です。$K_p$ を大きくすれば定常偏差は小さくなりますが、ゼロにはなりません。さらに、$K_p$ を大きくしすぎると安定性が悪化します。これがP制御の本質的な限界です。

P制御は最もシンプルな制御方式であり、まずP制御で動作を確認してから、I制御やD制御を追加するという手順がチューニングの基本です。

I制御(積分制御)

P制御では定常偏差が残るという問題がありました。では、どうすれば偏差を完全にゼロにできるでしょうか。答えは「偏差がある限り操作量を増やし続ける」ことです。これが積分制御の発想です。

積分器 $1/s$ を制御器に含めると、開ループ系の型次数が1つ上がります。1型以上のシステムはステップ入力に対して定常偏差がゼロになるため、I制御は定常偏差を解消する効果を持ちます。

数学的には、開ループ伝達関数に $1/s$ の因子が含まれると、$s = 0$ に極があることになります。最終値の定理を適用すると、ステップ入力に対して定常偏差がゼロになることが示せます。

しかし、積分器は位相を $-90^\circ$ 遅らせるため、安定性を悪化させる傾向があります。ボード線図で見ると、積分器は全ての周波数で位相を $-90°$ 下げるため、位相余裕が減少します。積分ゲインが大きすぎると、積分の蓄積が過大になり(ワインドアップ; integral windup)、大きなオーバーシュートや振動を引き起こします。

ワインドアップとは、出力が飽和している間も積分値が蓄積し続ける現象です。例えば、バルブが全開になっているのに偏差がゼロにならない場合、積分値は際限なく増え続けます。飽和が解除された後も過剰な積分値のために出力が大きくなりすぎ、反対方向に大きくオーバーシュートしてしまいます。実用的な実装ではアンチワインドアップ機構(積分値にリミッタを設けるなど)が必須です。

D制御(微分制御)

P制御とI制御で「現在の偏差」と「過去の偏差の蓄積」を扱いましたが、「未来」の情報は使えないでしょうか。完全な未来予測は不可能ですが、偏差の変化速度から近い将来の偏差を予測することはできます。これが微分制御の発想です。

微分要素 $s$ は位相を $+90^\circ$ 進めるため、安定性を改善する効果があります。偏差の変化率が大きいとき(出力が目標値に急速に近づいているとき)に制御出力を減少させ、行き過ぎ(オーバーシュート)を抑制します。イメージとしては、車の運転で赤信号が見えたときに、信号のかなり手前からブレーキを踏み始めるのと同じです。

ただし、微分制御は高周波ノイズを増幅するという重大な問題があります。微分は周波数領域ではゲインが周波数に比例して増加するため、高周波のセンサノイズが大きく増幅されます。実際の実装では、微分項にローパスフィルタを組み合わせた「不完全微分」を使います。

$$ C_d(s) = \frac{K_d s}{1 + \frac{K_d}{N K_p} s} $$

$N$ はフィルタ係数で、通常 $N = 8 \sim 20$ の範囲です。$N$ が小さいほどフィルタが強く効き、微分の効果は弱まりますがノイズに対するロバスト性が向上します。$N$ が大きいと理想微分に近づきますが、ノイズ増幅のリスクが高まります。

P・I・D の効果まとめ

3つの要素の効果を表にまとめましょう。

パラメータ 立ち上がり時間 オーバーシュート 定常偏差 安定性
$K_p$ 増加 短縮 増加 減少(ゼロにはならない) 悪化
$K_i$ 増加 短縮 増加 解消(ゼロに) 悪化
$K_d$ 増加 ほぼ不変 減少 影響なし 改善

ただし、この表はあくまで一般的な傾向であり、プラントの特性によっては異なる振る舞いを示すこともあります。

3つの要素がそれぞれどのような効果を持つか理解できたところで、次にこれらのパラメータをどう設定するか — チューニング手法について学びましょう。

チューニング手法

ジーグラ・ニコルス法(限界感度法)

ジーグラ・ニコルスの限界感度法(Ziegler-Nichols ultimate gain method)は、最も有名なPIDチューニング手法です。

手順:

  1. $K_i = 0$, $K_d = 0$ とし、P制御のみにする
  2. $K_p$ を徐々に増加させ、出力が持続振動する臨界ゲイン $K_u$ を求める
  3. 持続振動の周期 $T_u$ を測定する
  4. 以下の表に従ってPIDパラメータを設定する
制御器 $K_p$ $T_i$ $T_d$
P $0.5 K_u$
PI $0.45 K_u$ $T_u / 1.2$
PID $0.6 K_u$ $T_u / 2$ $T_u / 8$

直感的な意味: 臨界ゲイン $K_u$ は「これ以上ゲインを上げたら不安定になる」境界値であり、ジーグラ・ニコルス法はその6割のゲインを使うことで安定性を確保しつつ、速い応答を狙います。振動周期 $T_u$ はシステムの固有の時定数を反映しており、それに基づいて積分時間と微分時間を設定します。

ジーグラ・ニコルス法の利点は、プラントの数学モデルが不要で、実機実験だけでチューニングできる点です。しかし、得られるパラメータはオーバーシュートが大きくなる傾向があり(約25%のオーバーシュートを許容する設計思想)、応用によっては微調整が必要です。

ジーグラ・ニコルス法(ステップ応答法)

限界感度法が適用できない場合(振動させることが危険な場合など)、プラントのステップ応答から直接PIDパラメータを求める方法もあります。この方法は開ループ試験で行えるため、システムを不安定にするリスクがありません。

プラントのステップ応答が「S字カーブ」を描く場合(むだ時間を含む一次遅れ系やそれに類似した応答)、応答曲線の変曲点における接線から2つのパラメータを読み取ります。

  • むだ時間 $L$: 入力を加えてから出力が動き始めるまでの遅れ時間。接線が時間軸と交わる点から読み取ります
  • 時定数 $T$: 接線が定常値に到達するまでの時間。応答の立ち上がりの速さを表します
制御器 $K_p$ $T_i$ $T_d$
P $T/(KL)$
PI $0.9T/(KL)$ $L/0.3$
PID $1.2T/(KL)$ $2L$ $0.5L$

ここで $K$ はプラントの定常ゲイン(ステップ応答の最終値/ステップ入力の大きさ)です。

この手法の背景にある考え方は、むだ時間と時定数の比 $L/T$ がシステムの制御しやすさを表すという点です。$L/T$ が小さいシステムは制御しやすく、大きいゲインを設定できます。$L/T$ が大きい(むだ時間が支配的な)システムは制御が困難であり、ゲインを抑える必要があります。

その他のチューニング手法

ジーグラ・ニコルス法は歴史的に最も有名な手法ですが、現代では目的に応じたさまざまなチューニング手法が提案されています。代表的なものを紹介します。

Cohen-Coon法: ステップ応答法の改良版で、むだ時間が比較的大きいシステムに適しています。ジーグラ・ニコルス法がむだ時間/時定数比が小さいシステムを想定しているのに対し、Cohen-Coon法はより広い範囲のシステムに対応します。プラントを一次遅れ+むだ時間モデル $G(s) = Ke^{-Ls}/(Ts+1)$ で近似し、$L/T$ の比に応じてパラメータを調整します。

IMC(内部モデル制御)ベースのチューニング: 所望の閉ループ応答特性から逆算してPIDパラメータを求める方法です。IMC法の大きな利点は、一つのチューニングパラメータ $\lambda$(所望の閉ループ時定数)を選ぶだけでよいことです。$\lambda$ を小さくすると高速な応答が得られますがロバスト性が低下し、大きくすると応答は遅くなりますがロバスト性が向上します。この単純なトレードオフにより、直感的なチューニングが可能です。

最適化ベースの手法: 評価関数を定義し、それを最小化するようにPIDパラメータを数値最適化します。代表的な評価関数には以下のものがあります。

  • ISE(Integral of Squared Error): $\int_0^\infty e^2(t) \, dt$ — 大きな偏差を強く罰する
  • IAE(Integral of Absolute Error): $\int_0^\infty |e(t)| \, dt$ — 偏差を均等に罰する
  • ITAE(Integral of Time-weighted Absolute Error): $\int_0^\infty t|e(t)| \, dt$ — 長時間残る偏差を強く罰する

ITAEが最もオーバーシュートの少ない応答を与える傾向があり、実務ではよく使われます。

チューニング手法の選択指針

どの手法を使うかは、状況によります。プラントの数学モデルが得られている場合はIMCベースの手法や最適化ベースの手法が精度が高いです。モデルが不明で実機実験が可能な場合はジーグラ・ニコルスの限界感度法が適しています。安全上の理由で振動させることができない場合はステップ応答法を使います。

各手法の特性をPythonで比較してみましょう。

Pythonでの実装と比較

P・PI・PID制御の比較

まず、ジーグラ・ニコルス法の限界感度法を適用して、P制御・PI制御・PID制御のパラメータを求め、ステップ応答と偏差応答を比較します。プラントには3次系 $G(s) = 1/[(s+1)(s+2)(s+5)]$ を使います。臨界ゲインと振動周期は、特性方程式にラウスの安定判別法を適用して解析的に求めます。

import numpy as np
import matplotlib.pyplot as plt
import control as ctrl

# プラント: G(s) = 1 / [(s+1)(s+2)(s+5)]
plant = ctrl.TransferFunction([1], np.polymul([1, 1], np.polymul([1, 2], [1, 5])))

# 臨界ゲインと振動周期を求める
# 特性方程式: s^3 + 8s^2 + 17s + 10 + K = 0
# ラウス表から安定条件: 8*17 > 10+K → K < 126
K_u = 126.0
# s = jw を代入: -jw^3 - 8w^2 + 17jw + 10 + K = 0
# 虚部: -w^3 + 17w = 0 → w^2 = 17 → w = sqrt(17)
T_u = 2 * np.pi / np.sqrt(17)

print(f"臨界ゲイン K_u = {K_u}")
print(f"振動周期 T_u = {T_u:.4f} s")

# ジーグラ・ニコルス法によるPIDパラメータ
# P制御
Kp_P = 0.5 * K_u

# PI制御
Kp_PI = 0.45 * K_u
Ti_PI = T_u / 1.2
Ki_PI = Kp_PI / Ti_PI

# PID制御
Kp_PID = 0.6 * K_u
Ti_PID = T_u / 2
Td_PID = T_u / 8
Ki_PID = Kp_PID / Ti_PID
Kd_PID = Kp_PID * Td_PID

# 制御器の伝達関数
C_P = ctrl.TransferFunction([Kp_P], [1])
C_PI = ctrl.TransferFunction([Kp_PI, Ki_PI], [1, 0])
C_PID = ctrl.TransferFunction([Kd_PID, Kp_PID, Ki_PID], [Td_PID/10, 1, 0])

# 閉ループ系
systems = {
    "P control": ctrl.feedback(C_P * plant),
    "PI control": ctrl.feedback(C_PI * plant),
    "PID control": ctrl.feedback(C_PID * plant),
}

fig, axes = plt.subplots(1, 2, figsize=(14, 5))

# ステップ応答
ax = axes[0]
t = np.linspace(0, 8, 1000)
for label, sys_cl in systems.items():
    try:
        t_out, y_out = ctrl.step_response(sys_cl, T=t)
        ax.plot(t_out, y_out, linewidth=2, label=label)
    except Exception:
        pass

ax.axhline(1.0, color="black", linestyle="--", linewidth=1, alpha=0.4)
ax.set_xlabel("Time [s]", fontsize=12)
ax.set_ylabel("Output", fontsize=12)
ax.set_title("Step Response: P vs PI vs PID", fontsize=13)
ax.legend(fontsize=10)
ax.grid(True, alpha=0.3)

# 偏差の比較
ax = axes[1]
for label, sys_cl in systems.items():
    try:
        t_out, y_out = ctrl.step_response(sys_cl, T=t)
        error = 1.0 - y_out
        ax.plot(t_out, error, linewidth=2, label=label)
    except Exception:
        pass

ax.axhline(0, color="black", linestyle="--", linewidth=1, alpha=0.4)
ax.set_xlabel("Time [s]", fontsize=12)
ax.set_ylabel("Error e(t)", fontsize=12)
ax.set_title("Error Response: P vs PI vs PID", fontsize=13)
ax.legend(fontsize=10)
ax.grid(True, alpha=0.3)

plt.tight_layout()
plt.savefig("pid_comparison.png", dpi=150, bbox_inches="tight")
plt.show()

このグラフから、各制御方式の特性の違いが明確に読み取れます。

  1. ステップ応答(左図): P制御は定常偏差が残ります。PI制御は定常偏差をゼロにしますが、積分の蓄積によるオーバーシュートが見られます。PID制御は微分項のブレーキ効果により、PI制御よりもオーバーシュートが抑制され、より速い整定が得られています

  2. 偏差応答(右図): P制御の偏差はゼロでない定常値に収束しています。これは先ほど理論的に計算した定常偏差 $e_{\text{ss}} = a/(a + K_p)$ と一致します。PI制御とPID制御の偏差はゼロに収束しますが、PID制御の方が偏差の振動が小さく、より速くゼロに到達しています。積分項が「偏差の蓄積」を解消し、微分項が「行き過ぎ」を防止する協調効果が確認できます

この実験結果は、PIDの3要素の役割分担を端的に示しています。P制御は応答の「速さ」を、I制御は「正確さ」を、D制御は「滑らかさ」を担当していると理解できます。ただし、ジーグラ・ニコルス法で得られたパラメータはオーバーシュートが比較的大きい傾向があることもグラフから確認できます。用途に応じて微調整が必要です。

PID制御の効果は目標値への追従だけでなく、外乱に対するロバスト性にも現れます。

外乱応答の比較

PID制御の真価は外乱抑制にも現れます。ステップ外乱を加えたときの応答を比較します。

import numpy as np
import matplotlib.pyplot as plt
import control as ctrl

# プラント
plant = ctrl.TransferFunction([1], np.polymul([1, 1], [1, 5]))

# PIDパラメータ(手動チューニング)
Kp, Ki, Kd = 20, 15, 5

# 各制御器
C_P = ctrl.TransferFunction([Kp], [1])
C_PI = ctrl.TransferFunction([Kp, Ki], [1, 0])
C_PID = ctrl.TransferFunction([Kd, Kp, Ki], [Kd/20, 1, 0])

# 外乱に対する伝達関数: d → y = G/(1+CG)
T_d_P = ctrl.feedback(plant, C_P)
T_d_PI = ctrl.feedback(plant, C_PI)
T_d_PID = ctrl.feedback(plant, C_PID)

fig, ax = plt.subplots(figsize=(10, 5))
t = np.linspace(0, 8, 500)

for label, sys_d in [("P", T_d_P), ("PI", T_d_PI), ("PID", T_d_PID)]:
    t_out, y_out = ctrl.step_response(sys_d, T=t)
    ax.plot(t_out, y_out, linewidth=2, label=f"{label} control")

ax.axhline(0, color="black", linestyle="--", linewidth=1, alpha=0.4)
ax.set_xlabel("Time [s]", fontsize=12)
ax.set_ylabel("Output deviation", fontsize=12)
ax.set_title("Disturbance Rejection: P vs PI vs PID", fontsize=13)
ax.legend(fontsize=10)
ax.grid(True, alpha=0.3)

plt.tight_layout()
plt.savefig("pid_disturbance.png", dpi=150, bbox_inches="tight")
plt.show()

このグラフから、各制御方式の外乱抑制能力の違いが確認できます。

  1. P制御: 外乱による出力偏差がゼロでない定常値に留まります。P制御は外乱を完全には排除できません

  2. PI制御: 積分項の効果により、時間が経てば偏差はゼロに戻ります。しかし、回復に時間がかかることがあります

  3. PID制御: 微分項が外乱の影響に素早く反応し、PI制御よりも速い回復を示しています。微分項の「先読み」効果が外乱抑制にも有効であることがわかります

この外乱応答の実験は、PID制御の3要素がそれぞれ異なる役割を担い、協調して働くことを改めて確認するものです。現実の制御対象では目標値の追従だけでなく、外乱に対するロバスト性が求められるため、PID制御の外乱抑制能力は実用上極めて重要です。

PID制御の実装上の注意点

理論的なPID制御をそのまま実装すると、いくつかの問題が発生します。実装時に注意すべきポイントを整理しましょう。

離散化

実際のデジタル制御システムでは、PID制御をサンプリング周期 $T_s$ で離散化する必要があります。連続時間のPID制御器を離散時間に変換するには、積分項を累積和(前進オイラー法、後退オイラー法、台形法など)で近似し、微分項を差分で近似します。最も基本的な形(前進オイラー法)は以下のようになります。

$$ u[k] = K_p e[k] + K_i T_s \sum_{j=0}^{k} e[j] + K_d \frac{e[k] – e[k-1]}{T_s} $$

この形式は位置型PID(position form)と呼ばれます。もう一つの実装形式として、速度型PID(velocity form)があります。

$$ \Delta u[k] = K_p (e[k] – e[k-1]) + K_i T_s e[k] + K_d \frac{e[k] – 2e[k-1] + e[k-2]}{T_s} $$

速度型は出力の増分のみを計算するため、アンチワインドアップの実装が容易で、バンプレス切替にも対応しやすいという実用的な利点があります。

サンプリング周期 $T_s$ はシステムのダイナミクスに対して十分小さく設定する必要があります。経験的には、閉ループ系の帯域幅の10倍以上のサンプリング周波数が推奨されます。サンプリング周期が大きすぎると、離散化誤差により連続時間の設計とは異なる特性を示し、最悪の場合は不安定になることもあります。

微分キック(Derivative Kick)の回避

目標値がステップ状に変化すると、偏差 $e(t)$ も不連続に変化し、微分項が瞬間的に非常に大きな値(キック)を出力します。これを避けるために、目標値の微分ではなく出力の微分のみを使う「出力微分型」が推奨されます。

$$ u(t) = K_p e(t) + K_i \int_0^t e(\tau) \, d\tau – K_d \frac{dy(t)}{dt} $$

微分項の符号が負になっていることに注意してください。偏差 $e = r – y$ の微分の代わりに出力 $y$ の微分だけを使うことで、目標値の急変による微分キックを回避しつつ、外乱応答に対する微分の効果は維持されます。

バンプレス切替

手動制御から自動制御に切り替えるとき、制御出力が不連続に変化すると操作対象に衝撃が加わります。切替時に積分項の初期値を調整して、制御出力が連続的に遷移するようにする工夫がバンプレス切替(bumpless transfer)です。

具体的には、切替の瞬間に積分項の値を $I_0 = u_{\text{manual}} – K_p e – K_d \dot{e}$ と設定します。これにより、切替直後の制御出力が手動制御時の出力と一致し、スムーズな遷移が実現されます。

ゲインスケジューリング

非線形システムでは、動作点によってシステムの特性が大きく変わるため、単一のPIDパラメータでは全域で良好な性能を得ることが困難です。この問題に対処するために、動作点に応じてPIDパラメータを切り替えるゲインスケジューリング(gain scheduling)が用いられます。例えば、航空機の飛行制御では高度や速度に応じてPIDゲインを変化させます。

まとめ

本記事では、PID制御の理論とチューニング手法について解説しました。

  • PID制御は比例(P)・積分(I)・微分(D) の3つの要素を組み合わせた制御器であり、産業界で最も広く使われている
  • P制御: 偏差に比例した操作 — 速い応答だが定常偏差が残る
  • I制御: 偏差の積分に比例した操作 — 定常偏差を解消するが、オーバーシュートを増加させる。ワインドアップへの対策が必要
  • D制御: 偏差の微分に比例した操作 — オーバーシュートを抑制するが、ノイズに敏感。不完全微分での実装が実用的
  • ジーグラ・ニコルス法: 臨界ゲインと振動周期からPIDパラメータを系統的に決定するチューニング手法。プラントのモデルが不要で実機実験のみでチューニング可能
  • 実装上の注意点として、微分項のフィルタリング(不完全微分)、アンチワインドアップ、微分キックの回避、バンプレス切替が重要

PID制御はシンプルながら強力な制御手法ですが、その性能は適切なチューニングに大きく依存します。また、PID制御が苦手とする状況もあります。例えば、むだ時間が大きいシステム、非線形性が強いシステム、多入力多出力(MIMO)システムでは、PIDだけでは十分な性能が得られないことがあります。そのような場合には、位相進み・遅れ補償器や現代制御理論に基づく手法が必要です。

次のステップとして、以下の記事も参考にしてください。