python-controlで、PID制御を行う
※2020/01/19追記:説明欄にPID制御とpythonでの書き方を追加しました。
1. はじめに
前々回、python-controlで伝達関数の設定とインパルス・ステップ・初期値応答を計算しました。また前回、状態フィードバック制御も行いました。
今回はPID制御をやってみます。
本当はブロック線図を書くのが一番分かりやすいのですが、ブログに載せる方法が分からないので省略します。
※2020/01/16追記:時間があるときに更新しますので少々お待ちください。
※2020/01/19追記:説明欄にPID制御とpythonでの書き方を追加しました。
2020/01/26追記:プログラミング初心者に向けたpythonの勉強法と手順を記事にしました。
2. コード
実行すると以下の画面がでてきます。
約6秒くらいで目標1で安定しており振動もしていないので、取りあえずはPIDの各ゲインの値は妥当なことがわかります。(立ち上がり時間を小さくしたい場合は別ですが...)
対して積分ゲインの値を変えたのが以下になります。
積分ゲインを小さくしているのでオーバーシュートしており、また振動しながら徐々に目標値に近づいているのがわかります。
■自分が使ってるお得情報の紹介
私はAmazon kindle unlimitedというサービスを1年以上利用しています。
これは月額980円で 和書12万冊以上の電子書籍を読めるサービスです。
ビジネス本、雑誌、漫画、技術本など様々な本を読むことができます。10冊まで端末にダウンロードできるのでネット環境がなくても(オフラインでも)見れます。
なおkindle unlimitedは最初の30日間無料のため、気軽に登録してみて、あまり読みたい本が無ければすぐに解約しても問題ありません。
それか30日内に気になる本を全て読破すれば実質タダです。
ぜひ気になった方はチェックしてみて下さい。
なおkindleにない本等を買う時はamazonギフト券(amazonで使えるポイント)を買い、ポイントで数冊まとめて買った方がお得です。
ギフト券(ポイント)は買ったら10年も有効で、ポイントが付きます。さらに本をまとめ買い(2冊以上同時に)買うと、ポイントがもらえます。
(https://www.amazon.co.jp/b?ie=UTF8&node=5431437051)
学生さんであればkindle unlimitedよりも年2450円(月210円程度)で映画見放題、音楽聞き放題、本読み放題の「prime student」がおすすめです。
以下に私がkindle unlimitedで読んだ本を載せておきます。
■雑誌系
3. PID制御の説明
3.1 PID制御のブロック線図
PID制御のブロック線図は下のように書かれます。
ここでKpは比例(P)、Tiが積分(I)、Tdが微分(D)を表しPIDと言われます。
(※このブログでTiとTdをそれぞれ積分ゲイン、微分ゲインと呼んでいますが正確には積分時間と微分時間になります。ただ今回は分かりやすくするため比例ゲインに合わせて積分ゲイン、微分ゲインとしています)
3.2 G(s)の説明
コードのこの部分になります。
一番右の伝達関数G(s)は制御対象の伝達関数です。例えばモーターなどになります。
今回は仮の値としてG(s)=0.1/(0.1s^2+s+1)としました。
画像右側にpythonでの記述の仕方を書きました。
numは伝達関数の分子の係数、denは伝達関数の分母の係数であり、python-controlではtf(num,den)で伝達関数を定義できます。
コードのこの部分。
まずオレンジで囲った積分・微分部分の合成伝達関数を求めます。
ここでポイントは並列部分は足し算というところです。
また右側にpythonでの記述方式を示しました。
積分・微分部分の合成伝達関数をGID(s)とおけば、次のブロック線図と等価になります。
3.3 全体の伝達関数の求め方
コードのこの部分。
ブロック線図の直列部分は掛け算になります。
またpythonではfeedback()と書けばフィードバック部分も加味して伝達関数を計算してくれます。
(※コードにはG_all=feedback(G_ID*Kp*G,1)とカッコの最後に1があります。公式HPを見ると-1だとネガティブフィードバック、1だとポジティブフィードバックと書いてあります。今回はネガティブフィードバック(出力側から入力側に戻る矢印の左上にあるマイナス記号のことです)なので-1だと思ったのですがどうにも変な挙動になり、逆に1だとmatlabの解析結果とも一致したので今回は1にしています。)
これで入力から出力までの合成伝達関数G_allが求まりました。
後はG_allを使ってステップ応答などを計算し、matplotlibでグラフ化すればOKです。
ステップ応答以外の入力やmatplotlibでのグラフ化のやり方は以下記事にあります。
■最後に
説明を付けようと思いましたがブロック線図が載せれないと難しいので止めました。
※2020/01/16追記:時間がある土日に更新しますので少々お待ちください。
※2020/01/26追記:PID制御をGUI化し、マウスクリックで色々試せるアプリを作りました。