最適レギュレータ(LQR)

2023年4月30日日曜日

11. 状態フィードバック

t f B! P L

 

はじめに

今回のブログ記事の目的について説明します。

目的:制御工学の WOW! を伝えられないか

制御を適用すると人の能力を超えたことができたりします。
そんな WOW! な瞬間に立ち会うことができるのが制御工学の楽しさではないかと思っています。

これまで、このブログでは扱いやすい制御対象で説明してきましたが、分かりやすい反面、なかなか制御工学の楽しさである WOW! が伝わらないなぁ というのと、それって PIDフィードバック でよくないっすか? という印象も持ってしまいます。

ということで、今回は 制御工学の楽しさ WOW! を伝える ことを目指します。

題材:最適レギュレータ(LQR)

以前の 状態フィードバック(レギュレータ)では、状態フィードバックゲインを特性方程式の固有値 (解) の安定条件から手計算で求めました。

安定条件(連続系なら固有値 (解) の実部が負とか)から求められる状態フィードバックゲインには調整幅がありました。

状態フィードバックゲインの求め方としては、評価関数のもとで最適となる値を求める方法もあります。今回は、そのように構成した制御器 最適レギュレータ(LQR)を題材にして書いていきます。

計算ツール:MATLAB Online(BASIC) を使ってみる

私はMATLABのライセンスを持っていないのですが、ありがたいことにMATLABのライセンスがなくても、月20時間まで最新のMATLABの基本的な機能をONLINEで使うことができます。

そこで、今回はMATLAB Online(BASIC) を活用して、状態フィードバックゲインを求めてみます。

EXCELファイルのダウンロード

こちら から Excelファイル LQR.xlsm をダウンロードできます。

ダウンロードしたExcelファイル LQR.xlsm には、状態方程式、手動操作、制御なし、PIDフィードバック、LQR、mファイル のシートがあります。

順次説明していきます。

制御対象

今回は制御対象としてバネマスモデルを扱っていきます。
状態方程式のモデル化 で示したモデルは、バネとダンパーの機構に質量Mの物体が搭載され、さらにΔMの荷重が加わった状態です。
今回は振動を吸収抑制するダンパー機構がないケースで考えます。

荷重ΔMが加わる状態とは、バネの支点に荷重ΔMに相当する上方向の推力が加わる状態になります。上の図では、このときバネの支点にかかる力を \(F[N]\) としています。

バネの変位量 \(x\)、変位速度 \(v\)、バネの支点の移動速度 \(V\)、質量Mの質点の移動距離 \(L\) とすると

\[ \frac{dx}{dt} = v \] \[ \frac{dv}{dt} = -( \frac{K}{M} )x - ( \frac{1}{M} )F \] \[ \frac{dL}{dt} = V+v \] \[ \frac{dV}{dt} = ( \frac{1}{M} )(F+Mg) \]

さらに静止平衡状態からの変化の式に置き換えて、静止平衡状態からのバネの変位量を \(x\)、バネの支点にかかる推力の変化量を \(F\) とすると\(Mg\)が消えて

\[ \frac{dx}{dt} = v \] \[ \frac{dv}{dt} = -( \frac{K}{M} )x - ( \frac{1}{M} )F \] \[ \frac{dL}{dt} = V+v \] \[ \frac{dV}{dt} = ( \frac{1}{M} )F \]

これを状態方程式にまとめると

\[\frac{d}{dt}\left[\begin{array}{c} x \\ v \\ L \\ V \end{array}\right]=\left[\begin{array}{cccc} 0 & 1 & 0 & 0 \\ -\frac{K}{M} & 0 & 0 & 0 \\ 0 & 1 & 0 & 1 \\ 0 & 0 & 0 & 0 \end{array}\right] \left[\begin{array}{c} x \\ v \\ L \\ V \end{array}\right] + \left[\begin{array}{c} 0 \\ -\frac{1}{M} \\ 0 \\ \frac{1}{M} \end{array}\right] F \]

EXCELファイルの状態方程式のシートでは、状態方程式を \(100[ms]\) で離散化しています。離散化の手法についてはこちら →リンク で説明しています。

質点の質量 \(M=1.00 [kg]\)
ばね定数 \(K=10.00 \)

とすると、重力下では自然長に対してバネは \(0.98[m]\) 縮むので、質点の初期位置を \(L0 = -0.98[m] \)とし、バネの支点を推力 \(F[N]\) 速度 \(V[m/s]\) で運動させて、\(L = 0[m] \)に戻すことを考えます。

まずは動かしてみる 

重力環境下で、バネの上に質量M[kg]の物体が載っている静止平衡状態が初期状態です。そこから、バネの支点を約1m(0.98[m])持ち上げます。

制御なし

Excelファイルの 制御なし のシートでは、推力 F[N] を一定として質点の位置L()を0mに戻した場合の結果です。

推力 F[N] は、+0.98[N]、-0.98[N]をそれぞれ1秒間入力しています。結果、質点は0mを中心に振動しています。


PIDフィードバック

次にExcelファイルの PIDフィードバック のシートですが、やはり制御が必要ってことで、PIDフィードバックでバネの支点の推力 F[N] を制御しています。

