Bash
GUI
matplotlib
borgSensorSystem1
timerEvent

bash (Matplotlib ) + eog > リアルタイム画像表示処理

動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 16.04 LTS desktop amd64
TensorFlow v1.2.1
cuDNN v5.1 for Linux
CUDA v8.0
Python 3.5.2
IPython 6.0.0 -- An enhanced Interactive Python.
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
scipy v0.19.1
geopandas v0.3.0
MATLAB R2017b (Home Edition)
ADDA v.1.3b6

前置き

  • PyQtを知らない
  • signal/slot/event/etcを学習するコストをかけてまでしたいことは今はない
  • PyQtとPySideはライセンス的にどちらを選択するか
  • UDPでデータを受信して画像表示したいだけ

学習コストが少なく、自分の希望機能を実装する方法はないか。
以下を思いついた。

使用機能

画像生成部

Quaternion(もしくは三次元の加速度(ax,ay,az))をUDPで受信し、グラフ画像として出力する。
ppm形式出力は簡単。他の形式もPythonのライブラリを使って適宜実装する。

画像表示部

Ubuntu(またはCentOS)においてはeogという画像表示プログラムが使用できる。

code

画像生成部

とりあえずImageMagickを使った仮コードは以下の通り。
参考: ImageMagick > 画像をずらす (+ 画像サイズを拡大) > convert green.png -page +0+20 -background none -extent 40x40 -flatten green_shift.png

image.pngというファイルでred, green, blueの色が5秒おきに切替わるというだけの実装。

change_image_180214_exec
#!/usr/bin/env bash

for idx in $(seq 1 100)
do
    for color in red green blue
        do
            echo $color
            convert -size 100x100 xc:$color image.png
            sleep 5
        done
done

画像表示

以下を実行する。

$eog image.png

結果

blue.png

green.png

red.png

使えそう。
100msec程度の画像変更も問題なさそう。

MemoryEnhancer用の入力UIであるESP8266+MPU-9250の調整用のソフトはこれでできるだろうか。

これは「UIとロジックの分離」の1例だろうか。

画像生成 > Matplotlib

bashの代わりにMatplotlibを使ってみる。
参考: Jupyter / matplotlib > 2Dイメージをファイル保存する > plt.savefig("foo.png") / ただし、plt.show()があると保存に失敗する模様

saveToFile_180215.ipynb
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.cm as cm
import time

for loop in range(100):
    data_1d = np.random.rand(22500)
    print(data_1d)
    data_2d = np.reshape(data_1d, (150,150))

    plt.imshow(data_2d, extent=(0,150,0,150),cmap=cm.gist_rainbow)
    #plt.show()

    plt.savefig("foo.png")

    time.sleep(1)

以下のような画像が1秒おきに更新されるようになった。

qiita.png

Matplotlibのplt.show()を繰り返し実行すると、画像のリアルタイム表示ではなく、画像が下に延々と追加されるようになる(下図)。
matplotlibでリアルタイム描画に記載のplt.pause(.01)を使っても下に延々と追加される。
このあたりも試したが結果は同じ。

この問題もあって、Matplotlibを使ったリアルタイム描画更新はあきらめていたが、上記の方法でリアルタイムの更新ができることが分かった。

qiita.png

link