世の中には様々な制御手法がありますが、多すぎて全体像を把握するのは難しいですよね。このページでは、主要な制御手法をダイジェストで紹介します。
分量がかなり多くなってしまったので、適宜目次をお使いください。各見出しには、その手法が盛んに研究され始めた時期も書いてありますので、合わせて参考にしてくださいね!
古典制御
古典制御で扱えるのは線形システムのみなので、制御器も線形な構成をとります。その構成や設計法によって、下記に大別されます。
PID系制御(1920年代~)
PID制御は、比例要素・積分要素・微分要素の組み合わせで構成される、最も基本的でシンプルな制御手法です。

$$u(t) = \ubg{K_P\ e(t) \vphantom{K_I \int ^t _0 e(\tau) d\tau}}{比例\ P} + \ubg{K_I \int ^t _0 e(\tau) d\tau}{積分\ I} + \ubg{K_D\ \dot{e}(t)\vphantom{K_I \int ^t _0 e(\tau) d\tau}}{微分\ D}$$
それぞれの制御要素のゲイン($K_P$など)をチューニングすることで、制御性能を調整します。調整は数式モデルを用いて理論的に行う事もできますが、実際に制御対象を動かしながら試行錯誤的にやることが多いです(そのほうが簡単なので)。
最大の利点はその使いやすさで、制御工学をよく知らない人でもお手軽に80点くらいの性能を出せてしまうことが多いです。原始的ながらも「この世で使われている制御器の8割はPID」と言われるほど、非常に広く使用されている制御器です。
通常のPID制御に加え、微分先行型PID制御・I-PD制御など、様々な特徴を持った派生版が存在します。
※PID制御の詳細については、こちらのページをご覧ください
周波数特性に基づいた制御(1940年代~)
制御システム全体の周波数特性が意図通りになるように、制御器の特性を設計する手法です。制御器を1つのシステムとみなし、そのシステムがどのような特性を持つべきかを考え、設計します。

PID系よりも複雑な制御器を、理論に基づいて取り扱えるのが利点です。
※システムの周波数特性については、こちらのページをご覧ください
根軌跡法(1950年代~)
制御ゲインを0からだんだん大きくしていったとき、システムの極がどのように変化していくのかを図で表したものを根軌跡(Root Locus)と呼びます。この根軌跡に基づいて、適切な制御ゲインを設計する手法が根軌跡法です。

極は「わざわざ方程式を解かなくてもシステムの挙動がある程度分かる、便利なパラメータ」だと思ってください。
根軌跡上での極の動きにはある程度法則性があるため、実際に極を隅々まで計算することなく、ある程度お手軽に根軌跡を描けるのが特徴です。
根軌跡法の利点としては、設定されたゲインと、それが生み出す動作を視覚的に対応付けられることが挙げられます。当時は画期的でよく使われたようですが、コンピュータを用いた制御器設計が発達した現在では、あまり使われることはありません。
※システムの極については、こちらのページをご覧ください
2自由度制御
2自由度制御は、フィードバック制御とフィードフォワード制御を組み合わせた制御です。

通常のフィードバック制御は誤差$e$のみに基づいた制御、フィードフォワード制御は目標値$r$のみに基づいた制御ですが、それらを組み合わせることで$e$と$r$(または$y$と$r$)2つの情報に基づいた制御が可能となるため、2自由度制御と呼ばれます。
2自由度制御の利点としては、フィードバック制御の高い追従精度と、フィードフォワード制御の速い反応速度を両立できることが挙げられます。
※フィードバック制御・フィードフォワード制御の特性については、こちらのページをご覧ください
現代制御
現代制御は、線形システム・非線形システム両方扱える手法がほとんどです。以下に挙げる手法も、全て線形・非線形両方の理論が存在します。ただし、非線形の手法は理論や設計が格段に難しくなります…
※古典制御と現代制御の違いについては、こちらのページをご覧ください
最適制御(1950年代~)
最適制御(Optimal Control)は、制御目的を達成するための最適な制御入力を計算する手法です。制御目的を次の評価関数$J$で表現し、それを最小化する入力を導出します。
$$J= \ubg{\phi \bigl( x(t_f) \bigr)}{終端コスト} + \ubg{\int ^{t_f} _{t_0} L\bigl(x(t), u(t)\bigr)dt}{ランニングコスト} $$
終端コストは「最終状態がどのようになってほしいか」を、ランニングコストは「最終状態までどのように行ってほしいか」を反映させるものです。どちらにも、「目標値との誤差」や「投入される制御入力量」が設定されることが多いです。自分の制御目的をいかに評価関数に反映させるかが、設計者の腕の見せどころとなります。
通常、制御入力は状態フィードバックの形で導出されます。

