PID制御

入力と出力があり、入力が増えれば出力が増えること(減ること)はわかっているが、それより詳しいことはブラックボックスになっているシステム(プラント)がある。出力を狙った値(セットポイント)に持っていく入力を算出したい。


フィードバック制御

入力と出力の関係が明確になっている場合、狙った出力を得るにはその関係から入力を算出できる(フィードフォワード)。しかし入力と出力の関係が明確になっていない、もしくは複雑過ぎて直接求めるのが困難な場合がある。このような場合、もし「入力が増えれば、出力も増える」という関係があれば、フィードバック制御が使える。つまり次のように入力を調整する。

  • 出力が狙っている値(セットポイント)よりも小さければ入力を増やす
  • 出力が狙っている値(セットポイント)よりも大きければ入力を減らす

定性的にはこのように入力を調整すれば良いが、具体的にどのような方針で入力を上げ下げすればよいのか。これについてはPID制御の考え方が使える。

P制御

一番直感的な入力の調整方法は、セットポイントと出力の差の誤差に比例した分だけ出力を増減させるものだ。この調整された出力を$u_p(t)$、誤差を$e(t)$とすると次のようになる。

$ u_p(t) = k_p e(t) $

$k_p$はPゲインと呼ばれる定数で、どの程度出力に応じて入力を増やすかを決定する。PはProportinal(比例)の頭文字で、この制御をP制御(比例制御)と呼ぶ。しかしこれでは、セットポイントに合致している時は入力が0になってしまう。セットポイントに合致しているときもある程度の入力が必要なプラントはP制御だけでは不十分だ。

PI制御

P制御の問題は、入力が誤差のみに依存しており、セットポイントに到達できない場合があることだった。セットポイントに到達しない場合、誤差を足しあげていくとそれは常に増大していく方向に増えていく。これを入力に利用することを考えると次のようになる。

$ u_i(t) = k_i \int^{t}_{0} e(\tau) d\tau $

$k_i$はIゲインと呼ばれる定数で、積み重なった誤差にどれほど応じて入力を増やすかを決定する。IはIntegral(積分)の頭文字で、この制御をI制御(積分制御)と呼ぶ。

P制御とI制御は同時に使うことができ、そうする場合は単純に二つを足し合わせる。

$ u_{pi}(t) = k_p e(t) + k_i \int^{t}_{0} e(\tau) d\tau $

これをPI制御と呼ぶ。

PID制御

ここまでのP制御とI制御の二つは原理的にセットポイントの変化を入力に反映するまで時間がかかるという問題がある。P制御はセットポイントと現在の出力の差がある程度大きくならないと大きく応答されない。I制御も誤差が溜まるまでは入力に大きく反映されない。セットポイントが比較的激しく変動し、それに素早く追従することが求められた場合、PI制御だけでは問題になってしまう。この「セットポイントの変化の瞬間」をつかむためにそれをそのまま入力に使うというアイデアが自然と出てくる。式にすると次のようになる。

$ u_d(t) = k_d \cfrac{de(t)}{dt} $

$k_d$はDゲインと呼ばれる定数で、変化量にどれほど応じて入力を増やすかを決定する。Dは急激な変化量に応じて入力を増やすかを決定する。DはDifferential(微分)の頭文字で、この制御をD制御(微分制御)と呼ぶ。

D制御もPI制御にそのまま足すことで追加できる。これがPID制御だ。

$ u_{pid}(t) = k_p e(t) + k_i \int^{t}_{0} e(\tau) d\tau + k_d \cfrac{de(t)}{dt} $

しかし実際のところPI制御だけでも十分実用に足り、実際にPI制御が大半を占める(らしい)。

調整法

PID制御についてはわかったが各定数項$k_p$,$k_i$,$k_d$はどのように決定すればよいのか。係数を自動的に決定する”ジーグラ・ニコルスの限界感度法”のような方法もあるが、プラントの特性は違いが多く一括りにはできず、各係数の特徴を把握した上で手動で設定する方法もよく行われている(らしい)。各ゲインの特徴をまとめてみる。

P制御
+応答の主力となる
-ノイズにも応答する

I制御
+ノイズを平滑化する
+定常誤差を解消する唯一の手段
-応答の速度が遅い
-入力が突然変化したときにオーバーシュート(微分キック)を起こす
-振動(ハンチング)を起こす

D制御
+セットポイントの変化への追従速度が上がる。
-ノイズを強調する。

デモ

最も簡単なプラントのモデルのデモを作成した。白い線がセットポイントを時系列に並べたもので、緑色が目指すべきセットポイント、青の点がPID制御によるフィードバックの結果だ。

GUIの各項目は以下のようになっている。

  • Preset: プリセット。色々なシチュエーションのプリセット。
  • Speed: シミュレーションの速度
  • SetPoint: セットポイントの動作を記述する数式。
  • Output: 入力から出力に変換する関数。ブラックボックスとして扱われている対象の関数。
  • P_Gain: Pゲイン
  • I_Gain: Iゲイン
  • D_Gain: Dゲイン

数式を入れられる”SetPoint”と”Output”には、次の関数が使える

  • sin
  • cos
  • tan
  • atan
  • exp
  • floor
  • frac
  • pow
  • noise: [-1,1]をランダムに返す。
  • box: [-1,1]の矩形波を返す
  • tri: [-1,1]の三角波を返す
  • saw: [-1,1]のノコギリ波を返す

その他

ここで述べた簡単なPID制御では次のようなモデルにそのままでは対応することができない。

  • ディレイ(出力に入力結果が出るまで時間差)、ラグ(入力が出力に完全に反映されるまでの時間差)があるプラント。ネットワークなど。
  • 入力を増減しても出力がそれ以上増減しないようなプラント。物理的なモーターなど。
  • 入力を増やせば、出力は増えるが、入力を増やした直後は出力は減る方向に一時的に動いてしまうようなプラント。つり竿など。

参考


メモ