実際に使える制御工学:基礎編(5)「安定判別とゲイン調整。1000kgアームを暴走させないために。」
<この記事で伝えたい事 >
安定性は、制御設計における最重要項目です
性能は大事ですが、安定に動くことが前提です。
安定性を確保した上で性能を引き出す調整をするのがセオリーです。安定判別法(システムの安定/不安定を見極める方法)は複数あります
今回は、ナイキストの安定判別法のみ説明します。
ただ、色々な方法を知っておくことは制御技術者としての引き出しの多さにつながります。
自身で調べてみることをオススメします。
1. はじめに
自己紹介はこちらです。
この記事は、主に制御系の学生や若手エンジニアに向けた基礎知識紹介・解説記事シリーズの第5弾です。
今回は、代表的な安定判別方法であるナイキストの安定判別法と、位相余裕・ゲイン余裕の考え方、それらの活かし方を紹介・解説します。
2. ナイキストの安定判別法
冒頭で述べたように、制御システムは安定に動くことが最も大事です。
そもそも制御工学とは、
「ジェームズ・ワット発明の遠心調速機を安定に動かせる条件を割り出そうとする試みから始まった」
と言われるくらいです。
(第一次産業革命のころのお話です)
制御システムの安定/不安定を判別する方法は、色々と考案されています。
その中でもメジャーなものの1つが、ナイキストの安定判別法です。
やり方は至ってシンプルです。
(2ステップ)
STEP1
フィードバックシステムの一巡伝達関数$${G_{loop(s)}}$$を求める

STEP2
$${G_{loop(s)}}$$のナイキスト線図を描く
(ナイキスト線図の詳細については基礎編(3)の付録2を参照ください)
STEP3
描いたナイキスト線図が実数軸を横切るとき点(-1,0)の右を通るかどうかで安定/不安定を判別する
(点(-1,0)の右を通れば安定、左を通れば不安定)

私の推測ですが、ナイキストの安定判別法がメジャーな理由は、
「遅延要素を考慮した安定判別がしやすいから」
と思います。
他の方法でこれをやるのは難しいです。
制御ループ内の遅延要素には、以下のようなものがあります。
センサの通信遅延
光速の壁がある以上、コントローラ(コンピュータ)がセンサからデータを読み取るときに通信遅延が発生します。$${^{※量子テレポーテーションによる通信を除く}}$$
コントローラ内の制御演算にかかる時間
マイコン(マイクロコントローラ)チップの処理性能は年々上がっていますが処理にかかる時間はゼロではありません。
その他もろもろ
例えば、電気・電子回路も動作命令が入ってきてから実際に動くまでにタイムラグがあります。
モノによりますが、トータル数十[μs]程度の遅延はあると思っておいた方が良いです。
理論と実機が一致しないことはままありますが、このわずかな遅延こそがその一因であるケースもあります。
遅延要素には、色々な形があります。
例えば、純粋な時間遅延であるムダ時間の伝達関数は下式です。
($${T_{d}}$$がムダ時間、単位は[s])
$$
G_{delay(s)}=e^{-T_{d}\cdot s}
$$
ナイキストの安定判別法のキモである「点(-1,0)が安定/不安定判別の境目」の理由を説明します。
フィードバックの符号がマイナス(ネガティブフィードバック)のときは制御システムは安定動作します。
そういうものと思ってください。
しかし、一巡伝達関数$${G_{loop(s)}}$$の位相が180[deg]遅れると話が変わります。
位相が180[deg]遅れると、フィードバックの符号がプラスになります。
これは、ポジティブフィードバックと同じ状態です。
このとき、一巡伝達関数のゲインが1より小さいか/大きいかで安定/不安定が分かれます。
ゲインが1未満のとき(例えばゲイン=0.9)
ループを回る度に0.9がかかり、0.9→0.81→0.729...と0に近づいていくので安定です。
ゲインが1を超えるとき(例えばゲイン=1.1)
ループを回る度に1.1がかかり、1.1→1.21→1.331...と$${\infty}$$に発散していくので不安定です。
点(-1,0)の
右を通れば$${\bm{G_{loop(s)}}}$$の位相-180degのときのゲインが1未満
左を通れば$${\bm{G_{loop(s)}}}$$の位相-180degのときのゲインが1より大
なので、点(-1,0)の右を通るか/左を通るかで安定/不安定が判別できます。
なお、コントローラや制御対象が不安定極と呼ばれるものを持つ場合、ナイキストの安定判別法の上は問題なくとも制御システムが不安定化します。
これについては、別の機会に説明しようと思います。
3. 位相余裕とゲイン余裕
基礎編(3)の付録2で
「本質的にナイキスト線図とボード線図は同じもの」
と言いました。
そうであれば、ボード線図版のナイキストの安定判別法があっても不思議ではありません。
それが、位相余裕とゲイン余裕という考え方です。
ナイキストの安定判別法を言葉で表すと、以下2つの言い方ができます。
一巡伝達関数$${\bm{G_{loop(s)}}}$$のゲインが1(=0[dB])のとき位相が-180[deg]より遅れていなければ制御システムは安定
一巡伝達関数$${\bm{G_{loop(s)}}}$$の位相が-180[deg]のときゲインが1(=0[dB])未満であれば制御システムは安定
前者の延長線上にある考え方が位相余裕、
後者の延長線上にある考え方がゲイン余裕
です。
まず、位相余裕について説明します。
仮にゲイン1(=0[dB])での位相-135[deg]の一巡伝達関数があるとします。
すると、想定外の要因によって位相遅れが増えても、増加分が45[deg](元々の位相遅れとの合計が-180[deg])までは制御システムの安定を保てます。
この45[deg]を位相余裕と呼びます。
次に、ゲイン余裕について説明します。
仮に、位相-180[deg]でのゲイン-5[dB]の一巡伝達関数があるとします。
すると、想定外の要因によってゲインが増えても増加分が5[dB](元々のゲインとの合計が0[dB])までなら制御システムの安定を保てます。
この5[dB]をゲイン余裕と呼びます。
位相余裕・ゲイン余裕はボード線図上で確認すると分かりやすいです。
(下図のように)

