多入力多出力システムのPredictive Functional Control

目次

 はじめに

以前,Predictive Functional Control(PFC)についての記事を書きましたが,
あくまで単入力単出力(Single input single output; SISO)システムについてのみでした.

これを多入力多出力(Multi input multi output; MIMO)システムに拡張することが今回の目的です.

hamachannel.hatenablog.com

PFCの基礎に関する文献は考案者であるJ. Richaletの文献が詳しいです.

 翻訳書もあったようなのですが,現在では絶版しています.

Predictive Functional Control: Principles and Industrial Applications (Advances in Industrial Control)

Predictive Functional Control: Principles and Industrial Applications (Advances in Industrial Control)

 

 基本的な概念は通常のモデル予測制御(Model predictive control; MPC)と同じですので,MPCを知っているとMIMOシステムへの拡張は容易です.

 

 MIMOシステムのPFC

SISOシステムでのPFC

以前の記事で述べたとおり,PFCではシステムの応答 yを自由応答と強制応答に分解します.

右辺第1項が自由応答,右辺第2項が強制応答です.

\begin{align}
\left[ \begin{array}{c}
y(k+h_{1}) \\
y(k+h_{2}) \\
y(k+h_{3})
\end{array} \right] = \left[ \begin{array}{c}
CA^{h_{1}} \\
CA^{h_{2}} \\
CA^{h_{3}}
\end{array} \right] x(k) + \left[ \begin{array}{ccc}
G_{0}(h_{1}) & G_{1}(h_{1}) & G_{2}(h_{1}) \\
G_{0}(h_{2}) & G_{1}(h_{2}) & G_{2}(h_{2}) \\
G_{0}(h_{3}) & G_{1}(h_{3}) & G_{2}(h_{3})
\end{array} \right] \left[ \begin{array}{c}
\mu_{0} \\
\mu_{1} \\
\mu_{2}
\end{array} \right]
\end{align}

ここで, A,  Cはシステムの状態方程式表現での係数行列, h_{n}は予測ホライズン上の一致点(参照点), \mu_{k}は基底函数(Basis function)で操作量を表します.

Basis functionにおいて, \mu_{0} \mu_{1} \mu_{2}はそれぞれステップ,ランプ,パラボラ入力を表します.

また G_{k}(h_{n})は,操作量 \mu_{k}を与えたときの一致点 h_{n}時点でのプラント出力を表します.

 

たとえば, h = [ 10, 20, 30 ]^{T} とすると, G_{0}(h_{2})は「ゼロ状態からステップ入力を与えた際の20サンプル先のシステム出力」を表します.

 

PFCの文献の多くはシステムを伝達函数で表現していますが,このような状態方程式ベースで書いておくと拡張は容易です.

MIMOシステムへの拡張

MIMOシステムへの拡張は簡単で,2入力2出力システムの場合は自由応答と強制応答を以下のように(文字通り)拡張するだけです.

\begin{align}
\left[ \begin{array}{c}
y_{1}(k+h_{1}) \\
y_{2}(k+h_{1}) \\
y_{1}(k+h_{2}) \\
y_{2}(k+h_{2}) \\
y_{1}(k+h_{3}) \\
y_{2}(k+h_{3})
\end{array} \right] &= \left[ \begin{array}{c}
CA^{h_{1}} \\
CA^{h_{2}} \\
CA^{h_{3}}
\end{array} \right] x(k) \\
& + \left[ \begin{array}{cccccc}
G_{110}(h_{1}) & G_{120}(h_{1}) & G_{111}(h_{1}) & G_{121}(h_{1}) & G_{112}(h_{1}) & G_{122}(h_{1}) \\
G_{210}(h_{1}) & G_{220}(h_{1}) & G_{211}(h_{1}) & G_{221}(h_{1}) & G_{212}(h_{1}) & G_{222}(h_{1}) \\
G_{110}(h_{2}) & G_{120}(h_{2}) & G_{111}(h_{2}) & G_{121}(h_{2}) & G_{112}(h_{2}) & G_{122}(h_{2}) \\
G_{210}(h_{2}) & G_{220}(h_{2}) & G_{211}(h_{2}) & G_{221}(h_{2}) & G_{212}(h_{2}) & G_{222}(h_{2}) \\
G_{110}(h_{3}) & G_{120}(h_{3}) & G_{111}(h_{3}) & G_{121}(h_{3}) & G_{112}(h_{3}) & G_{122}(h_{3}) \\
G_{210}(h_{3}) & G_{220}(h_{3}) & G_{211}(h_{3}) & G_{221}(h_{3}) & G_{212}(h_{3}) & G_{222}(h_{3}) \\
\end{array} \right] \left[ \begin{array}{c}
\mu_{10} \\
\mu_{20} \\
\mu_{11} \\
\mu_{21} \\
\mu_{12} \\
\mu_{22}
\end{array} \right]
\end{align}

