ふみきりのぼうけん

電子工作、プログラミング、旅行、書籍紹介などの雑多なブログです。

外乱オブザーバ(伝達関数)のMatlab/Simulinkサンプルプログラム

はじめに

制御工学においてPIDが最もよく使われる制御器であります。そのときに外乱抑制やノミナル化についても同時によく議論されます。実際の製品については全く知識がないのでわからないのですが、アカデミックな論文を読むと外乱抑制のために”外乱オブザーバ”というものがよく使われます。
外乱オブザーバはその使い勝手の良さから多くの制御器と組み合わせて制御性能の向上のために使われます。

以下の参考書でも外乱オブザーバを様々な制御器と組み合わせた制御法が解説されています。

Disturbance Observer-Based Control: Methods and Applications

Disturbance Observer-Based Control: Methods and Applications


今回の記事では外乱オブザーバの簡単な解説とMatlab/Simulinkでのシンプルなシミュレーションプログラムを紹介します。

外乱オブザーバとは

外乱オブザーバはシステム同定によって入手できるプラントのノミナルモデルと実際のプラントの出力の差に逆システムを通すことで入力されている外乱を推定できるオブザーバ(状態観測器)です。
PID制御器などを設計する際、応答の速度と外乱の影響というトレードオフの関係から試行錯誤的にゲインをチューニングしていきますが、外乱オブザーバを用いると外乱や非線形摩擦などのモデル街要素を排除しながら制御性能をあげることができるのです。
f:id:fumikirinobouken:20181004124449p:plain

色のついた部分が伝達関数で表記した代表的な外乱オブザーバのブロック線図になります。

図中の表記の意味は下記のようになっています。
P(s) : 実際のプラント
Pn(s) : プラントのノミナルモデル
F(s) : ノミナルモデルをプロパーにするローパスフィルタ
dis : 入力される低周波外乱

uが入力され、P(s)=Pn(s)だった場合、これらの差は0となり、フィードバックは発生しません。しかし、外乱が存在する場合、差が発生します。この差をノミナルモデルの逆システムに入力すると入力されている外乱を求めることができます。しかし、理論的に厳密な逆システムは定義することができず、伝達関数はプロパーでなければいけないため、逆システムの分子の字数より分母の次数が高くなるようにローパスフィルタなどのフィルタを挿入して対応します。

Matlab/Simulinkサンプルプログラム

 
close all
clc

% Nominal plant
plant = tf(1,[0.01 1])

% Low pass filter for disturbance observer
w = 100 ; % [rad/s]
lpf = tf(1,[1/w 1])*tf(1,[1/w 1])

% Disturbance observer
do = tf(plant.den{1},plant.num{1})*lpf

% Plant with parameter variation
plantWithVar = plant*1/1.5

% Simulation for evaluation to disturbance
sim('evaluateDis')

figure
plot(t,out1,'g','LineWidth',2.5) 
grid on
hold on
plot(t,out2,'r')
plot(t,out3,'b')
xlabel('Time [s]')
set(gca,'Box','on','FontSize',15,...
        'XGrid','on','YGrid','on','FontName','Century','FontWeight','bold');
legend('Nominal', 'w/o do', 'w/ do')


% Simulation for evaluation to parameter variation
sim('evaluateParamVar')

figure
plot(t,out4,'g','LineWidth',2.5)
grid on
hold on
plot(t,out5,'r')
plot(t,out6,'b')
xlabel('Time [s]')
set(gca,'Box','on','FontSize',15,...
        'XGrid','on','YGrid','on','FontName','Century','FontWeight','bold');
legend('Nominal', 'w/o do', 'w/ do')
ylim([0 1.2])


外乱応答評価のためのSimulinkブロック線図
f:id:fumikirinobouken:20181004125634p:plain

パラメータ変動評価のためのSimulinkブロック線図
f:id:fumikirinobouken:20181004125702p:plain

シミュレーション結果


外乱応答のシミュレーション
f:id:fumikirinobouken:20181004125446p:plain

パラメータ変動のシミュレーション
f:id:fumikirinobouken:20181004125601p:plain


外乱・パラメータ変動ともに外乱オブザーバ(DO/do)を挿入したほうがよりノミナルモデルに近い応答になっています。

ここだけみると外乱オブザーバも万能に見えますが、他のオブザーバも然り、チューニングや現実での限界はどのようなものになるのか?ということが問題になっています。

ブロック線図を表示するときにdisをわざわざ低周波外乱ことからわかるように、この外乱オブザーバの帯域は逆システムを構築するときのローパスフィルタの時定数に依存します。今回は100[rad/s]とフィルタを設定しているため、100[rad/s]までの応答がノミナル化されるようになっています。つまり、ローパスフィルタ以上の帯域の外乱やパラメータ変動の補償はできません。

じゃあどれくらい帯域を上げられるのか・・・というのはもちろんフィルタの設計や機械系のガタ等の影響にもよるのですが、私が今まで経験したのはせいぜい20~30Hz程度が限界でした。それでも帯域を上げすぎると推定値にノイズがのって不安定化したり騒音の原因になります。
静止摩擦やクーロン摩擦を低減するための、定常偏差の補償くらいにイメージしておくのがいいのかなって感じです。

タイトルにも伝達関数と書いてありますが、外乱オブザーバはいろいろな設計の方法があるので、今後も紹介していけたらと思います。


これらのシミュレーションコードはGitHubリポジトリに公開しています。
同一ディレクトリにすべてのファイルを起き、.matファイルを実行すると上記の結果が出るようになっています。
github.com