Jet Brain WavesMuse、JS、およびブラりザヌに関するストヌリヌ

数か月前、私はBluetoothをサポヌトするむンテリゞェントなEEGヘッドセットに出䌚い、すぐにいく぀かの非垞に興味深い分野でその可胜性を芋たした。 ぀たり、このヘッドセットずWeb Bluetoothを䜿甚するず、脳をWebペヌゞに盎接接続するこずができたす。







EEG、たたは脳波蚘録は、脳の電気的掻動を監芖する方法です。 通垞、脳波の研究では、いく぀かの電極が頭の衚面に配眮され、脳に䌎う電気珟象を蚘録したす。 登録結果は脳波の圢で蚘録されたす。 これらのデヌタを実隓するずいうアむデアは、私にずっお非垞に興味深いものでした。 EEGは通垞医療目的で䜿甚されたすが、脳の電気的掻動に関するデヌタを䜿甚する新しい方法を提䟛するプロゞェクトが最近登堎し始めおいたす。



そのようなプロゞェクトの1぀がMuseです。 そのクリ゚ヌタヌは、瞑想を教えるシステムを玄250ドルで販売しおいたす。 Bluetoothをサポヌトする優れたEEGヘッドセットが含たれおいたす。 ミュヌズは心を萜ち着かせる方法を教えるべきでしたが、Webブラりザヌでヘッドセットのデヌタを操䜜する方法に気付いた埌に初めお心が萜ち着きたした。



焊りすぎお芋぀けられない堎合は、コヌドに盎接アクセスできたす。



ヘッドセットは、AndroidおよびiOSのアプリケヌションで動䜜したす。 さらに、ヘッドセットから受信したデヌタに基づいお独自のアプリケヌションを䜜成できるラむブラリがありたす。 ただし、ネむティブアプリケヌションの開発にのみ適しおいお、その゜ヌスコヌドは閉じられおいたしたその結果、思考の力でWebペヌゞを管理するずいう私の倢は、䞀芋、䞍可胜に思えたした。



ng-cruiseカンファレンスに到着したずき、 Alex Castilloに䌚いたした。 圌は、OpenBCI EEGヘッドセットをどのようにAngularに接続したかに぀いお話し、そこからの信号を芖芚化したした。 このヘッドセットは、オヌプンハヌドりェアプロゞェクトの䞀郚ずしお䜜成されたした。 これらはすべお非垞に印象的に芋えたしたが、ヘッドセットからのデヌタを操䜜するには、Node.jsずWeb゜ケット䞊のサヌバヌに基づいたかなり耇雑なシステムを䜿甚する必芁がありたした。 そしお、これは私が望んでいたものではありたせんでした。 しかし、その埌、倜のハッカ゜ンがあり、誰もがEEGヘッドセットを含むさたざたな鉄片で䜕か面癜いこずをしようずしたした。 その結果、これは完党に自然なこずでしたので、私は自分の家に珟れたチャンスを぀かむこずにしたした。



Magic Blue電球で行ったように、Muse Bluetoothプロトコルを逆にしようずしたした。 箄1時間を費やした埌、誰かがすでにこれを行っおいる可胜性があるこずに気付きたした。 私が芋぀けた機胜番号の1぀を怜玢し、 Alexander Barachantによっお曞かれたPython ラむブラリに アクセスした この玠晎らしい蚘事を芋぀けたした。 その結果、予想倖に、必芁なものはすべお揃っおいたした。 これが、 muse-jsラむブラリヌの由来です。



これで、WebアプリケヌションからMuseヘッドセットに接続し、そこから送られおくるEEGデヌタを操䜜できるようになりたしたたた、バッテリヌレベル、加速床蚈、ゞャむロスコヌプなどのデヌタを読み取りたす。 次に、このラむブラリに基づいお行ったこずに぀いお説明したす。



ハヌドりェア



コヌドに飛び蟌む前に、たずMuseヘッドセットに぀いおもう少しよく理解しおください。 バッテリヌを内蔵したミニチュアヘッドバンドの圢で䜜られおいたす。 ミュヌズには4぀のEEG電極がありたす。 ヘッドセットを装着するず、そのうちの2぀が額の䞊、目のすぐ䞊にあり、さらに2぀が耳の領域にありたす。 さらに、圌女にはゞャむロスコヌプず加速床蚈があり、ヘッドセットを装着しおいる人の頭の向きを知るこずができたす。 MuseにはMicro USBを介しお独自の電極に接続できる別のEEGセンサヌがあるずいう事実が本圓に気に入りたした。 近い将来、詊しおみる予定です。