当然、位相余裕・ゲイン余裕共に大きい方が制御システムの安定を保つ上で有利です。
しかし、余裕を大きく取りすぎると目標と出力の誤差を縮める速さ(=追従性能)が犠牲になります。
この
「あちらを立てれば、こちらが立たず」
という関係をトレードオフと呼びます。
開発現場等では、安定性と追従性能のトレードオフのバランスを考えて制御ゲインを調整することが要求されます。
位相余裕・ゲイン余裕は両方見ておくに越したことはありません。
しかし、自然界にあるモノは、基本的に周波数が上がるほど右肩下がりにゲインが低下します。
このため、とりあえずは位相余裕だけ見て制御設計・ゲイン調整をしても、狙いはそれほど外しません。$${^{※1 , ※2}}$$
ただ、仕上げ前にはゲイン余裕も見た方が良いです。
$$
\begin{array}{l}
^{※1 位相余裕を見る点より高い周波数でのゲインは}\\
^{ 0[db]より低いことがほとんどです}
\end{array}
$$
$$
\begin{array}{l}
^{※2 共振現象があるときやコントローラ内で位相進み}\\
^{ 補償をかけるときは例外なので要注意です}
\end{array}
$$
私の中での位相余裕の目安を下表にまとめます。
(感じ方に個人差はあると思います)

なお、位相余裕が30[deg]を下回ったくらいから制御システムの動きに意図しない振動が現れます。
追従性能重視でも30[deg]くらいは位相余裕を持たせるのをオススメします。
4. 安定性を意識したゲイン調整
ここでは、安定性(特に位相余裕)を意識したゲイン調整を紹介します。
ただ、ゲイン調整の前にやるべき事があります。
それは主に以下2つです。
制御対象をハッキリさせる
(できれば遅延要素も含めて)コントローラの構造をハッキリさせる
(数値はこれからいじりますが)
今回は、制御対象はDCモータ全体とし、コントローラはPID制御とします。
(DCモータの伝達関数については基礎編(2)を参照ください)
また、遅延要素として25[μs]のムダ時間を持つとします。
下図は、制御システムの構成を表すブロック線図です。

制御対象にDCモータ全体を選んだので、制御対象の入力は電圧$${e}$$、出力は角速度$${\omega}$$となります。
コントローラの果たすべき役割は、
「電圧$${\bm{e}}$$を調整して角速度$${\bm{\omega}}$$を角速度目標値$${\bm{\omega^{ref}}}$$どおりに動かす(=角速度誤差$${\bm{\omega_{e}}}$$を0にする)こと」$${\\}$$となります。
制御対象および遅延要素のパラメータは以下とします。
モータ慣性モーメントJ:$${\bm{3.0 \times 10^{-4}_{[kgm^2]}}}$$
電気抵抗R:$${\bm{1.0_{[\Omega]}}}$$
コイルインダクタンスL:$${\bm{0.5 \times 10^{-3}_{[H]}}}$$
トルク定数Kt:$${\bm{0.01_{[Nm/A]}}}$$
逆起電圧定数Ke:$${\bm{0.01_{[V/(rad/s)]}}}$$
ムダ時間Td:$${\bm{25 \times 10^{-6}_{[s]}}}$$
基礎編(4)で述べたように、PID制御においてコントローラ全体の原動力になるのは一般的にP制御です。
このため、最初は積分ゲイン$${K_{i}}$$や微分ゲイン$${K_{d}}$$はゼロか小さな数値にして、比例ゲイン$${K_{p}}$$から調整するのが一般的です。
今回は「ほど良いバランス」とした位相余裕45[deg]付近を狙った調整をしてみましょう。
制御対象と遅延要素のパラメータを前述の数値にして、$${K_{i}=0 , K_{d}=0}$$にしたとき、$${K_{p}=75}$$にすると位相余裕がほぼ45[deg]になります。

このとき制御システムがどう動くかをシミュレーションしてみましょう。
(指令波形はステップ波形とします)

