syuntoku14の進捗

進捗を書きなぐります

剣道で学ぶ根軌跡でのPID設計

 

はじめに

こんにちは。syuntoku14です。現在カリフォルニア大学デイビス校で留学中です。日本に帰ったらよろしくね。

今回は、根軌跡を用いたPID制御器の設計を復習していきます。記事としてまとめる理由は、

  1. PID制御でググると色々な記事が出てくるものの、あまり根軌跡を用いたものが見受けられなかったため
  2. 今までガバガバだった古典制御の知識がようやくまともになったので
  3. 特に書くことがなかったので

などです。

僕は強いエンジニアの皆さんと違い、小さい頃からの回路やプログラミングの経験がありません。小さい頃からやっていることなんて剣道くらいです。なので、今回は剣道を例にしてPID制御器を設計してみましょう。

前提

おつま君とぴたむら君は大学の剣道部に所属しています。来る段審査のため、二人は練習に励んでいます。段審査では、木刀を相手の頭の上ギリギリで止めるような一太刀が求めらており(以降面打ちと呼びます)、二人はこの面打ちを練習しています。

ぴたむら君は面打ちが苦手で、なんどやっても面打ちは頭の上ギリギリで止まらず、おつま君の頭を叩いてしまうか、上すぎる位置で止まってしまいます。

このままでは段審査に落ちてしまうので、二人は制御工学を用いてこの問題を解決することにしました。二人の専攻は幸いにも制御工学だったので、こんなこと朝飯前です。

制御対象について

目標は振りかぶった木刀をおつま君の頭の上ギリギリで止めることです。

簡単のため、以下のように木刀はぴたむら君の肩から直接生えているようなモデルを考えます。さらに、ぴたむら君の肩にはDCモーターが直接埋め込まれていると仮定し、モーターへの入力\(E\) によって90°からの角度\(\theta\)を制御することを考えましょう。

頭の上ギリギリで止めることを、ここでは、90°振りかぶり、おつま君の頭の上から5°の地点まで振り下ろすこととします。

f:id:syuntoku14:20181213140348j:plain



本来ならば入力から出力までの伝達関数を同定しなければならないですが、長くなるので割愛し、剣道部の監督によって教えてもらったこととします。監督曰く、入力\(E\)から出力\(\theta\)までの伝達関数\(G(s)\)

\[G(s)=\frac{\Theta(s)}{E(s)}=\frac{(s+6)}{(s+2)(s+3)(s+5)}\]

で与えられます。これを開ループ伝達関数とし、以下のようなフィードバック制御システムを考えます。

f:id:syuntoku14:20181213140422j:plain

P制御器設計

まず、P制御、つまりゲインKを調整して、いい感じの出力を出すことについて考えてみましょう。おつま君の頭を叩いてはいけないので、目標角度である85°より5°以上振り下ろしてはいけません。そこで、出力のオーバーシュート率(%OS)を5%とすれば、出力は最大で89.3°となります。

