Myoを自分の環境で動かしてみた。

半年前にpre-orderしたMyoが先週ようやく届いたので、次の作品に使用するためにいろいろ試しています。

 

相変わらずプログラミングくそ初心者のトライアル・アンド・エラーなので参考までに。

 

まず、いつも使用しているopenFrameworksで使用しようと思い、addonを探してみるとofxMyoがある。

eddietree/ofxMyo · GitHub

ただ、これではどうもWindowでしか使えない模様。

代わりにこういうのがあった

mattfelsen/ofxMyoWebSockets · GitHub

WebSocketsを介してデータをやり取りするらしい。

今回はなるべくシステムを1つにまとめたいので(?)、これはパス。

使ってみたけど、全然わからんかった

 

公式のDeveloper Forumではご丁寧に、アドオンとかブリッジとか(?)がまとめられてた。

Thalmic Labs Developer Forum / Tools and Bindings / List of Unofficial Tools and Bindings

みんなすごい…

oFですぐ使えそうなものがなかったから、前々から気になってたCinderのBlockもあるみたいだしCinderを使ってみようかなと思ったものの、これも途中で断念。自分無能。

 

公式のSDKページを見てみたらC++での使用法について詳しく書いてたので読んでみる。

Myo SDK 0.8.0: The Myo SDK

APIとか書かれても使い方わからないです…勉強します…

 

とりあえず、SDKをダウンロード

Thalmic Labs - Makers of Myo gesture control armband

oFのprojectGeneratorで作ったプロジェクトのframeworksの中にmyo.frameworkをドラッグアンドドロップ

プロジェクトフォルダにコピーするかどうか、選択肢があるのでそこはチェックを入れといたほうがいいかも。

その次はこのページの画像に従ってセッティングを変更。

Myo SDK 0.8.0: The Myo SDK

Myo

 ∟Myo SDK Manual

   ∟The Myo SDK

     ∟Building Applications With The Myo SDK

       ∟Building C++ Applications With The Myo SDK

この階層の画像を参照しました。

 

そんで、とりあえずexampleもあるみたいなので、projectGeneratorでペロペロ〜っと作ったプロジェクトのmain.cppにexampleのhallo-myo.cppの中身をペロペロ〜っとコピペして起動。

無事ビルドできました。

 

まあ、ここからoFにhallo-myo.cppを取り入れようとして失敗しまくって、最終的には、Myoのジャイロセンサー/ロック・アンロック/手の形(動き)4種類を取得できるようになったものの、oFのdraw()画面には虹色クルクルが出てしまう。という症状が発生。

未だに解決されてません。

おそらくmainの戻り値同士が干渉してるんじゃないかなと踏んでる。

 

そしてつい一昨日にSDK v0.8.0が出たので早速DL。

その際にFarmwareもDLして

Thalmic Labs - Makers of Myo gesture control armband

 

このページに従ってMyoのFarmwareをアップデートしました。

Myo - Firmware Update

 

そんで、v0.8.0からexampleに増えたemg-data-sample.cppを試してみようということでhallo-myo.cppのときと同じようにペロペロ〜っとoFに打ち込んでみたらエラーが…

どうやらXcodeではarrayをincludeできない模様。

 

いや、できないって言われても、そんな困りますよ…って思いながらいろいろと調べてみたところ、Xcodeでは

#include <array>を#include <tr1/array>に変えるか、コンパイルC++11に変えるかしないといけない模様。

後者も試してみたけど、結果できなかったのでここではスルー。

 

arrayをtr1/arrayに変えると次はclassの一番下

std::array<int8_t, 8> emgSamples;

std::tr1::array<int8_t, 8> emgSamples;

に変更する必要がある。

さらに、

void onUnpair(myo::Myo* myo, uint64_t timestamp)
{
emgSamples.fill(0);
}

この.fill(0)を変更しろとのこと。

libstdc++: Member List

ここ見る限りではstd::tr1::arrayにもfill()はあるんだけどな…

 

まあ、onUnpair()って関数だし、ロバスト考慮してちゃんとオフにしなきゃいけないなってなった時にまたfill()については詳しく調べることにして、今回は適当にbegin()に。

ビルドするととりあえず動くし、各パーツからの筋電をmappingしなおした値も届くからいいかなと思います。

 

ちなみにoFの中に打ち込んだら、こちらもdraw()ウィンドウが虹色クルクル。この対処法もちゃんと考えないといけないな…

 

とりあえず、現状こんな感じです。

 

日本語どころか英語の情報もあまり多くはない(少なくはないけど)からいろんなところを参照して勉強になってるけど、いかんせん時間がかかる…