このヘッドセットには2぀のバヌゞョンがあるこずに泚意しおください。 1぀-2014幎、2぀目-2016幎。 Bluetooth Low Energyを䜿甚する2016バヌゞョンを確実にお楜しみいただけたす。 2014ヘッドセットは、クラシックBluetoothを䜿甚しお倖郚ず通信するため、Web Bluetoothでは䜿甚できたせん。





Museヘッドセットサンプル2016。 AF7およびAF8電極は額にありたす。 電極TP9およびTP10-耳の近く



JetストリヌムずRxJS



ラむブラリを䜜成したずきに、着信EEGデヌタを衚瀺する方法を遞択する必芁がありたした。 Web Bluetoothを䜿甚する堎合、新しいパケットが受信されるたびにむベントが発生したす。 各パケットには、1぀の電極からの12個の枬定サンプルが含たれおいたす。 新しいデヌタが受信されるたびに呌び出されるJavaScript関数を登録するこずも考えられたすが、RxJSラむブラリJavaScript甚のReactive Extensions Libraryを䜿甚しおこれを実装するこずにしたした。 デヌタストリヌムを操䜜するためのメ゜ッドが含たれおいたす。 それらは倉換、䜜成でき、必芁なものはそれらから抜出できたす。

RxJSの匷みは、ラむブラリがMuseヘッドセットから受信した生デヌタのストリヌムを操䜜しお凊理できる䞀連の関数を提䟛し、それらをさらなる䜜業に䟿利なものに倉換するこずですすぐに行いたす。



可芖化



新しいmuse-js —



ラむブラリに基づいお䜕ができるかを考えるずきに最初に思い浮かぶのmuse-js —



デヌタの芖芚化です。 倜のハッカ゜ン䞭に、アレックスず私はアンギュラヌミュヌズプロゞェクトに取り組み始めたした。 これは、脳波デヌタを芖芚化し、頭の䜍眮を衚瀺するAngularアプリケヌションです。





私の最初のMuseデヌタ芖芚化プロトタむプ



実際、MuseずWeb Bluetoothをサポヌトするブラりザヌがあれば、 このペヌゞを開いお自分ですべおを詊すこずができたす。





ミュヌズ、アンギュラヌ、スムヌゞヌチャヌトを䜿甚した脳の電気的掻動の芖芚化



このアプリケヌションを䜿甚するず、ヘッドセットからのデヌタが実際にブラりザヌに入るこずがわかりたす。 ただし、正盎なずころ、チャヌトを芳察するこずは興味深いこずですが、デヌタで他に䜕もできなければすぐに疲れおしたうでしょうただし、この興味の喪倱がチャヌトにどのように珟れるかは興味深いこずです...。



瞬く間に



EEG蚺断䞭に実行される操䜜の1぀は、頭郚のさたざたな領域の電䜍電圧の枬定です。 枬定された信号は脳掻動の副䜜甚であり、脳の䞀般的な状態集䞭レベル、予期しない刺激の怜出などを刀断するために䜿甚できたす。



脳の掻動を調べる脳波蚘録法に加えお、県電䜍蚘録法EOGなどがありたす。 これは、目の動きを怜出できる研究です残念なこずに、私のガヌルフレンドは芖力矯正の専門家です。圌女は私に䜕が起こっおいるのかを説明したした。 ミュヌズには、目の近くの額に2぀の電極がありたす。 これらはAF7およびAF8ず呌ばれたす-EEG「10-20」で電極を配眮するための暙準システムに埓っおこれにより、県球運動を远跡する機䌚が䞎えられたす。





人間の目。 前の角膜は正に垯電しおいたす。 網膜、埌郚、負に垯電



脳波の「Hello World」の電極からの信号を䜿甚しお、目の動きを远跡しおたばたきを怜出したす。



はじめに



このように動䜜したすヘッドセットからのEEGデヌタのストリヌムを取埗したす muse-js



は、芳察可胜なRxJSオブゞェクトずしおこのデヌタぞのアクセスを提䟛したす。 次に、必芁な電極AF7からのデヌタのみを遞択したす。AF7は巊目の䞊にあり、信号のピヌク、぀たり絶察倀が500ÎŒVを超えるサンプルを探したす。これは、そのようなピヌクの瞬間の電䜍の倧きな倉化を瀺しおいたす。 電極は目の近くにあるため、県球の動きによっお倧きな電䜍差が生じるず予想されたす。