少しギリギリなので、ここでは%OS=4.3%となるよう、減衰率\(\zeta=0.707\)として設計していきます。(システムが二次システムの場合、%OSは\(\%OS=\exp(\frac{-\zeta\pi}{\sqrt(1-\zeta^2)}\)で表されるため、減衰率と%OSは一対一に対応します。伝達関数\(G(S)\)は二次システムではありませんが、条件を満たした場合二次システムと近似できます(条件は以下で考えます))

まず、\(\zeta=0.707\)となるようなゲインKを根軌跡から探してみます。

システムが二次システムである場合、減衰率を指定する直線は根軌跡上で\(\cos{\theta}=\zeta\)によって表されます。

おつま君はMatlabを使い、\(G(s)\)の根軌跡と\(\zeta=0.707\)の交点を求めました。

f:id:syuntoku14:20181213140633p:plain

Matlabによって求めた結果によると、\(\zeta=0.707\)のときの閉ループの根は

\[s=-2.32\pm j2.3,\; -5.36\] であり、この時のゲインKは\(K=4.55\)でした。

ここで、極の一つである\(s=-5.36\)を零点の\(s=-6\)と近いとみなし、打ち消し合うと仮定します。そうすると本システムは二次システムと近似することができます。

この時点で、%OSを約5%とするゲインKの設計が終わりました。つまり、ゲインKを4.55とし、開ループの伝達関数

\[G(s)=\frac{4.55(s+6)}{(s+2)(s+3)(s+5)}\] とすれば、出力の%OSが理論上は約5%となります。実際にMatlabでstep応答をシミュレーションしてみると、下図のような出力となり、\(\%OS=3.96\%\)でまあ良いんじゃないでしょうか。

f:id:syuntoku14:20181213141054p:plain



PD制御器設計

さて、P制御器の設計が終わり、あとはぴたむら君の肩にゲインKを実現するオペアンプによる増幅回路を繋げれば、ぴたむら君は無事\(\zeta=0.707\)となる出力を達成出来そうです。

しかし、注意深いおつま君はこのままでは段審査に受からないことに気がついてしまいました。段審査では、振り下ろす速度も見られるのです。

先ほど求めたstep応答を見てみると、Settling Time \(T_s\)、つまり出力が定常状態に落ち着くまでにかかる時間が1.84秒もかかっています。段審査ではこれが1秒以内でないと落ちることに気がついたおつま君は、PD制御器によってこれを解決することにしました。

\(T_s\)が1秒以内であれば良いので、\(T_s=0.86\)となるような制御器を設計してみましょう。

二次システム\(\frac{\omega_n^2}{s^2+2\zeta\omega_n+\omega_n^2}\)に対し、Settling Time\(T_s\)\(T_s=\frac{4}{\omega_n\zeta}\)で表されることから、\(\zeta=0.707\)かつ\(T_s=0.86\)を実現する閉ループの根は、次図における黒垂直線と黒斜線の交点、\(s=-4.65\pm j4.65\)となります。

f:id:syuntoku14:20181213140913p:plain

この時点で、根軌跡が交点を通っていないことから、いくらゲインKを変化させても、\(\zeta=0.707\)かつ\(T_s=0.86\)となるような出力は得られません。この出力を得るためには、根軌跡そのものを変えなければなりません。

根軌跡そのものを変えるため、おつま君はシステムにPD制御器\(K(s+\sigma)\)追加することにしました。軌跡上の点は、開ループ伝達関数\(G(s)\)に対し、以下の式を満たします。

\[\angle G(s)=\angle \frac{K(s+\sigma)(s+6)}{(s+2)(s+3)(s+5)}=(2k+1)180\degree\]

この式を用いると、以下の図における\(s=-4.65+j4.65\)\(s=-\sigma\)の角度を求めることが出来ます。

f:id:syuntoku14:20181213140958j:plain

上図に置いて\(\theta_\sigma=61\degree\)であることから、\(\sigma=7.21\)です。

よって、\(G(s)\)\((s+7.21)\)を追加した新しい開ループ伝達関数\(G'(s)\)の根軌跡は\(s=-4.65+j4.65\)を通ることになります。

\[G'(s)=\frac{K(s+7.21)(s+6)}{(s+2)(s+3)(s+5)}\]

\(s=-4.65+j4.65\)を通る時のゲインKは

\[K=\frac{1}{|G'(-4.65+j4.65)|}=4.79\]

で求まります。

最終的に、PD制御器は\(4.79(s+7.21)\)となりました。試しにこれを追加したシステムのstep応答をmatlabで見てみると、以下のようになります。

f:id:syuntoku14:20181213141117p:plain

PD制御をした場合のSettling timeは0.78秒程度となり、改善されていることがわかります。

しかし、どうやら%OSが増えてしまっているようです。理論的な設計とのずれの原因は諸々の近似などもありますが、s+7.21を追加したことで、補償されたシステムは二次システム近似が妥当とならないことも原因のひとつです。レポートに書いておきましょう。

PID制御器設計

ようやく審査に受かると思ったぴたむら君ですが、残念、まだ受かりません。よく見ると、step応答の定常値と目標値の間に誤差(定常偏差)が存在しています。つまり、ぴたむら君の剣は最終的に85°に至らず、約75°で止まってしまうことになります。

ぴたむら君は賢いので、PI制御器を追加してこれを解決することにしました。

目標は定常偏差を0にすることです。最終値の定理より、step応答に対する定常偏差\(e_{step}(\infty)\)は、以下の式で表されます。

\[e_{step}(\infty)=\lim_{s\to 0}{\frac{1}{1+G(s)}}\]

このことから、\(e_{step}(\infty)\)が0になるには、\(G(s)\)\(s\to0\)で無限大に吹き飛べば良いことがわかります。つまり、\(G(s)\)が分母にsを持てば良いのです。

単純なぴたむら君は積分器sを先ほど求めた\(G'(s)\)の分母に追加しようとしましたが、おつま君に止められてしまいました。なぜなら、極\(s=0\)を開ループ伝達関数に追加してしまうと、根軌跡が変わってしまい、先ほど設計した\(\zeta=0.707\)かつ\(T_s=0.86\)が大きく変わってしまうからです。

これを防ぐためには、極\(s=0\)の近くに零点\(s=0.1\)を配置し、互いに打ち消し合えば、理論的には軌跡はほとんど変わらず、システムの特性もほとんど変わらないはずです。

よって、最終的なPID制御器は、

\[\frac{K(s+7.21)(s+0.1)}{s}\]

となるんですが、これだと上手く行きません。以下の出力を見ればわかるんですが、これでは、実はs=0付近の閉ループ極の影響が大きすぎ、\(T_s\)が非常に遅くなります。何故これが生じるかというと、ゲインKが約4.5と非常に小さく、閉ループ極が十分s=0.1に近くないためです。

 

解決策としては、①ゲインKを大きくする ②零点の位置を変える

の二つがあります。①はシステムの応答特性を大きく変えてしまうので、零点の位置を変えることで解決しましょう。

f:id:syuntoku14:20181213140524p:plain

最終的に、おつま君はMatlabを使って、零点の位置をいい感じに調節し、零点が\(s=-1.22\)の時に応答がいい感じになることを見つけました。

f:id:syuntoku14:20181213140554p:plain



めでたくそれっぽいPID制御器の設計が出来たぴたむら君でしたが段審査には残念ながら落ちてしまったのでした(悲しいね)。

終わりに

この方法はシステムが二次近似できる時のみ使うことができます。学部時代の期末テストなどはこれが分かってればある程度点数取れるんじゃないですかね(適当)

急いで書いたのでなんか間違ってるかもしれません。ごめんなさい。

その他のPIDゲインの調節方法全然知らないので頑張っていこうと思います。アドベントカレンダー遅れてすいませんでした。