シンプルな外乱オブザーバ

目次

はじめに

外乱オブザーバ(Disturbance observer; DOB)はフィードバックシステムに外乱が加わるような状況で比較的簡単に外乱を除去し安定化できる強力なツールですが,ウェブにはあまり記述が無いようだったので書いてみました.

外乱オブザーバとは?

“外乱”でググってみると,以下のような説明が得られます.

ある通信系に、所定の信号系以外から加わり妨害となる信号。 --- 大辞林

大体内容としては間違いないですが,今回扱うのは”通信系”に限らず制御システムに対してはたらく妨害となる信号くらいに留めておきます.

外乱オブザーバとはこのような外乱を除去するために,制御系のコントローラに組み込む補償器のひとつです.

なぜ外乱オブザーバが必要なのか

次のような1次遅れ系のフィードバックループを考えてみます.

f:id:blockahead:20180128101528p:plain

ここで, C(s)はコントローラ, G(s)は制御対象です.また,目標値を r,出力を yで表します.

外乱というと図の1,2,3番の箇所に加わることが想定されますが,ここでは1について記述します.

2,3番を省く理由としては以下になります.

  • 2番の部分に入力される外乱は,フィードバックループを構成する主な目的のひとつであるため,比較的簡単に除去(補償)できる.
  • 3番については,システム自体は目標通り動作している(外乱によって私たち使用者が目標値通りに動いているか確認できないだけの状態)のため.

1番はコントローラは制御対象を最適に動作させるための操作量を正常に生成できているが,それが外乱によって変えられ制御対象に入力されてしまっている状態です.

つまり,PIDなどのコントローラを適切に設計していても,設計通りの操作量が制御対象に入力されないということです.

今回はこの外乱を除去する外乱オブザーバについて述べていきます.

ここでは,"最適な操作量"は設計時に想定している操作量を指します.
最適レギュレータなどの最適とは根本的に異なる意味ですのであしからず.

 

簡単な外乱オブザーバの動作原理

外乱の除去

上述のように,外乱が1番の部分に入力される場合,ブロック図は以下のようになります.

f:id:blockahead:20180128102328p:plain

このとき,制御対象の出力 yは以下となります.

\begin{align}
y = ( u + d ) G(s)
\end{align}

このように,コントローラによって計算された最適な入力が外乱 dによって変えられてしまいます.

これによって,システムが上手く制御できないということが稀にあります.

たとえば,モータを電流制御のため,モータドライバを使った場合,入力の電圧信号に対して電流にオフセットが出ることがあります.

この場合も,入力側の外乱が発生しているのと同じ意味となります.

 そこで,コントローラで生成された操作量から,あらかじめ外乱 dを引いておけば入力側外乱の影響を除去することができます.

これを図で表すと以下のようになります.

f:id:blockahead:20180128102611p:plain

この時の出力は以下のとおりです.

\begin{align}
y &= ( u + d - d ) G(s) \\
&= uG(s)
\end{align}

非常に当たり前の話ですが,外乱 dがわかっていればこれだけで外乱を除去できます.

問題は,どうやって外乱を推定するのかということです.

外乱が完全に推定できるなら,フィードバック制御なんてものは必要ないはずです.

外乱の推定

コントローラは外乱より先にあるため外乱がどのようなものか推定することはできませんが,出力 y側では外乱の影響を受けたあとの出力となっています.

ここから推定できそうです.

上述のとおり,外乱の影響を受けたシステムの出力は以下の式で表すことができます.

\begin{align}
y = ( u + d ) G(s)
\end{align}

ですので,制御対象 G(s)の逆システム G(s)^{-1}が存在すれば,両辺にこれを掛けることで以下の関係が成り立ちそうです.

\begin{align}
yG(s)^{-1} &= u + d \\
yG(s)^{-1} - u &= \hat{d}
\end{align}

これで外乱を推定することができそうです.

ここで \hat{d}は推定外乱で,ハットをつけています.

これをブロック線図で以下のように表すことができます.

f:id:blockahead:20180128112718p:plain

ここから,赤円で示す部分の推定外乱は次のように得られます.

\begin{align}
\hat{d} &= yG(s)^{-1} - ( u - \hat{d} )
\end{align}

ただし,外乱オブザーバへの入力 uは自身の推定値 \hat{d}を含んで u-\hat{d}となっていることに注意が必要です.

また,コントローラによって生成された操作量 uは推定外乱と外乱を受けて u−\hat{d}+dとなるため,システムの出力 yは以下となります.

\begin{align}
y = ( u - \hat{d} + d ) G(s)
\end{align}

システムの出力の式を推定外乱の式に代入すると,以下の結果が得られます.

\begin{align}
\hat{d} = ( u - \hat{d} + d ) G(s) G(s)^{-1} - ( u - \hat{d} )
\end{align}

ここで制御対象 G(s)とその逆システム G(s)^{-1}の積 G(s) G(s)^{-1}=1とすると,以下の関係が成り立ちます.

