2015年3月14日土曜日

Matlab Simulink での LQR & LQG コントローラの動的計算

Matlab SimulinkでLQR & LQG コントローラを動的に計算するにはどうすればいいか。
(他に賢い方法があるかもしれんけど、わからんかった。)

まず、素直にやってみましょう。
LQRコントローラを設計するためには、are(Matlab command: careでも可)を使ってRicatti方程式を解く必要があります。

そしてその結果を用いてLQRゲインを計算します。

このゲインは、通常のLQRコントローラーのブロック図のKに該当します。
元のシステム:




では、これをSimulinkに入れるにはどうするか?

User-Defined Functions->Matlab functionを使ってみる。

コード:
function Klqr = sim_are(A,B,R1,R2)
P = are(A,B*inv(R2)*transpose(B),R1);
Klqr=-inv(R2)*transpose(B)*P;

エラー
>関数 'are' はスタンドアロンコード生成に対してサポートされていません。シミュレーションでこの関数を使用する方法については、coder.extrinsic に関するドキュメンテーションを参照してください。

なんのこっちゃかわからんが、どうやら”coder.extrinsic”を使って、回避しろってことらしい。指示に従って、ちょっと書き換え。
コード:
function Klqr = sim_are(A,B,R1,R2)
coder.extrinsic('are');
Klqr=zeros(2,4);

P = are(A,B*inv(R2)*transpose(B),R1);
Klqr=-inv(R2)*transpose(B)*P;

おぉ、コンパイル通った。ついでに、メモリの確保を事前にするために、zeros(2,4)を先に定義する必要があるらしい。
不利益はよくわかりませんが、とりあえず、この方法でSimulinkでLQRのゲインの計算はできるようです。同じようにLQGも作ったものを置いておきます。

ちなみに、数式については、Georgia Techの授業の式を使ったので、一般の記号とは少し異なります(この中:R1,R2、一般:Q,R)。あしからず

calcLQR_config.m 設定ファイル
LQR計算ブロック(simulink 用)

calcLQG_config.m 設定ファイル
LQG計算ブロック(simulink用)

PS:なんかうちの環境以外だと上手く動かなかったので、Matlab functionの中は上のコードを自分で入力してください。


0 件のコメント:

コメントを投稿