これはたばたきの瞬間を刀断する最も正確な方法ではないかもしれたせんが、私の堎合は非垞にうたくいきたした。 さらに、コヌドはシンプルで、わかりやすいコヌドであるこずがわかりたしたこれらはすべお、「Hello World」の兆候です。



EEGデヌタの操䜜を開始する前に、 muse-js



むンストヌルしたす。



 npm install --save muse-js
      
      





次に、ラむブラリをコヌドにむンポヌトしたす。 この堎合、Angularアプリケヌション-Angular CLIを䜿甚しお䜜成された通垞の空のプロゞェクトに぀いお話しおいたす。 必芁に応じお、ReactたたはVue.jsを䜿甚しおこのすべおを再珟できたす。この䟋では、フレヌムワヌクに緊密にバむンドされおいるコヌドはほずんどありたせん。



次に、 muse-js



をアプリケヌションのメむンコンポヌネントにむンポヌトしたす。



 import { MuseClient, channelNames } from `muse-js`;
      
      





MuseClient



クラスMuseClient



ヘッドセットずの察話を担圓し、 channelNames —



チャンネル名を䟿利な倖芳にキャストするために䜿甚される単なる配列です。



コンポヌネントで、新しいMuseClient



むンスタンスを䜜成したす。



 this.muse = new MuseClient();
      
      





次に、より耇雑なものを瀺したす。ヘッドセットに接続するためのコヌドです。



Web Bluetoothでは、接続を開始するためにナヌザヌの介入が必芁です。 そのため、コンポヌネントにボタンを远加する必芁がありたす。 ナヌザヌがボタンをクリックした埌にのみ、ヘッドセットに接続したす。 onConnectButtonClick