状態をセンサーなどで直接出力(取得)できない場合は、オブザーバやカルマンフィルタなどで状態を推定することがほとんどです。

最適制御の最大の利点は、評価関数に対し「これ以上いい方法は絶対にない」という文字通り最適な制御が可能となることです。状態方程式でシステムの特性をすべて考慮に入れる現代制御ならではの、非常に強力な制御手法であるといえます。
メジャーな線形最適制御の種類としては、次のものがあります。
- LQR制御:状態を0に持っていくことを目指す、最も基本的な最適制御
- LQI制御:状態を任意の一定値に持っていくことを目指す最適制御
- LQG制御:制御対象に含まれるノイズも考慮した最適制御。平たく言うと、LQRとカルマンフィルタの組み合わせ。
バンバン制御(1950年代~)
バンバン制御(Bang–Bang Control)はON-OFF制御とも呼ばれ、制御入力が2つの値のどちらかしか取らない制御を意味します。

システムをスイッチのON・OFFでしか制御できない場合は、必然的にコレになります。例えば安物のコタツは、「温度が設定値より低ければヒーターON、高ければヒーターOFF」といった動作で温度制御されますが、これはバンバン制御です。
最大の利点は、安くて単純な構成で実現できる点です。一方、制御入力が急激に変化するため、制御対象の挙動が滑らかになりにくいことが欠点です。
また、普通の最適制御が結果的にバンバン制御になる場合もあります。その典型的な例が、最短時間制御です。例として、車を現在地から目的地へ移動させる制御を考えましょう。

制御入力はアクセル・ブレーキ操作、つまり車の加速度です。このとき、目的地へ到達するまでの時間を最小化する最適制御入力は、結果的にバンバン制御となります。

最初にアクセルを思いっきり踏み、「今だ!」というタイミングでブレーキを思いっきり踏むのがベストということですね。直感的にも納得がいくと思います。
ただし、現実には目的地に寸分違わず止まることはできず、目的地付近でガクガクとチャタリングが発生してしまいがちなので、何かしらの対策が必要となります。

適応制御(1960年代~)
適応制御(Adaptive Control)は、直近の動作実績に応じて、制御器や数式モデルのパラメータを自動で調整しながら制御する手法です。
最適制御は非常に強力ですが、数式モデルに誤差があると当然その性能も低下します。とはいえ現実のシステムは、経年劣化や動作条件によってその特性が変動するので、数式モデルには必ず誤差が含まれます。適応制御の利点は、各種パラメータを自動で調整することで、この誤差を低減できることです。
適応制御は、モデル規範型適応制御(MRAC)とセルフチューニングレギュレータの2種類に大別されます。
モデル規範型適応制御は、数式モデルの誤差をカバーするように制御パラメータを補正する方法です。直接法とも呼ばれます。適応制御ではこちらが主流です。

一方セルフチューニングレギュレータは、数式モデルのパラメータを補正し、得られたモデルに基づいて制御器を設計し直す方法です。数式モデル経由で制御器を補正するため、間接法とも呼ばれます。

予見制御(1970年代~)
予見制御(Preview Control)は、最適制御に将来を見越したフィードフォワード機能を持たせた手法です。「予見制御」というと、線形の最適制御を指す場合がほとんどです。
将来の目標値や外乱などが既知であるとして、それに基づいて普通の最適制御入力を補正するような入力を導出します(線形システムの場合)

