Simulink モデル実行中の可視化方法まとめてみた!
こんにちは、トレーニングエンジニアの遠藤と申します。
前回の投稿は 5/14 ということで、なんと 5 ヶ月ぶりの投稿です。時が経つのは早いものですね……。
このブログでは、「Simulink と MATLAB をつなぐ」をコンセプトとして、「Simulink API」や「App Designer と Simulink の連携方法」について書いてきました。
今回は、Simulink のモデル内で MATLAB のコードを使う大きな動機の一つである Simulink の可視化、特に「モデル実行中の可視化」についてまとめてみたいと思います。
Simulink における可視化
Simulink でシミュレーションを行う上で、「可視化」は重要な要素の一つです。モデルが正しく作られているか、パラメータの値は適切か、意図しない結果となる原因は何か、などをチェックする上では欠かせないプロセスになります。
さて、Simulink における可視化には主に 2 つのタイプがあります。
-
モデル実行後の可視化
シミュレーションを一度行い、そのログデータを使って可視化を行う方法です。様々なシミュレーションデータを詳細に検証する場合、複数のシミュレーション結果を比較する場合はこちらを使用します。
-
モデル実行中の可視化
シミュレーションを実行中に、計算結果を逐次的に可視化していく方法です。ハードウェアと連携してストリーミング処理を行う場合など、リアルタイムにモデルが正しく動いているかを監視する必要がある場合、モデル実行中の可視化が必要になります。
前者については、ログデータさえ取ってしまえば豊富な MATLAB の可視化関数を使うことができるため比較的簡単です。それに対し、後者はモデルの実行中、すなわち Simulink モデル内で可視化処理を行う必要があるため、使える可視化機能は限られてきます。
ただ、モデル実行中に可視化したいデータの中には、 Scope ブロックで時間応答を見るだけでは十分でないケースも多いです。特にハードウェア連携を行うなら、見栄えという意味でもデータの可視化の部分を充実させたいですよね。例えば下の動画は Dashboard を使っていい感じの UI を作ってます。
そこで、今回はモデル実行中の可視化方法についてどのようなものがあるのか、簡単にまとめていきたいと思います。
Simulink の標準機能を使った可視化
冒頭で「モデル実行中の可視化」は「Simulink のモデル内で MATLAB のコードを使う大きな動機の一つである」と書きましたが、もちろん MATLAB を使わなくても Simulink の標準機能だけでいろいろな可視化を行うことができます。以下に例を示します。
・Scope ブロック
まずは最もメジャーな Scope ブロックです。信号の時間応答をプロットしてくれます。Scope ブロックはモデル実行後の結果の確認に使用される場合も多いですが、一定時間ごとに結果が逐次更新されるため実行中の可視化にも使えます。
また、Scope のメニューの「ツール」->「測定値」から「ピークの検出」や「信号の統計」を選ぶと、信号のピーク値や最大/最小値といった情報をリアルタイムで確認することができます。ストリーミングデータにフィルタをかける場合など、リアルタイムで信号の詳細情報が必要な場合に有効です。
ちなみに スコープ ビューアー 機能を使うと、わざわざ信号に Scope ブロックを繋がなくても同等の可視化を行うことができるので、モデル上の複数の信号を可視化する際はオススメです。
・XY Graph ブロック
XY Graph ブロックは 1つ目の信号を横軸、2つ目の信号を縦軸としたグラフを描画するブロックです。Scope は 1 つの信号の詳細情報を確認するのが得意ですが、XY Graph は 2 つの信号の関係性を視覚的に確認したい場合に有効です。
例えば物体の位置を制御するモデルの場合、x と y の応答を単体で見ても状況が分かりにくいため、x-y グラフを書いて経路を見たほうが正常に動作しているかどうかわかりやすいですよね。こういった場合は XY Graph ブロックが便利です。
注意点として、Scope ブロックとは違い、XY Graph には座標軸のオートフィッティング機能がありません。モデルの実行中でも XY Graph ブロックのパラメータは自由に変更可能ですので、もし途中で座標軸の範囲を変更したい場合は、ブロックパラメータウィンドウから座標範囲の値を変更しましょう。
・Dashboard ライブラリ
Dashboard ライブラリ内のブロックにも Dashboard Scope ブロックや Gauge ブロックなどモデル実行中に更新される可視化機能があります。ちなみに冒頭で紹介した動画で使われていたのはこのライブラリのブロック群です。
Dashboard ライブラリの可視化用ブロック群は、モデル上に直接シミュレーション結果を可視化することができるため、大量の Scope ウィンドウの表示を切り替える、モデルの階層を移動しながら適切な Scope ブロックを開く、といった手間が生じにくいのが大きな利点です。モデル上に一種のシミュレーションアプリを作ることができるため、前回の記事と同様、Simulink にあまり慣れていない方とモデルをやり取りする際にも効果的ですね。
・シミュレーションデータインスペクター
シミュレーションデータインスペクターは Simulink の可視化機能の一つで、「選択した信号のログ」を設定した信号の時間応答を可視化することができます。多くの場合はシミュレーション実行後に検証、比較を行うために使われますが、一度モデルを実行してプロットする信号を選択しておけば、シミュレーション実行中にその結果を確認することが可能です。
シミュレーションデータインスペクターを使う一番の利点は、実行中のシミュレーション結果だけでなく、過去のシミュレーション結果も合わせて可視化できる点です。例えば↑の GIF は前の実行結果を赤で表示しつつ、モデルのパラメータを変えて再度実行した結果を青でプロットしています。モデル実行中に過去の結果と比較したい場合は特に有効な可視化方法となります。
MATLAB の関数を使った可視化
MATLAB には Simulink の標準機能よりも多くの可視化関数がありますので、モデル内でそれらの関数を使うことでより高度な可視化を行うことができます。モデル内で MATLAB 関数を使用する方法は複数ありますが、ここ
- MATLAB Function ブロック
- Interpreted MATLAB Function ブロック
- MATLAB System ブロック
の 3 つについて紹介しようと思います。
MATLAB Function ブロック(+ coder.extrinsic 関数)
MATLAB Function ブロックは、ブロックの処理を MATLAB コードで記述することができるブロックです。おそらくモデル上で MATLAB 関数を使用する機能としては一番有名かと思います。
しかし、MATLAB Function ブロックはシミュレーション実行時に MATLAB コードをコード生成しますので、コード生成に対応していない関数は使用できません。MATLAB の可視化関数は基本的にコード生成非対応ですので、そのままでは使用できない、ということになってしまいます。
そこで使用するのが coder.extrinsic という関数です。この関数を使うと、指定した関数がコード生成されずに MATLAB 側で実行されるようになります。これによってコード生成非対応の可視化関数も MATLAB Function ブロック内で使用することができます(詳しくはこのドキュメントを参照)。
使い方は、MATLAB Function ブロックのコードの冒頭に coder.extrinsic を 1 行入れるだけです。可視化の関数を自分で .m ファイルとして作成しておき、それを coder.extrinsic で指定して使用する場合が多いかと思います。
function func(u)
coder.extrinsic(‘myDispFun’);
myDispFun(u);end
myDispFun.m のコード生成は行われないため、内部では自由に MATLAB のコードを書くことができます。可視化に使うときには、永続変数を使ってデータ点を追加していく処理を書く場合が多いですね。例えば、次のコードは最初のステップで plot をし、それ以降のステップではデータを追加する処理になります。
function myDispFun(u)
persistent p
if isempty(p)
p = plot(u(1),u(2));
axis([0 10 0 10]);
else
p.XData = [p.XData u(1)];
p.YData = [p.YData u(2)];
endend
ただし、永続変数を使うと次回以降のシミュレーションに値が持ち越されてしまいます。そのため、シミュレーションを実行するごとに clear コマンドで永続変数をクリアする必要がある点に注意が必要です。
後述する 2 つのブロックと比べると、制約が少なくコードも書きやすい、というメリットがあります。とりあえずこのブロックを使っておけば、可視化できない、ということは起きにくいかと思います。
Interpreted MATLAB Function ブロック
Interpreted MATLAB Function ブロックは、指定した MATLAB 関数を MATLAB 上で実行し、結果を Simulink に返すブロックです。
MATLAB Function ブロックと違ってそもそもコード生成が行われないため、coder.extrinsic 関数での外部関数指定を行うことなくそのまま MATLAB 関数を使用することができます。
可視化用の関数を作成してそれをブロックで指定するだけなので、非常に手軽に使えるのがメリットかと思います。ちょっとした可視化や動きのテストを行う場合は便利です。
ただし、Interpreted MATLAB Function ブロックには「入力は double 型のスカラ、ベクトル、行列のみ」という、入力信号に対する大きな制約があります。他のデータ型や Bus 信号は対応してないので注意が必要です。
また、何かしらの出力信号が必要なので、描画だけ行いたいという場合は、適当なダミー値を出力して Terminator ブロックに接続する、といった工夫が必要です(上の画像を参照)。
MATLAB System ブロック
こちらは MATLAB の System object をモデル上で呼び出すことができます。通常は信号処理や通信システム等の状態量保持が必要となるモデルで使用するブロックですが、個人的に可視化を行う際に便利だった経験があるので、上記 2 つのブロックと合わせて紹介したいと思います。
MATLAB System ブロックはデフォルトでは MATLAB Function ブロック同様コード生成が行われるように設定されていますが、「シミュレーション実行方法」を「インタープリター型実行」に設定すると、Interpreted MATLAB Function ブロックと同様にMATLAB 上で処理が実行されるようになるため、コード生成非対応の関数も使用することができます。
MATLAB System ブロックと上記 2 つのブロックの最大の違いは、プロパティ(内部データ)を持つことができる点です。
例えば、(Interpreted) MATLAB Function ブロックでデータ点を追加していくような処理を書こうとした場合、前述の通り永続変数にプロットのハンドルを格納する必要があります。
これに対し、MATLAB System ブロックでは永続変数を使わなくても内部プロパティにプロットのハンドルを保存しておくことができます。プロパティの値はシミュレーションごとにリセットされるので、わざわざ clear 関数でリセットする必要はありません。
ただし、System object を作る必要がある関係上、ある程度の System object に関する知識が必要となるので、慣れてない方には少しハードルが高いかもしれません。
その他の可視化方法
上述したSimulinkの標準機能および MATLAB 関数を使う以外の方法についても簡単にご紹介します。
・イベントリスナー機能を使った可視化
ちょっとマイナーな方法ですが、イベントリスナー機能を使ってもモデル実行中の可視化を行うことができます。
イベントリスナーとは、「特定のイベントが発生したときに登録しておいた関数を自動的に実行する」機能のことです。Simulink には add_exec_event_listener という関数が用意されており、モデル上の特定のブロックが実行されたときに、特定の関数を自動的に呼び出すことが可能です。
残念ながら、イベントリスナーの機能の使い方をここで詳細に説明しようとするとそれだけで結構なボリュームになってしまうため、ここでは紹介のみとさせていただきます。詳細はこちらの例がとてもわかりやすいと思いますので、興味ある方はぜひご参考ください。
・ツールボックスの専用ブロックを使った可視化
ツールボックスの中にはモデル実行中の可視化に使えるブロックがあります。例えば DSP System Toolbox の Spectrum Analyzer ブロックや Computer Vision Toolbox の Video Viewer ブロックなどが挙げられます。
各ツールボックスにどんなブロックがあるかについては挙げ始めるとキリがないので、気になる方はドキュメントの左の「カテゴリ」からツールボックスを選び、上部メニューの「ブロック」からブロックリストをご確認いただければと思います。
おわりに
今回は Simulink モデルの実行中の可視化方法についてご紹介しました。
Scope ブロックだけではわかりづらいという場合は、専用のブロックや MATLAB コードの力を借りることでよりわかりやすい形に可視化でき、モデルの開発、検証を効率よく行えるようになるかもしれません!
- Category:
- Simulink General
Comments
To leave a comment, please click here to sign in to your MathWorks Account or create a new one.