コンシューマ向け脳波センシングヘッドセットで意思伝達が可能か実験してみた

こんにちは。 オリィ研究所の ryo_grid こと神林です。

今回は以前試してみた、脳波による意思伝達が、コンシューマ向けのヘッドセットでも実現できるだろうか、という実験の結果について書きたいと思います。
　
なお、この実験のための開発は、勤務先での20%ルール的な時間も使わせていただいたため、勤務先名を出させていただいたいてますが、基本的にはプライベートの時間を中心に個人的に行ったものであり、勤務先が脳波でうんぬんを検討した、といった話ではありあませんので、その点はご承知おきいただければと思います。
　
また、以下の記述において、私は個々の分野の専門家というわけではなく、誤った理解をしている可能性も考えられるため、説明が記述されているページのリンクを貼ったり、文章を引用するといった方法を多用しますが、この点についてもご理解をいただければと思います。

# 意思伝達装置とは
意思伝達というキーワードからいきなり意思伝達装置に飛んでしまうのですが、アイスバケツチャレンジで話題となったALS（筋萎縮性側索硬化症）や、事故による脊椎損傷等により、全身において体を動かすことが困難な状態となっている重度障害者の方は、損傷部位や病気の進行状態にもよりますが、口頭でのコミュニケーションが困難な状況な場合があります。