\begin{align}
\hat{d} = d
\end{align}

外乱オブザーバではこのような原理によって,外乱を推定し除去することができます.

実際の外乱オブザーバ

ノミナルモデル

これまでは,制御対象の逆システム G(s)^{-1}が得られるという条件で導出を行ってきました.しかし実際には制御対象の逆の応答をするようなシステムを得ることはできません

このため,プログラム上で制御対象の伝達函数 G_{M}(s)を生成し使用します.

このような伝達函数ノミナルモデル(Nominal model)と呼び,ノミナルモデルを利用した制御方式をモデル規範型制御と呼んだりもするようです.

たとえば制御対象 G(s)が1次遅れ系に近似できそうな場合には,以下のような伝達函数をノミナルモデルとして利用します.

 \begin{align} G_{M}(s) = \frac{1}{\tau s + 1 } \end{align}

次にこれの逆システム G_{M}(s)^{-1}を以下のように定義します.

 \begin{align} G_{M}(s)^{-1} = \tau s + 1 \end{align}

 基本的には外乱オブザーバを使用する際は,このようにノミナルモデル G_{M}(s)^{-1}を導出し使用する流れとなります.

外乱オブザーバのメリット・デメリット

メリット
  • 除去の比較的困難な入力側の外乱を除去できる.
  • 制御対象とノミナルモデルとのモデル化誤差も補償できる.
  • 能動的に外乱を除去するため,外乱入力からの反応が速い.
デメリット
  • ノミナルモデルを導出する必要がある.
  • 実用上はローパスフィルタを併用する必要がある.

モデル化誤差については,制御対象とノミナルモデルの特性が少し違っていても安定に動作するという意味です.

それなりに1次遅れっぽい応答をするな,というような制御対象でも1次遅れで近似してパラメータを決めてやると大体の場合,上手く動作します.

また,他の外乱除去手法では過去の誤差から外挿によって外乱を除去する方法がありますが,このような手法に比べて反応が速く使い勝手がよいです.
反対に,制御対象の反応を見ながらチューニングし,ブラックボックスをそのまま制御できるPIDなどにおいては,わざわざ制御対象のモデル化をしなければならないという圧倒的なデメリットが有ります.

しかしこれについては,近年ではPIDでも制御対象をモデル化し,シミュレーションをしながらパラメータを決定する場合が多くありますし,そもそも制御に内部モデルを使用するモデル規範型の制御も増えてきています.
このような場合には,モデルをそのまま使えば良いのでほとんど面倒はないです.

最後のローパスフィルタとの併用が一番の面倒で,実用上はフィルタの設計とパラメータのチューニングが必須になってきます.

 ローパスフィルタの設計

外乱オブザーバを使用する上で気をつけたいのがフィルタの設計です.
逆システムの式を見てわかるように微分項が含まれています.

微分動作は基本的に不安定な要素のため,これを避けるためにローパスフィルタを使用します.

使いやすいところだとButterworthのフィルタがあります.
カットオフ周波数を \omega_{c}とすると,フィルタの伝達関数 F(s)は以下となります.

\begin{align}
F(s) = \frac{ { \omega_{c} }^{2} }{ s^{2} + \sqrt{2} \omega_{c} s + { \omega_{c} }^{2} }
\end{align}

これを推定外乱 \hat{d}にかけたものをよく見ますが,これではやはり微分器が必要となってきます.

ここでは微分機を使いたくないので,ローパスフィルタを分割して以下のように配置します.

f:id:blockahead:20180128115121p:plain

すると出力側からの項が次のように書き換えられ,微分要素を排除することができます.

 \begin{align} F(s) G_{M}(s) = \frac{ { \omega_{c} }^{2} \tau s + { \omega_{c} }^{2} }{ s^{2} + \sqrt{2} \omega_{c} s + { \omega_{c} }^{2} } \end{align}

このように分母次数より分子の次数の方が小さくなったため, F(s) G_{M}(s)^{-1}は安定に(というと語弊がありそうですが)動作します.

MATLAB/Simulinkでシミュレーションする際には,逆システムをそのまま伝達関数としては使えないためこのような方法を使うことになります.

実際のフィルタのカットオフ周波数については \omega_{c} =\sim5Hzくらいに設定することが多いのではないかと.

これは実際のプロセスで検証しつつ決定します.

今回,フィルタは2次のButterworthフィルタを使っていますが,実際にはなんでも良いです.

Butterworthフィルタはリップルがないため,特定の周波数帯で共振したりということがなく使いやすいのでほとんどこれしか使ったことありません.

 シミュレーション

コントローラをPID,制御対象を1次遅れ系としたときの動作は以下のようになります.

制御対象の時定数を 0.1s,外乱オブザーバ用フィルタのカットオフ周波数は 10Hzに設定しています.

f:id:blockahead:20180128120732p:plain

この図では 3sに入力側外乱, 5sに出力側外乱を与えています.

このように外乱オブザーバを使うことで強力に外乱を除去できることがわかるかと思います.