機械系エンジニアの備忘録

20代独身社会人。仕事では機械・機構の研究開発を行っているエンジニアが、自分の専門分野ではないpythonを扱って楽しむブログです。

MENU

【python】【制御工学】pythonでPID制御

python-controlで、PID制御を行う

※2020/01/19追記:説明欄にPID制御とpythonでの書き方を追加しました。

1. はじめに

前々回、python-controlで伝達関数の設定とインパルス・ステップ・初期値応答を計算しました。また前回、状態フィードバック制御も行いました。

stjun.hatenablog.com

stjun.hatenablog.com

 今回はPID制御をやってみます。

本当はブロック線図を書くのが一番分かりやすいのですが、ブログに載せる方法が分からないので省略します。

※2020/01/16追記:時間があるときに更新しますので少々お待ちください。

※2020/01/19追記:説明欄にPID制御とpythonでの書き方を追加しました。

2020/01/26追記:プログラミング初心者に向けたpythonの勉強法と手順を記事にしました。

stjun.hatenablog.com

2. コード

from control.matlab import *
import matplotlib.pyplot as plt
import numpy as np

#伝達関数の設定

#PID制御のパラメータと積分・微分部分の伝達関数
Kp=12 #比例ゲイン
Ti=0.8 #積分ゲイン
Td=0.1 #微分ゲイン
num=[Td,1,1/Ti] den=[1,0] G_ID=tf(num,den) #制御対象の伝達関数 num = [0.1] den = [0.1, 1.0, 1] G = tf(num, den)
#フィードバック含めた全体の伝達関数
G_all=feedback(G_ID*Kp*G,1) #ステップ応答 (y_s,t_s)=step(G_all,T=np.arange(0,10,0.01)) (y_in,t_in)=step(1,T=np.arange(0,10,0.01)) #グラフの設定 fig=plt.figure(figsize=(10,8)) ax1=plt.subplot2grid((3,1),(0,0)) ax1.plot(t_s,y_s) ax1.plot(t_in,y_in,linestyle="dashed") ax1.set_ylim([0.0,1.2]) plt.style.use('ggplot') plt.show()

実行すると以下の画面がでてきます。

約6秒くらいで目標1で安定しており振動もしていないので、取りあえずはPIDの各ゲインの値は妥当なことがわかります。(立ち上がり時間を小さくしたい場合は別ですが...)

f:id:stjun:20200118231947p:plain

対して積分ゲインの値を変えたのが以下になります。
積分ゲインを小さくしているのでオーバーシュートしており、また振動しながら徐々に目標値に近づいているのがわかります。

f:id:stjun:20200118232253p:plain

■自分が使ってるお得情報の紹介

私は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で読んだ本を載せておきます。

難しいことはわかりませんが、お金の増やし方を教えてください!

難しいことはわかりませんが、お金の増やし方を教えてください!

  • 作者:山崎元,大橋弘祐
  • 出版社/メーカー: 文響社
  • 発売日: 2015/12/04
  • メディア: Kindle版
 
さおだけ屋はなぜ潰れないのか? 身近な疑問からはじめる会計学 (光文社新書)

さおだけ屋はなぜ潰れないのか? 身近な疑問からはじめる会計学 (光文社新書)

  • 作者:山田 真哉
  • 出版社/メーカー: 光文社
  • 発売日: 2005/02/16
  • メディア: 新書
 
多動力 (NewsPicks Book) (幻冬舎文庫)

多動力 (NewsPicks Book) (幻冬舎文庫)

  • 作者:堀江 貴文
  • 出版社/メーカー: 幻冬舎
  • 発売日: 2019/04/10
  • メディア: 文庫
 
「幸せをお金で買う」5つの授業 (中経出版)

「幸せをお金で買う」5つの授業 (中経出版)

 

 

■雑誌系

MONOQLO (モノクロ) 2020年 02月号 [雑誌]

MONOQLO (モノクロ) 2020年 02月号 [雑誌]

  • 作者:晋遊舎
  • 出版社/メーカー: 晋遊舎
  • 発売日: 2019/12/19
  • メディア: Kindle版
 
家電批評 2020年 1月号 [雑誌]

家電批評 2020年 1月号 [雑誌]

  • 作者: 
  • 出版社/メーカー: 晋遊舎
  • 発売日: 2019/12/03
  • メディア: Kindle版
 
ロードバイク完全メンテナンス (エイムック 3544 BiCYCLE CLUB別冊)

ロードバイク完全メンテナンス (エイムック 3544 BiCYCLE CLUB別冊)

  • 作者: 
  • 出版社/メーカー: エイ出版社
  • 発売日: 2016/11/29
  • メディア: ムック
 
