はじめに
前回、Myo の記事について書きました。
この時点では筋電の生値が未だ取れない、と書いたのですが、公式ブログで生値が取れるようになったことが発表されましたので試してみました。
環境
- Mac OS X Yosemite 10.10.1 / Windows 8.1
- Unity 5.0.0b14 / 4.6.0f3
- Myo SDK v0.8.0
サンプルを試してみる
最新の SDK は以下よりダウンロードします。
Connect App も同時に最新のものにしておきます。
ダウンロードすると以下のように bin
ディレクトリの中に emg-data-sample
が増えており、ここで筋電の生値がどんな感じで取れるか見ることが出来ます。
力を抜いている時
力を入れている時
Unity で使ってみる
リファレンス見てみます。
新しく onEmgData()
が加わり、整数型で 8 個のデータ(8 個のセンサの値)が返ってくることが分かります。しかしながら SDK に同梱されている MyoUnity.unitypackage
のサンプルには、これにアクセスするインターフェースがありません。
幸い構造自体は前回のエントリで書いたようにシンプルになっています。そこで適宜 libmyo.h
などを参照しながら libmyo.cs
を拡張したり、足りないイベントや API をポチポチ追加しながら自前でバインディングをしました。ついでに、対応されていなかった RSSI についても追加しておきました。
そのうち公式が対応すると思いますが、それまでのつなぎとしてご自由にお使い下さい。
デモ
Download
追記(2014/12/24)
GitHub にあげました。
サンプルコード
サンプルコードは以下になります。
using UnityEngine; using System; public class RssiAndEmgGUI : MonoBehaviour { public GameObject myo; private ThalmicMyo thalmicMyo_; private ThalmicMyo thalmicMyo { get { return thalmicMyo_ ?? (thalmicMyo_ = myo.GetComponent<ThalmicMyo>()); } } void Start() { // Enabled にするとデータが降ってくる、Disabled だと降ってこない(デフォルト) thalmicMyo.SetStreamEmg(Thalmic.Myo.StreamEmgType.Enabled); } void Update() { // RSSI の値を更新する thalmicMyo.RequestRssi(); } void OnGUI() { if (thalmicMyo != null) { // rssi は sbyte、emg は sbyte[8] で 8 個ある各センサの値を格納 GUI.Label(new Rect (12, Screen.height - 100, Screen.width, 100), "RSSI: " + thalmicMyo.rssi + "\n" + "EMG: " + string.Join(", ", Array.ConvertAll<sbyte, string>(thalmicMyo.emg, x => x.ToString())) ); } } }
おわりに
強く握っているかどうか位なら取れそうです。そのままだとノイズが大きいので適宜フィルタを掛けて見ながらいろいろ試してみようと思います。