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

これは学生エンジニア 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! ʕ ◔ϖ◔ʔ


『 Go 』Article List
Category List

Eye Catch Image
Read More

Androidに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

AWSに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Bitcoinに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

CentOSに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

dockerに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

GitHubに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Goに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Javaに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

JavaScriptに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Laravelに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Pythonに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Rubyに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Scalaに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Swiftに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Unityに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Vue.jsに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Wordpressに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

機械学習に関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。