$$
\begin{array}{l}
^{※ シミュレーション上の摩擦がゼロなのに定常偏差}\\
^{ が出るのは逆起電圧が抵抗成分となるためです}\\
^{ (実物は摩擦のため更に大きな定常偏差が出ます)}
\end{array}
$$
定常偏差を抑えるのはI制御の役割、オーバーシュート・振動を抑えるのはD制御の役割です。
このため、P制御だけでの波形に問題があれば積分ゲインや微分ゲインの調整を検討することになります。
ただ、2つの要素を一度に変えると混乱の原因になります。
(どちらによって波形が変わるか分からなくなるので)
実は、オーバーシュート・振動の対策はD制御の他にもあります。
よって、普通は積分ゲインの調整を先にやります。
やってみると分かりますが、積分ゲインは意外なほど上げられます。
下図は、$${K_{p}=75, K_{i}=10000, K_{d}=0}$$でのシミュレーション結果です。

I制御を有効化したことで、位相余裕は40.6[deg]まで低下します。

積分は位相を遅らせる要素です。
I制御を追加して位相余裕が削れるのは許容するしかありません。
最後の仕上げに、微分ゲインの調整をします。
積分ゲインとは対照的に、微分ゲインはわずかな数値が波形に大きく影響する傾向があります。
下図は、$${K_{p}=75, K_{i}=10000, K_{d}=0.02}$$でのシミュレーション結果です。

積分の逆計算だけあって、微分は位相を進ませる効果を持ちます。
D制御を追加したことで、位相余裕が67.2[deg]に向上しています。
(狙った位相余裕は外しましたが、よくあることです)

「D制御で位相余裕が向上するなら微分ゲインをもっと上げれば良いのでは?」
と思う方は多いでしょう。
それが上手くいくケースもありますが、そうはいかないケースも多いです。
実機には、高い周波数での共振現象やノイズがあります。
微分ゲインを上げると、これらの影響でモノから異音・発振が生じます。
このため、微分ゲインはほどほどの数値に留めるのがベターです。
以上のようにゲイン調整をすれば、制御システムの安定を保ちながら性能を引き出せます。
PID制御は、未だに開発現場で使われる方法です。
ただ、使い方・調整方法は今回紹介したものよりも洗練されています。
それについては、今後の記事で紹介したいと思います。
5. おわりに
この記事では、安定判別方法とそれを活かしたゲイン調整を紹介・解説しました。
もしも制御システムが不安定化すると、
製造ラインがストップして大きな損失が発生する
モノが壊れる/人体に危害が及ぶ
危険性があります。
産業用ロボットには可搬質量1000kgを超える大型機種も存在します。
そんなものが不安定な動き(=暴走動作)をしたときの被害規模は想像に難くないでしょう。
(可搬質量1000kgというのは「アーム先端に1000kgの物体を付けた状態で高速動作可能」という意味です)
そうした事態を避けるため、制御システムの安定性には十分な注意を払ってゲイン調整すべきと考えます。
前回:基礎編(4)「PID制御」はこちら
次回:基礎編(6)「極と零点」はこちら
付録. ボード線図等確認用MATLABコード
% パラメータの定義
Kt=0.01; Ke=0.01; R=1.0; L=0.5e-3; J=3e-4; Td=25e-6;
% Kt:トルク定数[Nm], Ke:逆起電圧定数[V/(rad/s)], R:電気抵抗[Ω]
% L:コイルインダクタンス[H], J:モータ慣性モーメント[kgm^2], Td:ムダ時間[s]
Kp=75; Ki=0; Kd=0;
% Kp:比例ゲイン, Ki:積分ゲイン, Kd:微分ゲイン
% 伝達関数の定義
s=tf('s'); % MATLABに変数sをラプラス変数として認識させる
Ps=Kt/(J*L*s^2 + J*R*s + Kt*Ke); % DCモータ伝達関数
Cs=tf(Kd*s^2 + Kp*s + Ki)/s; % PID制御器伝達関数
Gd=exp(-Td*s); % ムダ時間伝達関数
Gl=Ps*Cs*Gd; % 一巡伝達関数
[Gm,Pm]=margin(Gl); % 位相余裕・ゲイン余裕の算出
Gm=20*log10(Gm); % ゲイン余裕のdB換算
Gcl=Ps*Cs/(1+Gl); % 制御システム全体伝達関数
% ボード線図の描画
opts=bodeoptions; % ボード線図のオプション設定のためのおまじない
opts.FreqUnits='Hz'; % ボード線図の横軸単位をHzに指定(標準の横軸単位は[rad/s])
f=logspace(-2,4,1e5)*2*pi; % ボード線図の横軸データ
figure(1);
bode(Gl,f,opts); % 一巡伝達関数のボード線図
grid on;
xlim([10^-2,10^4]); % 横軸の表示範囲指定ちなみに、step関数を使えばMATLABだけでもシミュレーションできます。
しかし、その精度はSimulinkと比べて今一つです。
今回の記事中のシミュレーションにはSimulinkを使いました。
前回:基礎編(4)「PID制御」はこちら
次回:基礎編(6)「極と零点」はこちら