P, I, Dの各ゲイン係数を調整してみますが、振動を収束させることはなかなか難しいです。


手動操作 vs 最適レギュレータ(LQR)

次にExcelファイルの 手動操作 のシートです。
手動操作のシートのグラフの上部に、【手動操作】と【LQR】のボタンがあります。

推力 F[N] はグラフの左側のスライドボリュームで、-2.0[N]~2.0[N]の間で入力できます。

【手動操作】のボタンを押してから、グラフ中の1秒から10秒の間で質点の位置Lが0mに戻るようにスライドボリュームを操作します。

振動を抑えながら、オーバーシュートさせないように制御するのは、結構な技量が必要というか、ほぼ無理です。

一方、【LQR】のボタンは、最適レギュレータによる制御結果を表示します。

WOW! 素晴らしい!

最適レギュレータ(LQR)

最適レギュレータ(LQR)といっても、状態フィードバックゲインの求め方が違うだけで、これまで説明した状態フィードバック(リンク→(1)(2))と制御演算ロジックに違いはありません。

制御入力は、状態フィードバックゲインと各内部状態の積和値です。
\[ F_{n} = - \left[\begin{array}{cccc} k_{1} & k_{2} & k_{3} & k_{4} \end{array}\right]   \left[\begin{array}{c} x_{n} \\ v_{n} \\ L_{n} \\ V_{n} \end{array}\right]  \]

EXCELファイルの LQRのシート で下のように演算しています。状態フィードバックゲイン \(K\) は定数なので、オンボードで算出する必要はありません。
制御演算ロジックは、状態フィードバックゲインと各内部状態の積和演算のみであり、とても簡潔でコントローラへの実装も簡単です。


状態フィードバックゲインの求め方

最適レギュレータ(LQR)では、過渡応答の評価関数 \(J\) を設定し、それが最小になるように制御ゲインを決定しています。
\[ J = \int_0^\infty x^T Q x + u^T R u dt \] 今回はシステムの内部状態が \( x, v, L, V \) の4次なので、\(Q\) は \(4\times4\) 行列となり、その対角値に重み係数を設定します。

バネの変位量 \(x\) 、変位速度 \(v\) 、バネの支点の移動速度 \(V\) 、質点の移動距離 \(L\) 全て \(0\) が目標であり、特に優先順位はないので重み係数は同じ値(10)にします。

また、\(R\) は入力 \(F\) の重み係数ですが、最小制御入力での制御が目標です。重み係数は同じ値(10)にします。

フィードバックゲイン \(K\) は、Riccati方程式
\[ PA+A^TP – PBR^{–1}B^TP + Q = 0 \]より \(P\) の解を求め、
\[K = R^{–1}B^TP \]から求めることができますが、手計算で求めることは難しそうなので、今回は、MATLAB Online を利用することにします。

MATLAB Onlineを使ってみる

はじめにも書いていますが、ありがたいことに、MATLABのライセンスを持っていなくても、月20時間まで最新のMATLABの基本的な機能をONLINEで利用することができます。

今回はMATLAB Online(BASIC) で状態フィードバックゲインを求めます。

① MathWorks のアカウントがなければアカウントを作ります。

②  ≫ MATLAB Online (basic) を開く  からMATLAB Onlineを起動

  MATLAB Home (mathworks.com)

③ スクリプトを入力

EXCELファイルのシート mファイル のスクリプトをエディタウィンドウまたはコマンドウィンドウに入力(コピペ)する。


  \(A, B\) は離散化した状態方程式のシステム定数です。
  \(Q, R\) は評価関数 \(J\) の重み係数です。

④ 実行ボタンで K, P, e の各演算結果がコマンドウィンドウに表示されます。 

  [K,P,e]=dlqr(A,B,Q,R)

により、離散系のRiccati方程式の解 \(P\) と、状態フィードバックゲイン \(K\)、閉ループ固有値 \(e\) が計算されます。今回使うのは、状態フィードバックゲイン \(K\)で、以下の値となりました。

  K =-2.126096030305621 -0.866140186908230 0.869870268078701  1.693015169518806

この状態フィードバックゲイン \(K\) とシステムの内部変数の積和値が制御入力になります。また、入力したスクリプトは、mファイルとしてMATLAB Driveに保存が可能です。 

まとめ

今回はMATLAB Onlineを活用して Riccati方程式 を解いて、状態フィードバックゲインを計算、最適レギュレータを構成してみました。

状態方程式にモデル化できれば構成は非常に簡潔で、PIDフィードバックより制御性も改善できるとあって、全部LQRでよくないですか?とさえ思ってしまいます。

が、、、現実に状態フィードバックを実現するには、システムの内部状態を全て検知できないといけません。全ての内部状態をセンサで検知するにはコストがかかります。オブザーバで推定するには、コントローラにシステムの離散化モデルとオブザーバの演算ロジックを実装をする必要があり、状態フィードバックの制御演算の簡潔さが失われてしまいます。

ということで、世の中は 全部LQRで! ってことにはなっていないのだと思います。
でも、実務で使えるように準備しておけば、どこかで適用のチャンスがあるかもしれません。

最後までお読みいただきありがとうございました。制御工学の楽しさ WOW! をお伝えできたでしょうか。


QooQ