メ゜ッドにヘッドセット接続ロゞックを実装したす。



 async onConnectButtonClick() { await this.muse.connect(); this.muse.start(); // TODO:      }
      
      





MuseClient



オブゞェクトのconnect()



メ゜ッドは、ヘッドセットぞの接続を開始したす。 次に、 start()



メ゜ッドはヘッドセットにコマンドを送信しお、EEGデヌタの収集ずアプリケヌションぞの転送を開始したす。





Web Bluetoothを䜿甚しおMuseヘッドセットに接続する



次に行うこずは、 muse.eegReadings



察象のmuse.eegReadings



オブゞェクトで利甚可胜なEEGデヌタをサブスクラむブするこずですこれは、䞊蚘のコヌドでTODO



コメントがある堎所で行われたす。



   const leftEyeChannel = channelNames.indexOf('AF7'); this.leftBlinks = this.muse.eegReadings   .filter(r => r.electrode === leftEyeChannel)
      
      





このコヌドは、デバむスからのEEG枬定倀を受け入れ、巊県の䞊にあるAF7電極に関連するもののみを遞択したす。 各パケットには12個のサンプルが含たれ、その結果、監芖察象ストリヌムの各芁玠は次の構造を持぀オブゞェクトになりたす。



 interface EEGReading { electrode: number; timestamp: number; samples: number[]; }
      
      





electrode



倉数には、 electrode



の数倀むンデックスが含たれたす channelNames



配列を䜿甚しお、このむンデックスを電極に察しおより理解しやすくしたす、 timestamp



には、枬定が行われたずきの枬定開始からの盞察時間を含み、 samples —



12の浮動小数点数を含む配列です、各芁玠には1぀のEEG枬定倀が含たれ、マむクロボルトΌVで衚されたす。



次のステップでは、各パケットから最倧倀を遞択する必芁がありたす぀たり、最倧出力倀を䜿甚した枬定。 ここで、RxJS map



オペレヌタヌを䜿甚しお受信したストリヌムを凊理し、目的の倀を取埗したす。



   this.leftBlinks = this.muse.eegReadings   .filter(r => r.electrode === leftEyeChannel)   .map(r => Math.max(...r.samples.map(n => Math.abs(n))))
      
      





これで、通垞の数字のストリヌムがあるので、それをフィルタヌ凊理しお、500より倧きい倀のみをスキップできたす。これらの倀は点滅に察応する堎合があり、これがたさに必芁なものです。



   this.leftBlinks = this.muse.eegReadings   .filter(r => r.electrode === leftEyeChannel)   .map(r => Math.max(...r.samples.map(n => Math.abs(n))))   .filter(max => max > 500)
      
      





この段階では、単玔なRxJSベヌスのたばたき怜出パむプラむンがありたすが、デヌタの受信を開始するには、ただサブスクラむブする必芁がありたす。 通垞のconsole.log



から始めたしょう。



  this.leftBlinks.subscribe(value => {   console.log('Blink!', value); });
      
      





このコヌドを実行するず、ヘッドセットを装着しおいるずきに倚くの「点滅」メッセヌゞが衚瀺される可胜性がありたす。これは、この時点で倚くの静的ノむズが発生するためです。 ヘッドセットが安党に装着されるずすぐに、点滅するずきのみメッセヌゞが衚瀺されたす。





プログラムは点滅に応答したす



点滅するたびに、いく぀かの「点滅」メッセヌゞが衚瀺される堎合がありたす。 その理由は、瞬きごずに電䜍にいく぀かの倉化が生じるためです。 䞍芁なメッセヌゞを取り陀くには、Arduinoでメカニカルボタンを操䜜するずきに䜿甚されるものず同様のアンチバりンスフィルタを適甚する必芁がありたす。



したがっお、プロゞェクトに別の改善を远加したす。生デヌタをコン゜ヌルに出力する代わりに、点滅が怜出されたずきに倀1を発行し、最埌の朜圚的な倉曎埌0.5秒埅機し、0を返したす。これにより、耇数のBlinkむベントが陀倖されたす。芋られる



   this.leftBlinks = this.muse.eegReadings   .filter(r => r.electrode === leftEyeChannel)   .map(r => Math.max(...r.samples.map(n => Math.abs(n))))   .filter(max => max > 500)   .switchMap(() =>     Observable.merge(       Observable.of(1),       Observable.timer(500).map(() => 0)     )   );
      
      





switchMap



の秘密はswitchMap



ですか そしお、次のこずが起こりたす。新しい芁玠が到着するず、 switchMap



は前のストリヌムを砎棄し、指定された関数を呌び出しお新しいストリヌムを䜜成したす。 この新しいストリヌムには2぀の芁玠が含たれたす倀1、 Observable.of



を䜿甚しおすぐに発行し、倀0500ミリ秒埌に返されたす、もちろん、新しい芁玠がfilter



ラむンから到着しおswitchMap



を再起動し、 0の期埅倀を砎棄したす。



これで、この芳察可胜なleftBlinks



オブゞェクトを䜿甚しお瞬きを芖芚化できたす。 このデヌタは、非同期パむプラむンを䜿甚しおAngularテンプレヌトに関連付けるこずができたす







このコヌドは、点滅時に目のアむコンを非衚瀺にしたす。 代わりに、CSSクラスを切り替えお、色を䜿甚したり、点滅時に目のシンボルをアニメヌション化したりできたす。







いずれにしおも、可胜であれば、片目だけでたばたきしおコヌドをチェックするこずをお勧めしたす。



同じアプロヌチを䜿甚しおReactアプリケヌションを䜜成する堎合、この監芖察象オブゞェクトをサブスクラむブし、点滅するずきにコンポヌネントの状態を曎新できたす。



   this.leftBlinks.subscribe(value => {   this.setState({blinking: value}); });
      
      





それでやった ここに、EEGヘッドセットの「Hello World」がありたす





「Hello World」に察応



ここで 、このプロゞェクトのコヌドを芋぀けるこずができたす。 RxJSコヌドの準備に協力しおくれたBen Leshに深く感謝したす。



たずめ



数幎前、「脳波蚘録」ずいう蚀葉は、病院や研究機関にしかアクセスできない、かさばる、非垞に高䟡な機噚に぀いおの考えを呌び起こしたした。 今日、あなたや私のようなWeb開発者は、ブラりザ、RxJS、Angular、非垞に手頃な䟡栌のヘッドセットなどの通垞のツヌルを䜿甚しお、脳の電気的掻動に関するデヌタを扱うこずができたす。



おそらくEEGはあなたのトピックではありたせんが、新しい䞖代の「スマヌト」デバむスがプログラマヌにずっお倚くの興味深い機䌚を生み出す方法を芋るのを止めるこずはできたせん。 ああ、䜕時だ



芪愛なる読者 Web開発でEEGヘッドセットを䜿甚する堎合、どのオプションが最も興味深く、有望ですか



All Articles