センサの出力値を上手に保存する #2

前回記事をご覧になっていない方は前回記事もご覧ください。

1.はじめに

 #1ではUI表示を行わず、gifを作成するのみだった。それは表示する環境がなかったからである。環境作った。表示する。

2.UbuntuにGUIを

 XLaunchを用いた。次の記事を参考にした。

 XLaunchを起動する際に、DISPLAY NUMBERを指定すれば更にスムーズに進む。これでmatplotlibのプロットをウィンドウで表示できる。

3.プログラム終了

 前回、プログラムの終了時にgifを作成するプログラムを書いた。しかし、無限ループにした際に、Ctrl+Cでしか終了できず、強制終了になるためgifは作成できなかった。そのためKeyboardというライブラリを用いて、キーボードから終了命令を送ることを考えたが、できなかったのでやめた。
 結局、Pythonのtry文を使い、KeyboardInterrupt例外処理の中でgifを作成することでCtrl+Cで終了した際にgif作成を行うようになった。

4.プログラムと実行結果

import math
from pickletools import optimize
import numpy as np
import matplotlib.pyplot as plt
from PIL import Image

pi = float(3.14159265358979)
s_t = float(0.2) #サンプリング時間
i = int(0)
t = []
result = []
imgs = []

fig, ax = plt.subplots(1,1)
ax.set_xlim(0,2)
ax.set_ylim(-1,1)

while True:
    try:
        t.append(i*0.2)
        result.append(np.random.uniform(-1,1))
        ax.plot(t,result)
        fig.savefig("data/test"+str(i)+".png")
        img = Image.open("data/test"+str(i)+".png")
        imgs.append(img)
        if i>=5:
            ax.set_xlim(i*0.2-1,i*0.2+1)
        i=i+1
        plt.pause(0.2)
    except KeyboardInterrupt:
        imgs[0].save("animation.gif", save_all=True, append_images=imgs[1:], optimize=False, duration=100, loop=0)
        break
    except:
        pass

図1 プログラム

 無限に続く時系列データをX軸が追従するように変更してある

図2 実行画面

図3 保存したgif

以上

この記事が気に入ったらサポートをしてみませんか?