予見制御の利点としては、2自由度制御と同じくフィードバック制御とフィードフォワード制御の利点を両立できることが挙げられます。
ロバスト制御(1970年代~)
ロバスト制御(Robust Control)は、数式モデルに含まれる「不確かさ」の範囲を考慮し、想定される最悪の場合でも安定した結果が得られるように制御する手法です。

ロバスト制御以前は、「いかにモデルの誤差を低減し、完璧に近づけるか」を考えてきました。ロバスト制御ではある意味それを諦め、「モデルが完璧でなくても大丈夫な制御」を考えます。
ロバスト制御の利点は、当然誤差や外乱などの不確かさに強いことです。ただし、数式モデルに加えて「不確かさ」を考慮する必要があるため、設計難度は高くなります。
さらに「常に最悪の場合を考える保守的な制御」とも言えるため、モデルが完璧である場合よりも制御性能は低くなります。
ロバスト制御の代表的な手法としては、H∞制御・μ解析・LMIを用いた手法が挙げられます。H∞制御は古典制御の図式的な設計方法と親和性が高いことから、古典制御でも用いられます。
モデル予測制御(1980年代~)
モデル予測制御(Model Predictive Control)は、現在を開始点として、少し将来までの最適制御問題を制御中に解き続けることで「結果的」に最適フィードバック制御を実現する手法です。

他の最適制御手法は、モデルに基づいて制御前に最適な制御則を求めます。一方でモデル予測制御は、最適な入力を制御中に求め続ける点が大きく異なります。
脳筋戦法に聞こえますが、「事前に網羅的な制御則を考えなくていい」というのは、問題を解く上で結構便利な性質です。
モデル予測制御の利点としては、まずフィードバック制御とフィードフォワード制御の利点を両立できることが挙げられます。これに加えて、制御中に目標軌道が変わっても対応できたり、入力や状態の制約を考慮できたりと、かなり実用性に優れることが知られています。
リアプノフ関数による制御(1950年代~)
リアプノフの安定性解析を用いて、「状態や誤差を0に閉じ込める」イメージの制御手法です。基本的に非線形システムの制御に用いられます。
リアプノフの安定性解析とは、システム
$$\dot{x} = f(x)$$
に対し、
$$\begin{align} V(x) &\succ 0 \\ \dot{V}(x) &\prec 0\end{align}$$
を満たすリアプノフ関数$V(x)$があれば、システムは漸近安定である($\lim _{t\rightarrow \infty} x(t)= 0$を満たす)というものです。

平たく言うと、時間とともに変数$x$が0に閉じ込められるわけですね。
ここでポイントなのは、$x$はシステムの状態に限定されず、何でも良いということです。たとえば$x$を「制御量と目標値の誤差」と設定すると、時間が経つに連れて誤差が0に収束し、追従制御を達成できることになります。
この場合、設計の流れは次のようになります。
- 誤差$x$に対する微分方程式$\dot{x} = f(x,u)$を立てる
- 誤差$x$に対するリアプノフ関数候補$V(x)\succ 0$を作る
- $\dot{V}(x)$を計算すると$\dot{x} = f(x,u)$が中に現れるので、$\dot{V}(x) \prec 0$が満たされるように制御入力$u$を設定する。
リアプノフの安定性解析は線形システム・非線形システム関係なく適用可能なので、適用範囲が非常に広いのが利点です。
一方、リアプノフ関数を試行錯誤的に探す必要があるのが欠点です。特に複雑なシステムでは、リアプノフ関数が手に負えないほど複雑になりがちなので、注意(覚悟)が必要です。
スライディングモード制御(1970年代~)
スライディングモード制御(Sliding Mode Control)は、「システムの挙動をある軌道(面)に閉じ込める」イメージの制御手法です。リアプノフ関数による制御の発展版とも解釈できます。こちらも基本的に非線形システムの制御に用いられます。
まずシステム$\dot{x} = f(x,u)$に対し、閉じ込めたい軌道(面)を次の微分方程式の形で設計します。
$$S(x)=0$$
このとき、$S(x)$が状態空間上で張る面をスライディング面(滑り面)と呼びます。例えば次のような状態$x$に対して、次のようなスライディング面が設定できます。
$$ x = \left[ \begin{array} {c} p\\ \dot{p} \end{array} \right]$$
$$S(x) = \left[ \begin{array} {c c} 1 & 1 \end{array} \right]\left[ \begin{array} {c} p\\ \dot{p} \end{array} \right] = p + \dot{p} = 0$$

