MATLABで現代制御その2:台車型倒立振子の状態フィードバック制御をSimulinkでシミュレーション

投稿日:2022年8月16日
最終更新日:2022年9月3日

MATLABで設計した状態フィードバック制御器をSimulinkでシミュレーションしてみる

前回はMATLABで以下の台車型倒立振子の状態フィードバック制御器を設計して初期状態の応答をシミュレーションしてみた。

今回はSimulinkを使って同じシミュレーションをやってみたいと思う。ちなみに状態方程式や使用するmファイルは前回と全く同じなので、前回のブログを参照↓

MATLABで現代制御その1:台車型倒立振子の状態フィードバック制御をシミュレーションする

 

開発環境

MATLAB online(MATLAB R2022a)

Simulink

Control System Toolbox

 

初期状態の応答のシミュレーション

まずは以下のmファイルを実行して、ワークスペースに必要な値を一通り読み込む。前回のmファイルとほぼ同じだが、今回はMATLAB上でシミュレーションをする必要はないので「% Simulation」以下の部分は消している。

% 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)

% Pole/Feedback Gain
p = [-0.5 -1.0 -1.5 -2.0];
K = place(A,B,p);

次にSimulinkを起動する。Simulinkを起動する場合は、以下のSimulinkのボタンをクリックすればOK。

細かい操作説明は公式のチュートリアルを読んだり動画を見たりするのが一番だと思うのでここでは割愛するが、最終的なブロック図と各ブロックのパラメータは以下に記載しておく。まず今回は以下のようにブロックを組んだ。

State-Spaceのブロックは、mファイルで定義した各行列や初期条件などを設定した。

Gainもワークスペースの行列Kを設定したが、ゲインにマイナスをつけている点に注意。これでmファイルでのシミュレーションでss(A-B*K,B,C,D)と書いた部分と同じ関係になる。

ブロックを配置できたのでシミュレーションを実行してみる。まず、左側のシステムへの入力につないだScopeをダブルクリックしてみる。State-Spaceで定義したシステムに対して以下のように入力が入っていることがわかる。

次に、右側の出力につないだScopeをダブルクリックして状態変数の応答をみてみる。mファイルでのシミュレーションと同じく、θが0.1[rad]傾いた状態からスタートして、各状態変数が0に収束して安定化していることがわかる。

 

台車に力を加えてみた場合を想定したシミュレーション

やりたいことは達成できたが、せっかくなのでもう少し遊んでみる。さきほどのSimulinkのブロックを少しいじり、以下のようなブロックに変更してみた。

このブロック図では左端のPulse Generatorで、一定時間ごとに1Nの入力を加えている(台車型倒立振子を左からツンツンつついているイメージ)。

Pulse Generatorの波形をScopeで見ると以下のような感じ。

なお、今回はPulse Generatorの入力からフィードバックした値を引いているので、ゲインのKは符号は+にしている。

この状態でシミュレーションを実行してみる。まずシステムのへの入力波形をScopeで見てみると、前節のuの波形にPuluse Generatorからの出力が足されていることがわかる。

次に状態変数の応答をScopeで見てみると、Pulse Generatorからの入力がくるたびに波形が乱れているが、発散せずにおおむね振幅0付近でとどまっている。この結果を見ると、台車型倒立振子をある程度横からツンツンつついても倒立状態は維持できそう。

これでSimulinkの使い方もざっくりつかめた。ただ、波形だけみても少し味気ない。

ということで、私がゲーム製作でちょくちょく使っているUnityで台車型倒立振子のモデリング&MATLABで設計した状態フィードバック制御器を実装してみて、実際に制御の様子をアニメーションで確認してみたいと思う。

※Math WorksのツールであるSimscape Multibody&Mechanics Explorerを使えば、モデリングした倒立振子のアニメーションも表示できる。ただ、私が使っているMATLAB onlineでは制限があってMechanics Explorerが使えないので、今回はUnityでやってみることにした。MATLAB onlineの制限については以下を参照。

https://jp.mathworks.com/products/matlab-online/limitations.html

 

参考文献

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

 

MATLAB/Simulink記事まとめ

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

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

 


投稿者: wakky

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

コメントを残す

メールアドレスが公開されることはありません。

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