バックナンバーはこちら。
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による末尾指定が便利。
バックナンバーはこちら。
コメント