外乱抑制について備忘録

3Dプリンタが使えないのでpython-controlで遊んでみました
Python Control Systems Library — Python Control Systems Library dev documentation
FF制御のみ,PIDによるFB制御のみ,FFとPIDを組み合わせた制御(FF+FB),外乱オブザーバーを追加した制御(FF+FB+EX)を比較
f:id:Libra23:20210612132251p:plain
外乱オブザーバーを追加した制御が収束が早く,外乱を抑制できている(ゲインは統一)
ソース
robot-ws/system.py at master · Libra23/robot-ws · GitHub

環境

macOS Big Sur : 11.4
Python : 3.9.5

  • control==0.9.0
  • matplotlib==3.4.2
  • numpy==1.20.3
  • PyYAML==5.4.1
  • scipy==1.6.3

外乱オブザーバーフィードバックによる外乱抑制

外乱オブザーバーとは

簡単に言うとプラントの出力から入力を推定して,実際の入力との差から外乱を推定する
外乱オブザーバの紹介 - Qiita

ブロック線図

フィードフォワード制御とPID制御に外乱オブザーバー補償を追加したコントローラでストップ応答を確認する
ブロック線図は下図
f:id:Libra23:20210612093145j:plain
パラメータ

  • R : 入力
  • Y : 出力
  • D : 外乱
  • D_est : 推定外乱
  • FF : フィードフォワードコントローラ
  • PID : PIDコントローラ
  • T : FFとPIDの出力
  • P : プラント
  • P_n^-1 : 逆プラントモデル
  • Q :フィルタ
  • F : フィルタ
外乱オブザーバーの伝達関数

TとDを入力,出力をYとなるように伝達関数を求める
推定外乱について
 D_{est} = Q(P_n^{-1}Y - (T - D_{est}))
 D_{est} = \frac{Q}{1 - Q}(P_n^{-1}Y - T)
出力について
 Y = P(T -  D_{est} + D)
上式を整理すると下記の伝達関数が得られる
 Y = \frac{P}{1 - Q + QPP_n^{-1}}T + \frac{P(1 - Q)}{1 - Q + QPP_n^{-1}}D
 PP_n^{-1} = 1が成り立つ時, Y = PT + P(1 - Q)Dであるから外乱と外乱推定値は下記式を満たす
 D_{est} =  \frac{Q}{1 - Q}(P_n^{-1}Y - T) = QD
以上より,外乱を推定できることが分かる

システムの伝達関数

f:id:Libra23:20210612131035j:plain
外乱オブザーバーの伝達関数を簡単のため係数A,Bを用いて示す
 A = \frac{P}{1 - Q + QPP_n^{-1}}, B = \frac{P(1 - Q)}{1 - Q + QPP_n^{-1}}
RとDを入力,出力をYとなるように伝達関数を求める
 Y \frac{A(FF + PID)}{1 + A PID}R + \frac{B}{1 + A PID}D
ただしF=1としている