R2012b:シミュレーション時間を戻す
R2012bは、いろいろ機能が追加されていて面白いです。今回は、シミュレーション時間を戻す機能についてまとめます。
機能追加といえば、Simulinkのショートカットについて、とあるお方から情報をいただきました。マウスの「進む」「戻る」ボタンがあれば、Simulinkモデルをブラウズする際に「進む」「戻る」として動作するそうです。うーむ、便利。
さて、シミュレーション時間を戻すという話ですが、イメージとしてはこんな感じです。
では、もうちょっと詳しく見ていきましょう。
シミュレーション時間を戻すとは?
イメージとしては、上図のようにシミュレーション時間が戻っていくだけです。ところで、「シミュレーション時間」って何でしょう?それを「戻す」というのは、どういう意味があるのでしょうか?
ここで、HILSの動作原理という、ふるーい記事から画像を引っ張ってきます。Simulinkの中では、たとえば仮想のクルマが走っていたりします。
Simulinkの中で時間が進む
さて、この時にSimulinkの中で起きているのは、次のようなことです。
「状態」を1ステップずつ計算していく
たとえばシミュレーションを1ミリ秒刻みで実施しているとします。このときSimulinkがやっているのは、「0ミリ秒における状態」 → 「1ミリ秒における状態」 → 「2ミリ秒における状態」 → ・・・ と、各時刻における「状態」を計算しています。
ここで「状態」といっているのは、たとえば車速であったり、SOC(バッテリーの充電度)であったり、とにかく車に関するいろいろなパラメータの値です。
時間=123ミリ秒で、車速は30km、この時にペラ軸トルクは30Nm
↓
時刻=124ミリ秒だと、車速は30.01kmになっているはず
という感じで、時刻が進むたびに車速のような「状態」がどう変化していくか?を計算していくのがSimulinkです。
ですから、「シミュレーション時間」という言葉は、むしろ「とあるシミュレーション時間における状態」といった方が正確です。これを「戻す」というのは、「状態」を戻すという事になります。
時間を戻す=「状態」を121ミリ秒時点のものに戻す
操作方法
導入編
では、これをどうやるかというと、とても簡単です。新しいSimulinkには、次のようなボタンがついています。まずシミュレーション開始前に「戻す」機能についての設定を行います。
すると、こういう画面になります。ただし、表示に間違い(たぶん、英語→日本語の翻訳ミス)があるため、これは以下のように読み替えてください。
ポイントは「ステップバック機能を有効にする」で、ここにチェックを入れてください。さて、実際に「戻る」機能を使うには、次のように操作します。すると、記事先頭の図のように、Scopeの波形がどんどん巻き戻っていきます。面白い!
さて、ここで起きていることを図にすると、以下のようになります。「戻る/進むステップ数」を1に設定しているため、「状態」が1ステップずつ戻っていきます。
「戻る/進むステップ数」に応じて、以前の「状態」に移動する
応用編1
たとえば、シミュレーションステップ=1msとして、1400秒くらいシミュレーションするとしましょうか。1秒シミュレーションするのに、実時間で10秒かかるとしましょう。1400秒シミュレーションするのに、実時間では14000秒=4時間弱。これは重い!何かあったとき、また1からシミュレーションやるというのは避けたいところです。
さて、そういう場合には「戻る」機能があるとうれしそうなのですが、この時Simulink内に保存される「状態」は、1400000個になります。さすがに、これはキツイ・・・
そういう時は、以下のように設定してみましょう。すると、保存される「状態」は、シミュレーション時間1秒につき1つ、1400秒でも1400個になります。ずいぶんマシになりました。
1秒ごとに「状態」を保存。1回戻るたびに1秒戻る。
すると、動作としては次のようになります。(実は、これはちょっと不正確です。詳しくは応用編2をご覧ください)
1秒ごとに「状態」を保存し、1度に1秒ずつ戻る
応用編2
これでも悪くはないのですが、1回の巻き戻しで1秒も戻ってしまうのはイヤだ!という場合もあります。そこで、「状態」の保存は1000ステップ(=1秒)毎、しかし「戻る」のは300ミリ秒、としましょう。設定画面は次の通りです。
ここで疑問です。「状態」は1000ステップ(1秒)置きにしか保存していないのに、どうやって300ステップ戻るのでしょうか?
実は、とっても単純な(しかし賢い)方法でこれを実現しています。300ステップ戻りたければ、1000ステップ戻ってから700ステップ計算すればいいのです。これはSimulinkが勝手にやってくれるので、ユーザーが特に気にする必要はありませんが、裏ではこういう事が起きています。
1000ステップ戻ってから700ステップ計算する=300ステップ戻る
ですから、「バックステップの保存間隔(=最大数の反復回数)」設定と、「戻る/進むステップ数」設定とは、それぞれ独立に考えて差し支えありません。
そもそも、シミュレーションを一時停止するタイミングが、たまたま「状態」を保存しているステップである保証もありません。
応用編1のように設定した場合でも、この機構は動いています。たとえば、シミュレーション時間=3.5秒でブレークしたとしましょう。ここから1秒戻ると2.5秒ですが、保存されている「状態」は0秒、1秒、2秒・・・と1秒刻みです。その場合、2秒まで戻る→0.5秒進める→2.5秒になる、という動きをします。
1.5秒戻って、0.5秒ぶん計算する=1秒戻る
ですからやはり、「バックステップの保存間隔(=最大数の反復回数)」設定と、「戻る/進むステップ数」設定とを、両方とも1000にしておく必要というのは特にありません。応用編1では、説明のためにそうしただけです。
このあたりの設定具合は、使っていくうちにいい感じのものが見つかると思います。
戻って何するの?
実は、ここが一番重要なテーマだったりします。進んだり戻ったりするだけだと、なにがウレシイんだかわかりません。戻ったあとで何をするか?が一番重要です。
今のところ、戻ってからできる作業は、次のように値ラベルを増やしたりだとか、
入力データを変化させたりだとか、
そのレベルです。本当は、信号線に自由にスコープがつけられたりするといいんですが、それはできません。残念。
所感
シミュレーション時間を戻す機能は、とても面白いと思いますが、まだまだ発展の余地がいろいろあります。
(1)対応ブロック
実は、あらゆるブロックがこの機能に対応しているわけではありません。全ブロックがこれに対応していない限り、戻る機能はマトモに動かないため、これは今後の展開に注目です。
(2)「戻る」機能の拡充
たとえば、何ステップ戻るのか?(300ステップとか)の設定は、いったんシミュレーションを開始してしまうと変更できません。これくらいは、ブレーク中に変更できてもいいと思います。あと、時間を指定して「○秒まで戻れ」という指定ができても便利だと思います。
(3)「戻ったあと」の機能の拡充
戻ったあと何をするのか?が最重要です。スコープを自由につけられるようにするとか、その手の「戻るウレシサ」はまだまだ発展途上のように思います。こちらも、今後の展開に注目です。
今のままでも使えなくはないのですが、上記のような対応が徐々になされていくと、より使いでのある機能になっていくかと思います。今後に期待!