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