ラベル Matlab関係 の投稿を表示しています。 すべての投稿を表示
ラベル Matlab関係 の投稿を表示しています。 すべての投稿を表示

2015年3月22日日曜日

Simulink よく使うショートカット

Matlab Simulinkよく使うショートカット

・線を引く
Ctrl + 左クリック

・回転
Ctrl + r

・逆回転
Ctrl + Shift + r

・やり直し(Undo)
Ctrl + z

・やり直しの戻し(Redo)
Ctrl + y

・切り取り
Ctrl + x
(Windowsと一緒ですね)

・コピー
Ctrl + c
(Windowsと一緒ですね)

・貼り付け
Ctrl + v
(Windowsと一緒ですね)


他に便利なコマンドがあったら、教えてください。

2015年3月18日水曜日

Simulink StateFlowの注意点

制御系を組む際にSimulinkのStateFlowはかなーり便利です。
車の制御系を作っているときに使っていました。

けど・・・、これって、やり方間違えるとかなり遅い。Super Slow!!

遅くなる要因はどうやら、Stateが頻繁に切り替わるように作ると遅いらしい。

回避方法は人によって違うけど、StateFlowを使っても切り替わりをできる限り少なくなるように作ることが必要ですね。

PS:
前に聞いた話だが、Android NDKを使う時の注意点として、頻繁にJAVAとCのコードを行き来するなと聴いた記憶がある。これも同じなんだろうな。外部のモジュールを呼び出すときに重さがあるのだろう。

Simulink 初期値有りの一次遅れフィルタ

面倒だったので、モーターのモデルを1次遅れフィルタに置き換えてやってしまえ!!

背景としては、現在、私は課題でクアッドローターのシミュレーターを作っていて、モーターのモデルを作る必要があった。モデルは参考例が沢山あり、簡単に作れたのだが、パラメーターがわからん。ってことで、1次遅れフィルタに変換してやってみることにした。

しかし、SimulinkのTransfer funcを利用して1次遅れフィルタを作ると初期値がない。そのため、回転数が一定に達するまで落ちてくる。収束するまで毎回待つのがめんどくさかったので、初期値有りのフィルタを作った。

式展開は以下


モデルはこれ


これをSimulinkに起こた結果が以下

1DFilterWithInitialCondition

PS:以前公開したものにバグがあり且つもっと簡単なモデルができたので、再アップロード。

2015年3月17日火曜日

Simulink Signal Builderでのポイントの追加

ど忘れしていたためのメモです。

Matlab Simulnikをいじっていて、Signal Builderの使い方を忘れていました。
特にいるけど忘れていたのが、ポイントの追加の仕方。

やり方

Shift 押しながらマウスの左クリック。

だけ。

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の中は上のコードを自分で入力してください。