SKATEBOARD x TECKNOLOGY

スケボーアプリとデバイスを作るぜ。

スケートの動きで取れるデータ

スケートデバイスの製作で今取り組んでいるのは、モーションの動きを取るべき場所がどこかを調査することです。

スケートで使われる筋肉は主に体幹部分です。体の軸を中心にデッキを操作することで色々なトリックをメイクするのですが、軸となる部分にセンサーを取り付ければそれで十分なデータが取れるのかというのが悩みどころです。

 

最初は腰にセンサーを取り付ければ体の傾き、加速度を取ることで動きのデータを分析できると思っていました。

f:id:oageagexx20:20170520160725j:plain

 

クリップについているのはTWE LITE 2525Aです。ベルトを挟んで取り付けます。

raspberry piについているのがモーションセンサー受信機のMONOSTICKです。

 

3軸の方向とは

TWE LITEが立てた状態で読み取られているから x軸は左右で、y軸は上下、z軸は前後の動きになる

f:id:oageagexx20:20170520224328j:plain

 

 

モーションデータを取ってみる

ひとまずスケボーに乗ってプッシュしたりオーリーしたりしてx、y、zの3軸の動きのデータをgnuplotに表示させて見ました。以下のコードです(TWE LITE2525の無線タグアプリを使ってみるのscriptをそのまま使ってます)

graph.py

#!/usr/bin/env python

#encoding=utf-8

 

import serial

import threading

import sys

import time

import Gnuplot

 

argv = sys.argv

argc = len(argv)

 

gp = Gnuplot.Gnuplot()

 

def mThread(ser):

# UARTの出力を読み込んで様々な処理を行う(実質メイン関数)

gp( "set grid" )

x = [0]*1024

y = [0]*1024

z = [0]*1024

ntime = [0]*1024

stime = time.time()

 

while True:

# UARTを読み込んでリスト化(配列に代入)

line = ser.readline()

field = line.strip()

sline = field.split(';')

length = len(sline)

 

# 加速度データが来たらグラフに出力

if length == 16 and  sline[11] == "X":

print field

x[0] = float(sline[12])/100.0

y[0] = float(sline[13])/100.0

z[0] = float(sline[14])/100.0

 

# 現時刻の計算

ntime[0] = time.time()-stime

 

# グラフのパラメータ設定

xd = Gnuplot.Data( ntime, x, with_="lines", title="X Axis")

yd = Gnuplot.Data( ntime, y, with_="lines", title="Y Axis")

zd = Gnuplot.Data( ntime, z, with_="lines", title="Z Axis")

 

# プロット

gp.plot(xd,yd,zd, xrange="[%f:%f]" % ( ntime[128], ntime[0] ))

 

# 配列の更新

i=1022

while i >= 0:

x[i+1] = x[i]

y[i+1] = y[i]

z[i+1] = z[i]

ntime[i+1] = ntime[i]

i -= 1

 

if __name__ == "__main__":

# 引数がある場合、引数で指定したデバイスを用いる

if argc != 2:

ser = serial.Serial( "/dev/tty.usbserial-MWF60VP", 115200, timeout=1 );

else :

ser = serial.Serial( argv[1], 115200, timeout=1 )

 

# グラフを描画する関数を別スレッドで実行

t = threading.Thread( target=mThread, args=( ser, ) )

t.setDaemon(True)

t.start()

 

# q を入力すると終了

while True:

key = raw_input()

if key == "q":

break

 

ser.close()

gp.close()

 

 

 結果は以下の通り。

 

f:id:oageagexx20:20170520220701p:plain

 

 

プッシュからのオーリー〜そのまま流しのデータです。

テールを弾いた瞬間の加速度の値が上がっています。進行方向とジャンプした際の力を計測できているみたいですね。流してる状態は特に体は動かしていないので水平な値が表示されています。

 

続いて 止まった状態で何回かショービットをしてみました。

f:id:oageagexx20:20170520221055p:plain

 

真ん中部分の値ですが、あまり3軸とも数値が上がっていませんね。

グラフから読み取れることはショービットはあまり力を加えて行わないトリックだということですかね。

 

f:id:oageagexx20:20170520221659p:plain

加速度センサーの仕様は1秒間に50回(サンプリング周波数:50Hz)のため細かくデータを取ってますね。

 

 

 

とりあえずテストして見た結果

まだまだデータにノイズが多く、色々な動きでどう計測できるかは検証が必要です。トリックをした計測部分だけを切り出せるよう フーリエ変換とかすればより正確に計測できるかも。フリップ系のトリックやギャップやランプなどのセクションでの動きや、上級者と初心者でデータで違いが表れるかなどを検証していきます。

 

 

go skate.