[筋萎縮性側索硬化症（ALS）（指定難病２）- 難病情報センター](https://www.nanbyou.or.jp/entry/52)

[閉じ込め症候群](https://bsd.neuroinf.jp/wiki/%E9%96%89%E3%81%98%E8%BE%BC%E3%82%81%E7%97%87%E5%80%99%E7%BE%A4)

そのような際のコミュニケーションをサポートする装置が意思伝達装置と呼ばれるものになります。

指や口、腕などがいくらかでも動かすことができれば、それによってスイッチ（手のひらや指で押せるようなものや、脇に空気袋を挟み圧力を加えてトリガーとするもの、口にくわえて噛むことをトリガーとするものなど、種類があります）を操作することで、それらも困難な場合は、視線をセンサーでトラッキングすることなどでコミュニケーションをサポートします。
（これらがメジャーなタイプの操作方式ですが、後述するBCI等の操作方式も存在します）
　
以下のページでは、日本国内で販売されている、意思伝達装置製品をリストしています。
[意思伝達装置一覧 - 東京都障害者IT地域支援センター](https://www.tokyo-itcenter.com/700link/ishi-s-10.html)
※全てが網羅されているわけではありません

# BCI (Brain Computer Interface) とは
一言で言えば、脳波を用いて情報伝達（何らかの機器の操作といったこともここに含むものとします）を行おうというものです。

以下の記事で詳しく解説されています。
[【初級編; 2017年版】脳波で機械を操る！ブレインコンピュータインタフェース(BCI/BMI)って何？ - Qiita](https://qiita.com/shartsu/items/e0dbedd891a53a4eb139)
　
こちらも同じラボのチームによるスライド
[Brain-Computer interface の現状 (The state-of-art of the Brain-Computer Interface in Japan / 2016.11)](https://www.slideshare.net/TakumiKodama/braincomputer-interface-the-stateofart-of-the-braincomputer-interface-in-japan-201611)

# 聴覚オドボール課題とは
「脳波」って、そもそも何？というところですが、

[脳波 - Wikipedia](https://ja.wikipedia.org/wiki/%E8%84%B3%E6%B3%A2)
より引用すると、
> 脳波（のうは、英: Electroencephalogram：EEG）は、ヒト・動物の脳から生じる電気活動を、頭皮上、蝶形骨底、鼓膜、脳表、脳深部などに置いた電極で記録したものである。英語の忠実な訳語として、脳電図という呼び方もあり、本来は、脳波図と呼ぶべきであるが、一般的には「脳波」と簡略化して呼ばれることが多い。脳波を測定、記録する装置を脳波計(Electroencephalograph：EEG)と呼び、それを用いた脳波検査(electroencephalography：EEG)は、医療での臨床検査として、また医学、生理学、心理学、工学領域での研究方法として用いられる。検査方法、検査機械、検査結果のどれも略語はEEGとなるので、使い分けに注意が必要である。
>個々の神経細胞の発火を観察する単一細胞電極とは異なり、電極近傍あるいは遠隔部の神経細胞集団の電気活動の総和を観察する（少数の例外を除く）。

ということになります。
計測された値の単位は電圧（V、ボルト）となるようです。

次に、その脳波の中でも、ある種の特殊な波形が存在することが分かっており、「事象関連電位」と呼ばれます。
こちらも
[事象関連電位 - Wikipedia](https://ja.wikipedia.org/wiki/%E4%BA%8B%E8%B1%A1%E9%96%A2%E9%80%A3%E9%9B%BB%E4%BD%8D)
より引用すると、
>事象関連電位 (じしょうかんれんでんい、英: event-related potential, ERP) とは、思考や認知のまさに結果として、何らかの形で計測された脳の反応である。より正確に言うと、それは内的・外的刺激に対する類型的な電気生理学的反応である。
>ERP は脳波によって計測される。脳磁図 (MEG)　による同様の概念は event-related field (ERF) と呼ばれる

といったものになります。
　
**まとめると、今回の試みは、コンシューマ向けの脳波センシングヘッドセットを用いて、脳波を計測し、上記の「事象関連電位」を検出することにより、意思伝達を行うことができないか検討するため、掲題の聴覚オドボール課題の実験を試みた、という内容になります。**

聴覚オドボール課題の存在や、そこに至るまでの前提知識を得るにあっては、以下の論文を主に参考にさせていただきました。

["事象関連電位を用いたブレイン-コンピュータ・インタフェースのための集合識別器に関する研究", 九州工業大学 大西 章也, 2015-03, 学位論文（博士）](https://kyutech.repo.nii.ac.jp/index.php?action=pages_view_main&active_action=repository_action_common_download&item_id=4250&item_no=1&attribute_id=16&file_no=1&page_id=13&block_id=21)

著者である大西 章也氏に深く感謝申し上げます。

では聴覚オドボール課題とは何かですが、上でリンクしている大西氏の論文の第2章5節の"図2.7 聴覚オドボール課題の例" の説明文を引用させていただくと、
> 1,000Hz の低音刺激と2,000Hz の高音刺激の2 種類の刺激を用意する。低音
刺激は高頻度(確率p = 0.8) で、高音刺激は低頻度(確率p = 0.2) で提示され
る。この場合、高頻度で提示される低音刺激が標準刺激であり、低頻度で提
示される高音刺激が標的刺激となる。被験者は高音刺激の出現回数を心の中
で数えるというメンタルタスクを行う。このような課題を行った際の標的刺
激後700ms 程度の波形の加算平均を取ると、頭頂付近の電極で刺激提示よ
り約300ms 後に正のピーク、すなわちP300 を観測することができる。この
オドボール課題の例は[21] を参考にして作成した。

といった形で、聴覚からの情報に基づき、聞き取った音のカウント等のタスクを行った場合に、P300と呼ばれる事象関連電位が観測されるという、タスク及び現象を指します。
P300という名称は、刺激を受けた後の300ms後に観測されることからそう呼ばれているようです。
　
なお、視覚を用いたオドボール課題も存在しますが、今回はALS等の患者の方などで、眼球を動かすことや、まばたきを行うことも困難になった場合を想定し、聴覚を用いた聴覚オドボール課題を用いた意思伝達を検討しました。


# プログラムの動作環境・開発環境
OS: Windows10 Home 64bit
開発環境: Visual Studio Community 2017
開発言語: C# (.Net Framework)

# 利用するヘッドセットとそれを利用したデータ取得
NeroSky社 MindWave Mobile 2 という脳波センシングヘッドセットを利用しました。

以下は2020/05/01 時点でAmazonで検索して見つかった一番お安い値段で販売していた商品ページです。2万円弱。
[NeuroSky社製 MindWave Mobile 2 脳波センシングヘッドセット - Amazon.co.jp](https://www.amazon.co.jp/%E3%80%90%E7%B1%B3%E5%9B%BD%EF%BD%A5%E6%97%A5%E6%9C%ACNeuroSky%E7%A4%BE%E6%AD%A3%E8%A6%8F%E4%BB%A3%E7%90%86%E5%BA%97-%EF%BE%8C%EF%BE%98%EF%BD%B0%EF%BD%B1%EF%BE%8C%EF%BE%9F%EF%BE%98%E5%85%A5%E3%82%8ACD%E4%BB%98%E3%80%91%E2%97%8F%E6%96%B0%E5%9E%8B-NeuroSky%E7%A4%BE%E8%A3%BD-%E8%84%B3%E6%B3%A2%E3%82%BB%E3%83%B3%E3%82%B7%E3%83%B3%E3%82%B0%E3%83%98%E3%83%83%E3%83%89%E3%82%BB%E3%83%83%E3%83%88-Kit%EF%BC%BD%EF%BC%BB%E5%9E%8B%E7%95%AA80027-032%EF%BC%BD%EF%BC%BB%E6%AD%A3%E8%A6%8F%E8%BC%B8%E5%85%A5%E5%93%81%EF%BC%BD%E2%80%BB%E5%8D%98%E5%9B%9B%E9%9B%BB%E6%B1%A0%E4%BB%98/dp/B07CXN8NKX)

脳波の測定ポイントは一点で、基本的には額のあたりにセンサーチップと呼ばれる測定端子を固定して利用するものです。

[搭載されているSOCのデータシート](https://cdn.hackaday.io/files/11146476870464/TGAM%20Datasheet.pdf) はこちら。
　
測定データはプログラムが値を得る間隔を計測して確認したところ、50hz(2ms間隔)で得られていました（コードでの設定にもよるのではないかと思います）。

データを取得可能とする方法ですが、ヘッドセット自体を利用可能な状態にする方法はヘッドセットにCDが同梱されているので、説明書に従ってセットアップすれば問題ないはずです（私はWindowsでしか試したことがありませんが）。
　
SDKは以下からダウンロードできます（2020/05/01時点ではバージョン3.2）
http://developer.neurosky.com/docs/doku.php?id=mdt2.5
　
Windows環境では、一番上の"PC"というやつをダウンロードすれば良いはずです。
（C#でコードを書く場合もこれで問題なかったはず。ただ、本記事および今回作成したプログラムでは利用していませんが、.Net用のSDKというのも同じページの下部にあるので、そちらを使った方がC#で叩くにはラクなのかもしれません。）
　
あとはダウンロードしたSDK内にPDFがある（2つほどあるはず）ので、それに従ってサンプルコードを動かすところまでいけば、自作コードでのデータ取得はできる状態になっていると思います。
　
Development Guideと同社が呼んでいるドキュメントは2020/05/01時点で以下のみで、version 2.5のドキュメントという扱いに見えますが、version 3.2でも基本的に変わらないようです（上述のSDK内のChangelogなどを読む限り）。

[Developer Tools 2.5 Development Guide](http://developer.neurosky.com/docs/doku.php?id=developer_tools_2.5_development_guide)
※version3.2との差分など関係なく、記述されている内容がSDK内のドキュメントの記述と異なったりしているので、その点はご注意ください


導入時にはまりそうなところだけ少し書いておきますと、

・本記事で用いた開発環境はWindows 10 (64bit) ですが、動作させるサンプルプロジェクトは"Stream SDK for PC\Sample Project\win32\thinkgear_testapp_csharp\thinkgear_testapp_csharp" の中のもので問題ありませんでした。x64のものは私が試した当時、配布されていたSDKには同梱されていませんでしたので試していません
・ヘッドセットからのデータを取り込むにはThinkGear Connectorというデーモンのようなものを動作させておく必要があります。COMポートは同ソフトウェア（タスクトレイにいる）から指定できるのですが、そのポートにサンプルプログラムや自作プログラムからアクセスしても、接続できない場合があるので、Connector側、プログラム側のポート番号をあれこれ変えたりしてうまくいくまで頑張ってください^^;

なお、ThinkGear Connectorのユーザガイドのpdfは以下にあります
[ThinkGear Connector User Guide](http://developer.neurosky.com/docs/lib/exe/fetch.php?media=thinkgearconnectoruserguide_5-20.pdf)

・thinkgear.dllはC#のコードからはDLLImportを用いてロードされるので、PATHの通った場所か、exeファイルと同じ場所にあればOKです

# 実験方法
- MindWave Mobile 2 のセンサ部分を頑張って頭頂部に固定
- 目をつぶった状態で、低音を10%、高音を90%の確率で鳴らし、そのいずれかを、静かな環境でカウントし、その際の脳波を測定し、記録する
  - 高音は2000Hz、低音は1000Hzの周波数の音とし、100ms間鳴らす
  - 音を鳴らしたあとは800msのインターバルを空ける
- カウントした方の音の種別と、鳴らした音の種別ごとに音を鳴らした後の一定時間の脳波を集計し加算平均をとり、その結果を分析する
  - 加算平均をとる際に一方の音のサンプル数だけが多いと（鳴る頻度の高い高音の方が単純に集計すると数が多くなってしまう）、集計方法として正しくないと考えたため、どちらも最初の30波形のみ集計時のデータとして利用する


# ソフトウェア構成
大きく分けて2つのプログラムを作成しました。

ソースコードは以下です。
[ryogrid/MindWaveSoundOddballExperiment - GitHub](https://github.com/ryogrid/MindWaveSoundOddballExperiment)
※thinkgear.dllはSDKから持ってきて、ビルド結果の出力先ディレクトリに配置してください

ついでに、測定したデータ（私の脳波データ、および解析に必要な補助データ）も以下に置いてあります。
[MindWaveSoundOddballExperiment/OddballExperiment/AnalyzeExperimentData/experiment_data/](https://github.com/ryogrid/MindWaveSoundOddballExperiment/tree/master/OddballExperiment/AnalyzeExperimentData/experiment_data)

## 音を鳴らしながら脳波を計測しファイルに出力するプログラム(C#)
- [主に処理をしているコード](https://github.com/ryogrid/MindWaveSoundOddballExperiment/blob/master/OddballExperiment/ExperimentProgram/SoundHCI.cs)
- 計測した脳波データを時刻（unixtimeのものも含む）と共にcsvファイルに出力
- 音を鳴らし、鳴らし始めたタイミング(unixtime)と、鳴らし終えたタイミング(unixtime)、また高音と低音のどちらを鳴らしたかをcsvファイルに出力する
- unixtimeはミリ秒精度
- 上記の2つのファイルを突き合わせることで、各音を鳴らした後の脳波データを抽出するといったことが可能となる

## 計測プログラムの出力ファイルを加工するプログラム(C#)
- [主に処理をしているコード](https://github.com/ryogrid/MindWaveSoundOddballExperiment/blob/master/OddballExperiment/AnalyzeExperimentData/DataLoadAndAggregate.cs)
- 上記の2つのファイルの突き合わせを行い、2種の音それぞれについて、鳴らした後の一定時間の脳波データの加算平均を求めファイルに出力する

　
# 結果・考察
結論から述べると、期待した結果は得られませんでした。

何度か試した結果、どれも同じような結果となり、そのうちの一つが以下のグラフです。
![oddball_experiment_compare1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12325/6a38aeb0-35c1-80a9-4d90-c30b1c0c719d.png)

上段の2つが低音（頻度の低い方）をカウントした場合の、低音を鳴らし始めたあとの一定時間、高音を鳴らし始めたあとの一定時間の脳波を加算平均したものです。下段の2つは高音（頻度の高い方）をカウントした場合の結果です。
　
縦軸は脳波の計測値です。
横軸はサンプル数でサンプリングレートは2msであるため、左端を0秒とすると、横軸の値 x 2ms が鳴らし始めてから経過した時間になります。
　
聴覚オドボール課題では、鳴る頻度の低い音（今回は低音）をカウントした場合に、その音が鳴り終わったあとの300ms後にP300（事象関連電位）が観測されるはずなのですが、どちらを鳴らした後（カウントしていない方の後でも）にも事象関連電位らしき波形が2200ms前後と、2600ms前後に現れています。

また現れる位置も、（後になって分かったことですが）プログラムの実装の問題で音が鳴り始めるまでに1300ms程度の遅延があった可能性があるのですが、それを含めて考えても、鳴り終わってから700ms前後、1100ms前後のタイミングになります。
　
加えて、頻度の高い高音を数えた場合でも同じようなタイミングで、事象関連電位と思しき波形が現れています。
　
従って、聴覚オドボール課題としてはうまくいっておらず、観測された事象関連電位と思しき波形もP300ではない可能性が高いと考えています。

ただし、脳波の計測地点を額にした場合は事象関連電位とおぼしき波形は見られないため、何らかの事象関連電位なのではないかとは推測しています。
　
**で、聴覚オドボール課題としては失敗だったのですが、高音をカウントした場合（頻度が高い）は、どちらの音が鳴った後も波形が大きく振れているというのは共通して観測されたので、どちらをカウントしたかは振れ幅を見ることで区別することができるのではないかと考えており、これにより 0 or 1 、Yes or No といった意思伝達をすることは可能なのではないかと推測しています。**
　
とはいえ、行った実験の回数も両手で数えられる程度であり（数分間集中して計測するというのは結構大変で・・・）、被験者も私一人ですので、**「上記の方法で安定して意思伝達が可能である」と、自信をもって言い切ることはできません**が、同様の試みを行う方がいらっしゃった場合の参考になればと、記事として残しておきます。



# 参考リンク集
[P300型BCI（ブレインコンピュータインタフェース）｜脳科学の世界](http://brainsc.com/bci/p300_bci.html)
[ERP（事象関連電位）データを読み解くための基礎知識](http://www.mizumot.com/method/2012-06_Sugai.pdf)
[脳波があらわす心の過程](https://psych.or.jp/wp-content/uploads/2017/10/75-5-8.pdf)
[メルカリで5000円で買った脳波計とElectronで車を動かすゲームを作る - Qiita](https://qiita.com/aki202/items/2d7d386cc7656a7b97bd)
[「脳波でうごくVTuber」の作り方 - Qiita](https://qiita.com/Fujitsu_IncubationCenter/items/111223ddbe01a23f9d68)



以上です！