これは学生エンジニア Advent Calendar18日目の記事です.
『スターウォーズ フォースの覚醒』公開日ということで,Goを使ってフォースに目覚めるための方法を紹介します.
目覚めた結果
このような感じで,フォースを利用することで手元のコンピュータを操作できます.
必要なもの
Goは入っている前提で
Neurosky MindWave Mobile ($99.99)
Bluetooth接続が可能なシングルチャンネルの脳波計です.公式にて$99.99で買うことができ,また国内でも1万円後半ほどで転売されているものを探すことができます.かなり遊べます.
Gobot
Gobotは,Goでフィジカルコンピューティングを実現するためのフレームワークです.MindWave Mobileだけでなく,Arduino, Leap Motion, Pebbleなど様々な機器に対応しており,シリアルポート制御から値のパースまでよしなに行ってくれる素敵フレームワークです.
MindWave Mobileを使用する今回の場合,公式の通り下記コマンドでインストールすることができます.
go get -d -u github.com/hybridgroup/gobot/... && go install github.com/hybridgroup/gobot/platforms/neurosky
サンプル
package main
import (
"github.com/everdev/mack"
"github.com/hybridgroup/gobot"
"github.com/hybridgroup/gobot/platforms/neurosky"
)
func main() {
const meditationThreshold uint8 = 70
gbot := gobot.NewGobot()
adaptor := neurosky.NewNeuroskyAdaptor("neurosky", "/dev/tty.MindWaveMobile-DevA")
neuro := neurosky.NewNeuroskyDriver(adaptor, "neuro")
work := func() {
gobot.On(neuro.Event("meditation"), func(v interface{}) {
med := v.(uint8)
if med != 0 && med > meditationThreshold {
// 以下に任意の操作 今回はAppleScriptでKeynoteスライドおくり
mack.Tell("Keynote", `show next`)
}
})
}
robot := gobot.NewRobot("brainBot",
[]gobot.Connection{adaptor},
[]gobot.Device{neuro},
work,
)
gbot.AddRobot(robot)
gbot.Start()
}
デモで使用したプログラムがこちらになります.
瞑想度(meditation)の値を一秒間に一度取得し,瞑想度が閾値を超えたらKeynoteスライドを次に送ります.
心身の平穏でフォースの能力を引き出す感じです.ジェダイっぽい.
つまり快適にスライドを操作するためには,自由に心身の平穏を作り出せるよう修行すれば良いのです.
手っ取り早く瞑想度を上げたい場合,目をつむると簡単に瞑想度が上がります
解説
NewNeuroskyAdaptor(name string, port string)
の第二引数にて,シリアルポートを指定するのですが,自分の環境の場合,MindWaveMobileのポートが/dev/tty.MindWaveMobile-DevA
でした.お使いのOSに合わせて指定してください.
work
に定義した関数が,NewRobot(name string, v ...interface{})
にてデバイスの実行準備完了時に一度だけ呼ばれます.そこで,work内に,各イベントのコールバック登録をガシガシと書いていきます.
コールバックはいくつも登録可能ですが,今回の用途では一つの脳波特徴量で十分なので,サンプルでは一つのみの登録となっています.
今回は,ジェダイの騎士っぽく瞑想度(meditation)をイベントとして利用します. meditationは一秒に一度,瞑想度を0~100の値で取得します.他にも集中度(attention), 脳波生データ(wave)も取得することができます.
動作の流れとして,mediationの値が取得できたら,閾値と比較し,閾値より大であれば任意の動作を行うという流れになっています.
閾値の条件に加えて0でない条件が加わっていますが,これは動作中稀にmediation = 0
が入ることがあるため,その応急処置です.また,閾値のmediationThreshold = 70
は完全に自分の環境に合わせた決め打ちなので,環境に合わせてちょうど良さそうな値を入れてください.
精度が気になる方は,脳波生データ(wave)を使って自前で特徴量を抽出してみても良いかもしれません.こちらは512 Hzのサンプリング周波数で脳波生データを取得することができます.
スライドをおくるために使用したmack.Tell(application string, commands ...string)
は,GoからAppleScriptを手軽に扱うためのラッパーパッケージです.詳しくは以下URLにて
https://github.com/everdev/mack
おわりに
Gobotを使うことで,低レベルI/Oを気にすることなく,かなり快適かつ適当に脳波計を扱うことができました.他にもARDroneやArduino,Raspberry Piなどをほぼ同様のインタフェースで扱うことができ,かなり快適にIoTなプログラミングができます.
API実装やCLI実装など,ややインフラ寄りで固い印象のあるGoですが,ゲームプログラミングやモバイルアプリ開発,今回のIoT分野など,色々なジャンルで活躍できそうですね.
では,良いGoライフを!
May the Gopher be with you! ʕ ◔ϖ◔ʔ