LoginSignup
0
1

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-02-18
動作環境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
動作環境2
ESP8266
MPU-9250
パンチングレザー実装

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

処理概要

code v0.1

refactorしてない。

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に置いた。

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

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

code v0.2

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)

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1