MATLABで現代制御その7:台車型倒立振子のサーボシステムを最適制御理論で設計してみる(+Unityでシミュレーション)

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

MATLABでサーボシステムを最適制御理論で設計&Unityで実装して動かしてみる

前回は台車型倒立振子の最適制御(最適レギュレータ)を設計して状態フィードバックをやってみたが、今回はサーボシステムの制御器を最適制御理論で設計してみる。制御対象は前回と同様に

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

として、以下の台車型倒立振子を対象とする。

なお、サーボ系の最適制御については目標値をフィードフォワードする形のものもあり、フィードフォワードした方が速応性の向上などが見込めるようだが、今回は簡単化のためにフィードフォワードは無しとした。

 

開発環境

MATLAB online (MATLAB R2022a)

Simulink

Control System Toolbox

Unity 2021.3.7f1

Windows 10

 

MATLABでサーボシステムのゲインを求める

サーボシステムは、以前サーボシステムを設計したときと同様に以下の図のようなシステムとする。状態変数は、台車の変位(x)、速度(dx/dt)、振子の角度(θ)、角速度(dθ/dt)で、入力:台車に加える力(u)になっており、変位xを目標値に追従させるようなサーボシステムになっている。

このサーボシステムの制御器を最適制御理論で設計するために、目標値と出力yの偏差を状態変数に加えてA、Bを拡張し、Ae、Beとして以下のようにMATLABでmファイルを実行して、ゲインKとGを求めた。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 = [1 0 0 0];
D = zeros(4,1);

Ae = [A zeros(4,1)
     -C zeros(1,1)];
Be = [B
      zeros(1,1)];

% Check Controllability
Co = ctrb(Ae,Be);
rank(Co)

%Linear Quadratic Regulator
Q = diag([30 30 100 50 30]);
R = 1;
Ke = lqr(Ae,Be,Q,R);
K = Ke(1,1:4)
G = Ke(1,5)

Matlabで計算したフィードバックゲインK、Gは以下の通り。

K = -19.4809  -31.9053 -396.7040 -143.7165
G = 5.4772

このゲインを使って、Unity上でC#のスクリプトを実装し、台車型倒立振子を目標値に追従させる。

 

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

以前Unityでサーボシステムを動かしたときから変更する点は、MoveCartServo.csのソースコードのゲインを

    private float k1 = -19.4809f;
    private float k2 = -31.9053f;
    private float k3 = -396.7040f;
    private float k4 = -143.7165f;
    private float g = 5.4772f;

にするだけで、他は変更なしで動かせる。ソースコードは以下の載せてるのでこちらを参照。

MATLABで現代制御その5:台車型倒立振子のサーボシステムをUnity上で実装してシミュレーション

以下が動かしてみた様子。偏差の積分値に対するゲインGが小さめのためか、以前、極配置法でフィードバックゲインを計算したときよりも動きが遅い。ただ、そのぶん振子は安定している。

最適レギュレータのQ、Rを変えてゲインを計算して、挙動を観察するのもなかなか面白そうだ。次回のネタは特に決まってないので、何か思いついたらまた試してブログに書こうと思う。

 

参考文献

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

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

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

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

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

積分型最適サーボ系の構成

 

MATLAB/Simulink記事まとめ

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

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

 


投稿者: wakky

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

コメントを残す

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

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