MemoryEnhancer > MEGLV > udpGraph_180218.ipynb > v0.1, v0.2 > ESP8266+MPU-9250測定データの確認用リアルタイムグラフ出力

```txt:動作環境1
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
```

```txt:動作環境2
ESP8266
MPU-9250
パンチングレザー実装
```

プロジェクト開始: https://qiita.com/7of9/items/4077c92b9a773e054193

### 処理概要

- ESP8266 + MPU-9250による測定データがUDP通信で7000ポートに入ってくる
    - [MemoryEnhancer > MEUI > ESP8266_180121.ino > v0.1-v0.4 > MPU-9250からQuaternionを取得し、UDP送信する > 回路 + コード + 動作確認](https://qiita.com/7of9/items/64884e449fd3c425efeb)
        - 上記の実装機版を[こちら](https://qiita.com/7of9/items/4c2690973459bbd8a69c)に記載のようにパンチングレザーに実装済
- データ例
    - `qtn,-0.04,0.04,-0.60<CR><LF>`
- そのデータを元にコマンド処理をするため、リアルタイムグラフ出力する
- 描画はeog(Eye of GNOME)が担当

### code v0.1

refactorしてない。

```py:udpGraph_180218.ipynb
import numpy as np
import matplotlib.pyplot as plt
import time
import sys
import socket as skt

'''
v0.1 Feb. 18, 2018
    - save to png
    - add udpReceiver()
'''

'''
TODO: refactor
'''

# on Python 3.5.2

RECV_TIMEOUT_MSEC = 300
MAX_DATA = 50
TRIM_DATA = 5

fig = plt.figure()
ax1 = fig.add_subplot(1, 1, 1)
ax1.set_ylim(-1.0, 1.0)
xs = []
ys1 = []
ys2 = []
ys3 = []
graph1, = ax1.plot(xs, ys1)
graph2, = ax1.plot(xs, ys2)
graph3, = ax1.plot(xs, ys3)

def udpReceiver(port_in, xs, ys1, ys2, ys3):
    inst = skt.socket(skt.AF_INET, skt.SOCK_DGRAM)
    inst.bind(('', port_in))
    inst.setblocking(0)
    cnt = 0
    while True:
        try:
            data, adr = inst.recvfrom(RECV_TIMEOUT_MSEC)
        except skt.error:
            pass
        else:
            data = data.decode("utf-8")
            data = data.replace("\r\n","")
            # ['qtn', '-0.04', '0.04', '-0.60']
            data = data.split(",")
            if len(xs) > MAX_DATA:
                del xs[0:TRIM_DATA]
                del ys1[0:TRIM_DATA]
                del ys2[0:TRIM_DATA]
                del ys3[0:TRIM_DATA]
            xs += [time.time()]
            ys1 += [data[1]]
            ys2 += [data[2]]
            ys3 += [data[3]]
            graph1.set_data(xs, ys1)
            graph2.set_data(xs, ys2)
            graph3.set_data(xs, ys3)
            ax1.set_xlim(min(xs), max(xs))
            fig.savefig("graph.png")  # for realtime display on the Eye of GNOME
            
            cnt += 1
            #if cnt > 5:
            #    break  # debug

udpReceiver(7000, xs, ys1, ys2, ys3)

plt.show()

```

### 結果

動画の時間が長いためYoutubeに置いた。

https://www.youtube.com/watch?v=j6xQ61EnwJc

- 00:20頃: グローブを装着
- 00:40頃から10秒おき: 手の甲を上にする動作と、手のひらを上にする動作の繰り返し
- 01:25頃から10秒おき: 手を天頂角0度に上げた状態と、天頂角180度に下げた状態の繰り返し
- 02:10頃から: 手を机の上に置いた状態
- 02:30頃から: 手(肘から先)を水平方向に回転させた状態 (正方向と逆方向の繰り返し)

no calibrationでもコマンドをいくつか識別できるだろうか。


### code v0.2

```py:udpGraph_180218.ipynb
import numpy as np
import matplotlib.pyplot as plt
import time
import sys
import socket as skt

'''
v0.2 Feb. 18, 2018
    - refactor
        + add drawGraph()
v0.1 Feb. 18, 2018
    - save to png
    - add udpReceiver()
'''

# on Python 3.5.2

RECV_TIMEOUT_MSEC = 300
MAX_DATA = 50
TRIM_DATA = 5
NUM_SERIES = 3


def drawGraph(ax1, data, xs, yss):
        # 1. trim old data
        if len(xs) > MAX_DATA:
            del xs[0:TRIM_DATA]
            for idx in range(NUM_SERIES):
                del yss[idx][0:TRIM_DATA]
        # 2. add data
        xs += [time.time()]
        for idx in range(NUM_SERIES):
            yss[idx] += [data[idx]]
            graphs[idx].set_data(xs, yss[idx])
        if min(xs) == max(xs):
            return
        ax1.set_xlim(min(xs), max(xs))
        # for realtime display on the eog(Eye of GNOME)
        fig.savefig("graph.png")


def udpReceiver(port_in, xs, yss):
    inst = skt.socket(skt.AF_INET, skt.SOCK_DGRAM)
    inst.bind(('', port_in))
    inst.setblocking(0)
    while True:
        try:
            data, adr = inst.recvfrom(RECV_TIMEOUT_MSEC)
        except skt.error:
            pass
        else:
            data = data.decode("utf-8")
            data = data.replace("\r\n", "")
            # ['qtn', '-0.04', '0.04', '-0.60']
            data = data.split(",")
            drawGraph(ax1, data[1:], xs, yss)


fig = plt.figure()
ax1 = fig.add_subplot(1, 1, 1)
ax1.set_ylim(-1.0, 1.0)
xs, yss, graphs = [], [], []
for idx in range(NUM_SERIES):
    yss += [[]]
    graphs += [ax1.plot(xs, yss[idx])[0]]

udpReceiver(7000, xs, yss)

```