あとは$S(x)$に対するリアプノフ関数$V(S)$を設定し、それが$V(S) \succ 0$と$\dot{V}(S) \prec 0$を満たすように制御入力$u$を設定すれば、システムの挙動はスライディング面$S(x)=0$に閉じ込められます。
このときのシステムの挙動を状態空間上で表すと、まず状態がスライディング面に向う到達モードを経て、スライディング面上を”滑る”スライディングモードに遷移するようなものとなります。

スライディングモード制御の強みとしては、ロバスト性に非常に優れること、すなわち数式モデルの誤差や外乱に強いことが挙げられます。ただし、スライディング面近傍でチャタリングが生じやすいため、何らかの対策が必要となります。
※システムの挙動をスライディング面に閉じ込める方法は、上記のリアプノフ関数による方法の他にも、様々なものが提案されています。
その他の制御
ここからは、「制御対象の数式モデルに基づいて制御器を設計する」という制御工学の基本思想に含まれない制御手法を紹介しましょう。
シーケンス制御(1920年代~)
シーケンス制御(Sequence Control)は、スイッチのON/OFFに基づいた単純な制御方式です。数式モデルに基づいた物理量の制御ではないので、制御工学の枠組みにはあまり含まれません。
これまで見てきた制御手法は、個々のシステムを精密に制御することを目的としていました。一方シーケンス制御は、次のようにシステム同士の動作の流れ(=シーケンス)を制御する場合に用いられます。
- スイッチAが押される
- 機械1が動く
- 機械1が仕事を終えると、スイッチBが押される
- 機械1が止まり、機械2と3が動く
「もしこうならこうする」という、いわゆるIF-THENルールに基づいてスイッチを切り替え、ものを動かす手法とも解釈できます。

当初、こういったシーケンスはリレーを用いた回路でアナログ的に実現されていました。1970年代以降は、シーケンスをソフト上でプログラムできるPLC(プログラマブル・ロジック・コントローラ)が普及し、広く使用されています。
プログラムといっても、ラダー回路と呼ばれる、アナログのリレー回路と同様のものをソフト上で組み立てるだけなので、高度な制御やプログラミングの知識を必要としないのが利点です。

適用先はベルトコンベア・天井クレーン等の工場設備をはじめ、単純な自販機・自動ドア等様々で、世の中で非常に多く使われている制御手法です。
ファジィ制御(1980年代~)
ファジィ制御(Fuzzy Control)は、「こういうときはこう操作したらいい感じに制御できる」というような人間のざっくりとした知識を、制御器で再現させることを目指した制御です。
方法としては、まず人間の知識をルールに落とし込みます。車の運転でいうと、次のようになります。
- 「速度が遅い」かつ「車間距離が短い」なら「速度そのまま」
- 「速度が遅い」かつ「車間距離が長い」なら「速度上げる」
- 「速度が速い」かつ「車間距離が短い」なら「速度下げる」
- 「速度が速い」かつ「車間距離が長い」なら「速度そのまま」
その後、それぞれの状態の「度合い」を物理量とざっくり紐付ける、メンバーシップ関数を定義します。

これで準備は完了です。あとは制御中に、現在の状態に対する各ルールの適合度を、メンバーシップ関数によって算出します。
今現在の適合度はそれぞれ、
- 「速度が遅い」かつ「車間距離が短い」なら「速度そのまま」:適合度30%
- 「速度が遅い」かつ「車間距離が長い」なら「速度上げる」 :適合度10%
- 「速度が速い」かつ「車間距離が短い」なら「速度下げる」 :適合度80%
- 「速度が速い」かつ「車間距離が長い」なら「速度そのまま」:適合度20%
最後に適合度に応じた制御入力を次のように決定します。

