(他に賢い方法があるかもしれんけど、わからんかった。)
まず、素直にやってみましょう。
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の中は上のコードを自分で入力してください。
PS:実は他のブログで記載していましたが、技術論はこちらのブログに引っ越しとしました。
0 件のコメント:
コメントを投稿