ここで y_{i}はシステムの i番目の出力, \mu_{jk}はシステムの j番目の操作量を表します.

 

たとえば先で述べた一致点 hを利用すると, G_{120}(h_{2})は「ゼロ状態からシステムの2番めの入力としてステップ入力を与えた際の,20サンプル先でのシステムの1番目の出力」となります.(いわゆる干渉項です)

より単純な例として,一致点 hを1点,basis functionをステップ \mu_{j0}のみとした場合には以下のような式が得られます.
左上の 2 \times 2要素のみが残るようなイメージです.

\begin{align}
\left[ \begin{array}{c}
y_{1}(k+h) \\
y_{2}(k+h) \\
\end{array} \right] = \left[ \begin{array}{c}
CA^{h} \\
\end{array} \right] x(k) + \left[ \begin{array}{cc}
G_{110}(h) & G_{120}(h) \\
G_{210}(h) & G_{220}(h) 
\end{array} \right] \left[ \begin{array}{c}
\mu_{10} \\
\mu_{20} \\
\end{array} \right]
\end{align}

 

Basis functionの次数を1にしたときの2入力2出力システムの強制応答 G_{ijk}(h_{n})は下図のようになります.

サンプリング周期 Ts = 1s,一致点は h = [ 10, 15, 30 ]^{T} の3点を想定しています.

f:id:blockahead:20180728192443p:plain

 

実際には一致点は立ち上がりの範囲で取ることが多く,この例だと最大でも h = [ 2, 3, 6 ]^{T}くらいかと思います.

これらの強制応答は,シミュレーションによって得ることもできますし,以下のように畳み込みで解析的に求めることもできます.

\begin{align}
G_{*20}(h_{2}) =\left[ \begin{array}{cccccc}
CA^{h_{2}-1}B & CA^{h_{2}-2}B & \cdots & CA^{2}B & CAB & CB
\end{array} \right] \left[ \begin{array}{c}
\left[ \begin{array}{c}
0 \\
1
\end{array} \right] \\
\left[ \begin{array}{c}
0 \\
1
\end{array} \right] \\
\vdots \\
\left[ \begin{array}{c}
0 \\
1
\end{array} \right]
\end{array} \right]
\end{align}

 

通常のMPCでは右辺の横長の行列をさらに縦に並べたToeplitz行列を保持しますが,PFCでは畳み込まれたあとの結果だけでよいため,メモリの使用量と計算負荷が小さいという特徴があります.

対象とするシステム

ここで対象とするシステムは,以下のような単純な2自由度のSpring-mass-damperシステムです.

両質量の位置が測定できるものとしています.

f:id:blockahead:20180729101832p:plain

状態方程式

\begin{align}
\frac{d}{dt} \left[ \begin{array}{c}
x_{1} \\
x_{2} \\
\dot{x_{1}} \\
\dot{x_{2}}
\end{array} \right] = \left[ \begin{array}{cccc}
0 & 0 & 1 & 0 \\
0 & 0 & 0 & 1 \\
-\frac{K_{1}+K_{2}}{M_{1}} & \frac{K_{2}}{M_{1}} & -\frac{D_{1}+D_{2}}{M_{1}} & \frac{D_{2}}{M_{1}} \\
\frac{K_{2}}{M_{2}} & -\frac{K_{2}}{M_{2}} & \frac{D_{2}}{M_{2}} & -\frac{D_{2}}{M_{2}}
\end{array} \right] \left[ \begin{array}{c}
x_{1} \\
x_{2} \\
\dot{x_{1}} \\
\dot{x_{2}}
\end{array} \right] + \left[ \begin{array}{cc}
0 & 0 \\
0 & 0 \\
\frac{1}{M_{1}} & 0 \\
0 & \frac{1}{M_{2}}
\end{array} \right] \left[ \begin{array}{c}
f_{1} \\
f_{2}
\end{array} \right]
\end{align}

