LoginSignup
22
20

More than 5 years have passed since last update.

Go言語で実現するフォースの覚醒 (Gobotで脳波をなんとかする)

Last updated at Posted at 2015-12-18

これは学生エンジニア Advent Calendar18日目の記事です.
『スターウォーズ フォースの覚醒』公開日ということで,Goを使ってフォースに目覚めるための方法を紹介します.

目覚めた結果

gopher_eeg.gif

このような感じで,フォースを利用することで手元のコンピュータを操作できます.

必要なもの

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! ʕ ◔ϖ◔ʔ

22
20
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
22
20