※上記は一例であり、他にも様々なファジィ制御則が提案されています。
ファジィ制御の利点としては、数式モデルに基づかない人間の経験則を制御に落とし込めることが挙げられます。
ファジィとは「曖昧な」という意味で、まさに人間が勘と経験で「いい感じに」ものを制御するのを再現していると言えるでしょう。
強化学習(1980年代~)
強化学習(Reinforcement Learning)は、コンピュータに試行錯誤させ、最適な制御則を学習させる手法です。
試行錯誤に基づくので、制御対象の数式モデルがなくても学習可能なのが利点です。
基本的に莫大な数の試行錯誤が必要なので、シミュレーション上で試行錯誤を高速に行うことがほとんどです。よってゲームや計画問題など、その動作をコンピュータで素早く・完全にシミュレーションできる対象に適しています。
一方で、ロボットや車などの実システムへの適用はまだ限定的です。例えば、実際のロボットに試行錯誤させると数ヶ月単位の莫大な時間がかかりますし、学習初期の制御器は暴走状態に等しいので非常に危険です。
かといってシミュレーションで高速・安全に学習させようとしても、必ずモデルに誤差が入るので学習結果は実際の世界では通用しません。もし誤差のないモデルが用意できるなら最適制御が使えるので、そもそも強化学習を使う意味がなくなります(最適なので必ず強化学習よりもよい解が得られます)。
このように、実システムへの適用にはまだ課題がありますが、近年の計算技術の発達により、目覚ましい進化を続けている分野でもあります。近い将来、実用的な新手法が開発されるかもしれません。
以上、メジャーな制御手法の一覧でした。それぞれの手法の開発の裏には物語(歴史)があります。気になる方は、こちらの記事をご参照ください。
コメント
初めまして。質問があります。よろしければお答えください。
記事内の「リアプノフ関数による制御」の個所で「リアプノフ関数を試行錯誤的に探す必要がある」と記載されていますが、試行錯誤的に探すとは具体的にどういう作業を行うのでしょうか?
例えば1次関数から高次の関数まで、係数を色々と変えてリアプノフ関数の定義に合うものを探してくるという感じなのでしょうか?
また、探す際のコツや、指針などがあれば教えて頂けないでしょうか?
どうぞよろしくお願い致します。
質問ありがとうございます。リアプノフ関数の探し方は取り扱う問題によって千差万別ですが、よくやる指針としては次の2つが挙げられます。
①とりあえず2次形式で試す
ベクトルx(t)に対する最もシンプルな正定関数は x^T A x という2次形式ですので、この形から試すことが多いです。これでダメなら、x(t)に対する何らかのベクトル関数Φ(x)を用いて Φ(x)^T A Φ(x) という形をつくり、これをベースに色々試行錯誤する、というイメージです。このアプローチは”Sum of Squares”と呼ばれており、先人によって色々研究されていますので、詳細はこのキーワードで調べてみると良いと思います。
②物理現象の前提知識から推測する
リアプノフ関数に求められる性質を超ざっくりと言うと「時間とともに0に向かって単調減少すること」であるので、そのような性質をもつ物理量をリアプノフ関数にしてみることも多いです。機械システムの例だと、摩擦を受けながら平面運動する物体を考える場合、その運動エネルギーは時間とともに0に向かって単調減少するので、運動エネルギーがリアプノフ関数となる(またはリアプノフ関数に含まれる)可能性が高いです。またこの場合、運動エネルギーは速度vに対する2次形式1/2*mv^2となりますが、この知見に習って別の「エネルギーっぽいもの」を設定してみることもあります。例えば速度でないパラメータaが時間とともに0になることが分かっていれば、aに関する「エネルギーっぽいもの」として2次形式1/2*na^2(nはmに変わる定数)を設定してみる、といったアプローチが考えられます。