MATLABで現代制御その6:台車型倒立振子の最適レギュレータを設計してみる(+Unityでシミュレーション)

投稿日:2022年10月22日
最終更新日:2022年10月22日

MATLABで最適レギュレータを設計&Unityで実装して動かしてみる

これまで極配置法によって台車型倒立振子の状態フィードバック制御を行ってきたが、今回は最適制御(最適レギュレータ)を設計して状態フィードバックをやってみる。対象はいつものように

  • 状態変数:台車の変位(x)、速度(dx/dt)、振子の角度(θ)、角速度(dθ/dt)
  • 入力:台車に加える力(u)

として、以下の台車型倒立振子を対象とする。線形化した台車型倒立振子のモデルは以下のサイトのものをそのまま使わせて頂いているm(_ _)m

台車型倒立振子を安定にフィードバック制御する|Tajima Robotics

ちなみに最適レギュレータについては詳しく説明はしないので、参考文献などを参考にしてください。

 

開発環境

MATLAB online (MATLAB R2022a)

Simulink

Control System Toolbox

 

MATLABで最適レギュレータの設計&シミュレーション

今回は以下のようにMATLABでmファイルを実行してシミュレーションを実行した。QとRは適当に決定した。

% Parameters
M = 10;
m = 1;
L = 2;
g = 9.8;

% State Space
A = [0 1 0 0
     0 0 -3*m*g/(4*M+m) 0
     0 0 0 1
     0 0 6*g*(M+m)/(L*(4*M+m)) 0];
B = [0
     4/(4*M+m)
     0
     -6/(L*(4*M+m))];
C = eye(4);
D = zeros(4,1);

% Check Controllability
Co = ctrb(A,B);
rank(Co);

%Linear Quadratic Regulator
Q = diag([30 30 100 50]);
R = 1;
K = lqr(A,B,Q,R)

% Simulation
x0 = [0;
      0;
      0.1;
      0];
sys = ss(A-B*K,B,C,D);
initial(sys,x0);

極配置法では自分で極を決めて、それに対応したフィードバックゲインKを計算したが、最適レギュレータではQ、Rを決めて評価関数を最小にするフィードバックゲインKを計算する。MATLABではlqr関数を使えばサクッと計算してくれる。今回は以下のようなゲインになった。

K = -5.4772   -16.2197   -316.3140   -114.0904

以下がinitial関数で初期状態からの応答をシミュレーションしてみた結果。θが0.1[rad]傾いた状態からスタートさせた状態からの応答になっているが、各状態変数が収束していることがわかる。

QとRは設計者が何かしらポリシーを持って(または試行錯誤的に)決める必要があるが、QとRさえ決めてしまえば状態変数、入力などを考慮した最適なフィードバックゲインが出てくるのが最適制御の便利なところ。

 

Unityで台車型倒立振子の動作をシミュレーションしてみる

波形だけだと味気ないので、以前のブログでやったようにUnityでも動作をシミュレーションしてみる。といっても前のMoveCart.csのソースコードのゲインを

    private float k1 = -5.4772f;
    private float k2 = -16.2197f;
    private float k3 = -316.3140f;
    private float k4 = -114.0904f;

のように変えただけで、他は変更なし。以下が動かしてみた様子。ボタンをクリックして左右から力を加えても倒立状態を維持できている。まぁゲインを変えただけなので、動画的には以前やったシミュレーションと見た目は変わらないんだけど…笑

次回は、サーボシステムを最適制御理論で設計してMATLAB/Simulinkで設計してみたいと思う。

 

参考文献

この本のMATLAB/Simulink 6か月ライセンスを使ってやってます↓
Interface 2022年 9月号

最適レギュレータについては以下を参考にさせて頂きましたm(_ _)m

状態フィードバックとオブザーバ

線形 2 次レギュレーター (LQG) 設計 – MATLAB lqr – MathWorks 日本

Pythonによる最適レギュレータの設計 – Qiita

 

MATLAB/Simulink記事まとめ

MATLABとSimulinkの記事は以下にまとめてます。

MATLAB/Simulinkで遊んでみる まとめ

 


投稿者: wakky

映画と旅行が大好きなエンジニア。お酒、ゲーム、読書も好き。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください