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

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

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

はじめに

必要なタイマハンドラ2つのうちFMU_handlerことFMUシミュレーション処理側は実装。
残りはplot_handlerことmatplotlibリアルタイム更新処理の実装が必要となる。

今回は、このplot_handlerの実装について。

登場人物

博識フクロウのフクさん

指差しフクロウ

イラスト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

plot_handler

フクさん
フクさん

じゃ、今回はplot_handlerことmatplotlibリアルタイム更新処理の話になる。
早速だけどコードは以下。

def plot_handler():
        if pausebln.get() == False:
            ax.lines[0].set_data( np.array(deque_time), np.array(deque_target) )
            ax.lines[1].set_data( np.array(deque_time), np.array(deque_voltage) )
            ax.lines[2].set_data( np.array(deque_time), np.array(deque_speed) )
            ax.lines[3].set_data( np.array(deque_time), np.array(deque_loadTorqueStep_tau) )
            ax.lines[4].set_data( np.array(deque_time), np.array(deque_current) )
            if cpuloadbln.get():
                ax.lines[5].set_data( np.array(deque_time), np.array(deque_cpuload) )
            ax.relim()                  # recompute the data limits
            ax.autoscale_view()         # automatic axis scaling
            ax.set_ylim(-70,200)
            ax.set_xlim(deque_time[-1]-8,deque_time[-1])
            canvas.draw()
        
        root.after(200, plot_handler)

plot_handler詳細説明

太郎くん
太郎くん

流れとしては以前実験したリアルタイム描画と一緒だけど、
扱ってるデータがdequeになってるところが大きな違いかな?

フクさん
フクさん

そうだね。

太郎くん
太郎くん

dequeを一旦np.arrayに直さないといけないのか。

フクさん
フクさん

ここは多分無くても動くかな。
どっちにしても内部でnp.arrayに変換してるみたいだし。
ここでは明示する目的で書いてるだけだな。

太郎くん
太郎くん

あとは・・・。
ax.set_xlim(deque_time[-1]-8,deque_time[-1])
添え字が-1になってるのって何を示してるんだっけ?

フクさん
フクさん

Pythonの場合、添え字を-1を指定すると、その配列やコンテナの末端を示すことになる。
dequeなんかは要素数を固定していないので、割と重宝する記載方法だな。

太郎くん
太郎くん

なるほど。
それは便利そうだ。

太郎くん
太郎くん

if cpuloadbln.get():
の部分は例のCPU負荷をグラフとして描画するかしないかのチェックボックスだよね。

フクさん
フクさん

そうそう。
FMU_handler側で毎回実時間の計算をしているので、それをdequeに入れている。
負荷が上がればそのFMU_handler間の時間が間延びするはずなので、
それをCPU負荷と解釈して表示するつもりだ。

太郎くん
太郎くん

まぁ負荷が上がれば周期も伸びるだろうから、
シンプル且つ確実な確認方法かもね。

フクさん
フクさん

まだ細かいところは残ってはいるが、
ここら辺で一旦動作確認と行こうか。

まとめ

フクさん
フクさん

まとめだよ。

  • plot_handlerことmatplotlibリアルタイム更新処理のコード提示。
    • 以前のリアルタイム描画実験との差は以下。
      • deque使用。
      • plot時にnp.arrayに変換しているが無くてもOK。
      • CPU負荷描画チェックボックス確認。
  • dequeのように要素数が分からない場合は-1による末尾指定が便利。

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

コメント

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