繰り返し作りたくなる!  ラク弁当レシピ (エイムック 3680)

繰り返し作りたくなる! ラク弁当レシピ (エイムック 3680)

  • 作者:長谷川りえ
  • 出版社/メーカー: エイ出版社
  • 発売日: 2017/03/27
  • メディア: ムック
 
Tarzan(ターザン) 2020年1月23日号 No.779 [内臓脂肪 皮下脂肪すっきり落とす!] [雑誌]

Tarzan(ターザン) 2020年1月23日号 No.779 [内臓脂肪 皮下脂肪すっきり落とす!] [雑誌]

  • 作者: 
  • 出版社/メーカー: マガジンハウス
  • 発売日: 2020/01/04
  • メディア: Kindle版
 
DIME(ダイム) 2020年 03 月号 [雑誌]

DIME(ダイム) 2020年 03 月号 [雑誌]

  • 作者: 
  • 出版社/メーカー: 小学館
  • 発売日: 2019/12/16
  • メディア: 雑誌
 

 

3. PID制御の説明

3.1 PID制御のブロック線図

PID制御のブロック線図は下のように書かれます。

f:id:stjun:20200119214156j:plain

 ここでKpは比例(P)、Tiが積分(I)、Tdが微分(D)を表しPIDと言われます。

(※このブログでTiとTdをそれぞれ積分ゲイン、微分ゲインと呼んでいますが正確には積分時間と微分時間になります。ただ今回は分かりやすくするため比例ゲインに合わせて積分ゲイン、微分ゲインとしています)

 

3.2 G(s)の説明

コードのこの部分になります。

#制御対象の伝達関数
num = [0.1]
den = [0.1, 1.0, 1]
G = tf(num, den)

f:id:stjun:20200119214210j:plain

一番右の伝達関数G(s)は制御対象の伝達関数です。例えばモーターなどになります。

今回は仮の値としてG(s)=0.1/(0.1s^2+s+1)としました。

画像右側にpythonでの記述の仕方を書きました。

numは伝達関数の分子の係数、denは伝達関数の分母の係数であり、python-controlではtf(num,den)で伝達関数を定義できます。

 

3.3 積分微分部分の説明

コードのこの部分。

#PID制御のパラメータと積分・微分部分の伝達関数
Kp=12 #比例ゲイン
Ti=0.8 #積分ゲイン
Td=0.1 #微分ゲイン
num=[Td,1,1/Ti] den=[1,0] G_ID=tf(num,den)

f:id:stjun:20200119214223j:plain

まずオレンジで囲った積分・微分部分の合成伝達関数を求めます。

ここでポイントは並列部分は足し算というところです。

また右側にpythonでの記述方式を示しました。

積分・微分部分の合成伝達関数をGID(s)とおけば、次のブロック線図と等価になります。

f:id:stjun:20200119214243j:plain

 

3.3 全体の伝達関数の求め方

コードのこの部分。

#フィードバック含めた全体の伝達関数
G_all=feedback(G_ID*Kp*G,1)

f:id:stjun:20200119214257j:plain

ブロック線図の直列部分は掛け算になります。

またpythonではfeedback()と書けばフィードバック部分も加味して伝達関数を計算してくれます。

(※コードにはG_all=feedback(G_ID*Kp*G,1)とカッコの最後に1があります。公式HPを見ると-1だとネガティブフィードバック、1だとポジティブフィードバックと書いてあります。今回はネガティブフィードバック(出力側から入力側に戻る矢印の左上にあるマイナス記号のことです)なので-1だと思ったのですがどうにも変な挙動になり、逆に1だとmatlabの解析結果とも一致したので今回は1にしています。)

f:id:stjun:20200119214311j:plain

これで入力から出力までの合成伝達関数G_allが求まりました。

後はG_allを使ってステップ応答などを計算し、matplotlibでグラフ化すればOKです。

#ステップ応答 (y_s,t_s)=step(G_all,T=np.arange(0,10,0.01))

ステップ応答以外の入力やmatplotlibでのグラフ化のやり方は以下記事にあります。

stjun.hatenablog.com

stjun.hatenablog.com

 

■最後に

説明を付けようと思いましたがブロック線図が載せれないと難しいので止めました。

※2020/01/16追記:時間がある土日に更新しますので少々お待ちください。

※2020/01/26追記:PID制御をGUI化し、マウスクリックで色々試せるアプリを作りました。

stjun.hatenablog.com

stjun.hatenablog.com

stjun.hatenablog.com