Pythonによる筋肉ピクピク解析

![kin.jpg](https://qiita-image-store.s3.amazonaws.com/0/78052/c1eba9b2-8cf0-2ae8-d519-3de7fb2bcce8.jpeg)

(from pixabay)

IT業界に114514人いると言われる筋トレ好きのみなさま

こんにちは、alf++です。

今日は筋肉、特にピクピクする筋肉の話をしようとします。
もちろんコードはPythonで書きます。
さあ、筋肉の話をしましょう。

#ITエンジニアと筋肉
ITエンジニアはとても筋トレが大好きです。
しかし、筋トレをITで支えようとする人が少なくて、
筆者はとても悲しいです。
そこで本記事では筋トレをITで支えられるように
まず、筋肉のピクピクする強さとタイミングを数値化できる筋電センサとその解析方法をご紹介します。


#筋肉のピクピクと筋電センサによる数値化
筋肉は一体なぜピクピクするのでしょうか。
筋肉は人間の脳からの運動指令を電気信号という形で受け取ります。
この電気信号の強さに応じて筋肉は強く収縮します。逆に電気信号がないときは弛緩します。[^1]
したがって、筋肉のピクピクは筋肉に伝わった電気信号を見てあげれば、数値化できることになります。
![command.png](https://qiita-image-store.s3.amazonaws.com/0/78052/8ba83a7a-206c-cc8a-4015-1c5a3657094a.png)

幸いなことに筋肉に伝わった電気信号は筋肉から皮膚表面にも漏れ出すので、
この漏れ出した信号を測定してあげることで筋肉のピクピクを数値化できます。
この現象を応用した測定器を「筋電センサ[^2]」と呼びます。
![trigno-lab.jpg](https://qiita-image-store.s3.amazonaws.com/0/78052/ad3e006d-6390-ade8-eddb-4096cb74119b.jpeg)
(DelsysのHPより引用[1])


#Pythonで筋肉のピクピクを可視化
筋電センサの値から実際に歩いているときのふともものピクピク具合を見てみましょう。
まず、筋電センサのデータセットを以下のサイトからダウンロードしてきます。
http://archive.ics.uci.edu/ml/datasets/EMG+dataset+in+Lower+Limb

この中で、1Nmar.logを可視化します。
可視化するコードは以下のとおりです。

```VisulizeEMG.py
import matplotlib.pyplot as plt
import pandas

FILE_PATH="../SEMG_DB1/N_TXT/1Nmar.txt"
HEADER_SIZE=6

data=pandas.read_csv(FILE_PATH,skiprows=HEADER_SIZE,sep="\t")
data.columns=["RF","BF","VM","ST","FX"]

plt.plot(data["RF"])
plt.xlabel("Time[ms]")
plt.ylabel("EMG[V]")
plt.show()
```

実行した結果が以下のとおりです。

![figure_1.png](https://qiita-image-store.s3.amazonaws.com/0/78052/81f29852-c435-c420-1ed9-6cd8d01080b4.png)

上記の図を筋電図といいます。
なんだかスイッチのようにオンオフというよりかは、
音声みたいな波に見えます。
実は筋肉に伝わっている信号は直流でなく交流となっています。
したがって、ピクピク具合を見てあげるにはセンサデータの処理が少々必要となってきます。

#Pythonで筋肉のピクピクする強さとタイミングを計算
交流信号の強さを見るときには指標として平均二乗平方根(Root Square Means;RMS)を使うことが多いです。
そこで筋肉のピクピク具合の指標をここでは平均二乗平方根を使って計算します。
コードは以下のとおりです。
このコードで注意してほしいことは通常の平均二乗平方根とは違い、
移動平均二乗平方根を使用している点です。

```VisualizeStrength.py
import matplotlib.pyplot as plt
import pandas

import numpy as np

WINDOW_SIZE=200

#http://stackoverflow.com/questions/8245687/
# numpy-root-mean-squared-rms-smoothing-of-a-signal
# をベースに修正
def window_rms(a, window_size):
  a2 = np.power(a,2)
  window = np.ones(window_size)/float(window_size)
  return np.sqrt(np.convolve(a2, window,"same"))

FILE_PATH="../SEMG_DB1/N_TXT/1Nmar.txt"
HEADER_SIZE=6

data=pandas.read_csv(FILE_PATH,skiprows=HEADER_SIZE,sep="\t")
data.columns=["RF","BF","VM","ST","FX"]

RMS=window_rms(data["RF"],WINDOW_SIZE)

plt.plot(data["RF"],color="lightgray")
plt.plot(RMS)
plt.xlabel("Time[ms]")
plt.ylabel("EMG[V]")
plt.show()
```

それで、実際に実行すると以下の図が出ます。

![figure_1.png](https://qiita-image-store.s3.amazonaws.com/0/78052/56d34392-ec37-2af6-5b0d-ef9b9c7bdaa6.png)

青い線が大きいほど、ぴくっとなっていることを意味します。
一定周期でピクピクしているので、
歩いているときの筋肉の様子がよくわかります。

#筋肉のピクピクをITに応用した例
この解析を応用すると、例えば、ピクピクの活動に応じて
ドローンの操作を行うなどといったことができるようになります。
![スクリーンショット 2016-12-10 23.08.56.png](https://qiita-image-store.s3.amazonaws.com/0/78052/48258a81-12cd-4a30-6845-5bc4ea027436.png)
![スクリーンショット 2016-12-10 23.31.38.png](https://qiita-image-store.s3.amazonaws.com/0/78052/d2283776-378a-617e-8ece-519b266a50f2.png)
（DelsysのHP[2]より引用）

この研究ではリハビリテーションをゲームとして行うために
開発されているそうです。
またVR元年（だった）2016年では
VR空間にいるキャラクターの腕を操作するコントローラーとしても使われているそうです。
[![ようつべ動画](http://img.youtube.com/vi/1f_bAXHckUY/0.jpg)](http://www.youtube.com/watch?v=1f_bAXHckUY)
（クリックするとYouTubeにあるデモ動画へ移動します。）

このように筋肉は無限の可能性を秘めているのです。

#まとめ
ITエンジニアはとても筋トレが大好きです。
しかし、筋トレをITで支えようとする人が少なくて、
筆者はとても悲しいです。
そこで本記事では筋トレをITで支えられるように筋肉のピクピクする強さとタイミングを
数値化できる筋電センサとPythonによる初歩的な解析方法を紹介しました。
Pythonによる解析を使えば、ユーザインタフェースやリハビリテーションに応用することができます。
しかし、筋トレに応用している例はとても少ないように思えます。
今後、ITエンジニアの人がEMGセンサを使って筋トレをよりよくするアプリケーションを
開発してくれることを切に祈っています。


__ここまで書くなら、お前が作れよとか言わないで__

# 参考文献
[1] http://www.delsys.com/products/wireless-emg/trigno-lab/
[2] http://www.delsys.com/education/videos/research/serious-games/


[^1]: もちろん脊髄反射と言った脊髄から電気信号が出ることもあります。詳しくはカンデル神経科学あたりにはありそう。
[^2]: 厳密に言うと、表面筋電（surface EMG;sEMG）センサと呼びます。