観測方程式

 \begin{align}
\left[ \begin{array}{c}
x_{1} \\
x_{2}
\end{array} \right] = \left[ \begin{array}{cccc}
1 & 0 & 0 & 0 \\
0 & 1 & 0 & 0
\end{array} \right] \left[ \begin{array}{c}
x_{1} \\
x_{2} \\
\dot{x_{1}} \\
\dot{x_{2}}
\end{array} \right]
\end{align}

ここでは, M D Kなどすべての値は 1に設定しています.

ブロック図

MIMO PFCのブロック図は以下のようになります.

 

f:id:blockahead:20180729093856p:plain

Plantが制御対象を,controlPFC_MatFuncがPFCのコントローラを表します.

また,操作量はSaturationによって,ある一定値を超えないように制限されています.

制御対象には入力側と出力側それぞれにステップ状の外乱を与え,外乱に対する応答性能も確認します.

シミュレーション結果

サンプリング周期を T_{s}=0.01(s),希望する閉ループ応答時間 T_{CLRT} = [ 0.6, 0.6 ]^{T}(s),basis functionの次数を 3としたときの応答が下図です.

f:id:blockahead:20180729094212p:plain

 

上から操作量,外乱,質量位置の応答となっています.

このシステムでは干渉項が比較的大きいため,出力1の立ち上がり時に出力2が,出力2の立ち上がり時に出力1が変動しやすいシステムです.

それでもPFCによって干渉項による変動は上手く抑制されていることが見て取れます.

 遅れ補償

PFCにおいてもMPCと同様に,将来の目標値を利用した遅れの補償が可能です.

例えば正弦波状の目標値を持つ場合,目標値への遅れを低減する方法として,

  • コントローラのゲインを上げる
  • ZPETC(Zero phase error tracking  controller)を利用する
  • スミス予測器を利用する

などがあります.

古典的なロボットアームではコントローラをハイゲインにすることで遅れを低減していますが,ゲインに応じて目標値からの遅延量が変化する(ゲインを上げるほど遅延量が小さくなる)ため目標値の遅れがどの程度であるか評価することは困難です.

ZPETCはシステムモデルの安定な零点のみを利用して逆システムを構成し,位相遅れを補償する方法です.

スミス予測器による方法は,システムおよびコントローラのモデルを利用して,純時間遅れを補償し閉ループ安定性を向上する方法です.

MPCによる遅れ補償は後者の2つに近い原理で,システムの内部モデルを利用することで特別な操作なしに遅れを補償することが可能です.

通常の追従特性

f:id:blockahead:20180729180457p:plain

上図はPFCでの希望する閉ループ応答時間 T_{CLRT} = [ 0.6, 0.6 ]^{T}としたときの正弦波状目標値に対する応答です.

目標値に対して遅れが生じていることがわかります.

ハイゲインでの追従特性

f:id:blockahead:20180729180204p:plain

上図は T_{CLRT} = [ 0.3, 0.3 ]^{T}と小さくとり,ハイゲインにした状態での応答です.

ハイゲインにすることで遅れ自体は小さくなっていますが,遅れは残っています.

将来の目標値を利用した場合の追従特性

f:id:blockahead:20180729180818p:plain

上図は将来の目標値を利用した場合の応答です.

このとき T_{CLRT} = [ 0.6, 0.6 ]^{T}ですが,目標値に対する遅れはほとんど生じていないことがわかります.

コントローラの操作としては,目標値を遅延させて入力しているだけです.

このようにPFCで将来の目標値を利用することで比較的簡単に追従遅れを補償することが可能です.

また,純時間遅れがあるような系に対しても同様のアプローチを用いることができることも利点です.

 


 

この結果はSimulink project形式でGithubにアップロードしています.

PFCコントローラ内部のコードはすべてmファイルで記述しているため,主要な計算はテキストエディタで確認することができます.

github.com