【PyFMI】最小構成のMBD事例 第2章 その122【リアルタイム描画⑯】

【PyFMI】最小構成のMBD事例 第2章 その122【リアルタイム描画⑯】 事例
【PyFMI】最小構成のMBD事例 第2章 その122【リアルタイム描画⑯】

バックナンバーはこちら。
https://www.simulationroom999.com/blog/model-based-of-minimum-2-backnumber/

はじめに

tkinterによるFMUシミュレーションのリアルタイム波形描画にFMU関連処理を追加しているところ。
前回はdequeの生成までを実施。

実処理に相当するタイマハンドラ周りを実装していくことになるが、
タイマハンドラ内の処理に必要な前準備などもある。

登場人物

博識フクロウのフクさん

指差しフクロウ

イラストACにて公開の「kino_k」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=iKciwKA9&area=1

エンジニア歴8年の太郎くん

技術者太郎

イラストACにて公開の「しのみ」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=uCKphAW2&area=1

必要なタイマハンドラ

太郎くん
太郎くん

内容を入力してください。今回はタイマハンドラの実装ってことだったけど、
描画とFMUシミュレーションは同じタイマハンドラで実行する感じ?

フクさん
フクさん

いんや。
別々に分けるつもりだよ。

太郎くん
太郎くん

なんで?
シミュレーション結果を取得したら、すぐに更新すればいいんじゃない?

フクさん
フクさん

今回のやり方を始める時にも言ったが、
描画処理がリアルタイム性を落としちゃうんだよね。
よって、描画とシミュレーションを分けて、
例えば、
描画を200ms周期。
シミュレーションを可能な限り早く。
って方が望ましい。

太郎くん
太郎くん

なるほど。
確かに描画にネックがありそうだったから今回の話になったんだよね。

タイマハンドラの定義

フクさん
フクさん

必要なタイマハンドラは
FMUシミュレーション用のFMU_handler

matplotlib描画用のplot_handler
の二つを用意しよう。

フクさん
フクさん

そして、
FMU_handlerは1ms周期、
plot_handler200ms周期、
としておくか。

太郎くん
太郎くん

1ms周期とか動くのかな?

フクさん
フクさん

実際は1ms周期にはならないだろうね。
FMU処理の後に再度afterで設定するし。
まぁ可能な限り早く呼び出してくれって程度の数値だと思ってくれ。

太郎くん
太郎くん

内容を入力してください。なるほど。
そういうことか。

FMU_handlerを呼び出す前の準備

フクさん
フクさん

ここでFMU_handler内部で使用する時間関連の変数を事前に定義する必要がある。

太郎くん
太郎くん

時間関連?

フクさん
フクさん

うん。
実時間が経過した分をシミュレーション時間として設定するんで
前回の時刻の記憶とか必要なんだよね。
まぁコードとしては以下をタイマハンドラの前に実施しておけばOKだろう。

# define timers
start_tick = time.perf_counter()
currenttime = 0
フクさん
フクさん

あとはオプション設定も必要かな。

opts = master.simulate_options()
opts["step_size"] = step_size
opts["initialize"] = 1
太郎くん
太郎くん

このオプションの
opts[“initialize”] = 1
ってのは?

フクさん
フクさん

初回呼び出し設定だね。
一回simulateメソッドを呼び出した後は
opts[“initialize”] = 0
にすることで、
前回のsimulateメソッドを状態を引き継いだ状態でシミュレーションが再開される。

太郎くん
太郎くん

ほう。
それを利用してシミュレーションを刻むのか。

フクさん
フクさん

次は実際のタイマハンドラのコードを書き出してみよう。

まとめ

フクさん
フクさん

まとめだよ。

  • 必要なタイマハンドラは2つ
    • FMU処理用とmatplotlib描画用。
    • 描画用側の負荷が高いので、こっちは長めの周期で実施。
  • FMU処理用タイマハンドラ内で時間関連の演算が入るため、タイマハンドラ外で下準備が必要。
  • Masterの初回呼び出し時のオプションと2回目以降で変える必要がある。
    • initializeオプション。

バックナンバーはこちら。

コメント

タイトルとURLをコピーしました