【中級者向け】Python と UDP計測(GB Focus) で脳波計測をリアルタイム描画する方法

1. はじめに

GoodBrain Web担当の吉川です。本コラムでは、GoodBrain Focus アプリ(GB Focus)の UDP計測 で出力されるEEGデータを、Python でリアルタイム受信・可視化する方法を解説します。

  • 対象読者:Python 初中級者/脳波デバイスに興味のある開発者
  • 所要時間:環境構築含めて 20〜30 分

最終的な成果物は、下記のようなリアルタイムプロットになります。


目次


2. 用意するもの

ツール備考
PC筆者は Mac M1, 2020, Seequoia 15.5
Python筆者は Python 3.11
Python ライブラリpython-osc, matplotlib
FocusCalm™脳波デバイス
GoodBrain FocusUDP 配信元

UDP と OSC の関係

GB Focus の UDP計測から送られてくるデータはOSC形式になっています。UDPとOSCの関係は、ざっくり言えば 「輸送トラック = UDP」と「荷札の形式 = OSC」みたいな感じです。

  • UDP (User Datagram Protocol): IPネットワーク層の軽量な通信プロトコル。TCPよりも遅延が少ない(接続確立や再送管理が無いため)。
  • OSC (Open Sound Control): UDP/TCP 上で動くメッセージフォーマット+アドレス規約。/Attention のようなアドレスに 32bit/64bit 値を添付して送れる。

今回は python-osc というライブラリで、OSCメッセージのパース(解読)を行います。

3. ライブラリのインストール

まずは、以下の 1 行を実行して、今回使うライブラリをインストールします

pip install matplotlib python-osc

4. OSCの送受信を試す

OSCの送信と受信を行うプログラムを作成してみましょう。

まずは、osc_receiver.py と osc_sender.py を作成します。

osc_receiver.py (受信用プログラム)に以下のコードを記載します。

from pythonosc import dispatcher, osc_server

# 受信するポート番号
PORT = 9000

# 受信したデータを処理する関数
def handler(address, *args):
    print(f"{address} → {args}")

# ディスパッチャ(アドレスと関数を紐付ける)を作成
disp = dispatcher.Dispatcher()

# アドレスと関数を紐付ける
disp.map("/test", handler)

# サーバーを起動
print(f"> OSC 受信 (UDP:{PORT}) … Ctrl‑C で終了")
server = osc_server.ThreadingOSCUDPServer(("", PORT), disp) # サーバーを作成
server.serve_forever() # サーバーを起動(Ctrl+Cで終了)

大まかな処理は下記の通り。

  1. 受信するポート番号の設定
  2. 関数とアドレスの紐付け
  3. サーバーの起動

次に、osc_sender.py (送信用プログラム)に以下のコードを記載します。

from pythonosc import udp_client
import time, random

# 送信先の設定
IP = "127.0.0.1" # 受信側のIPアドレス(127.0.0.1は自分自身を指す)
PORT = 9000      # 受信側のポート番号
ADDRESS = "/test" # 送信するアドレス

# 送信クライアントを作成
client = udp_client.SimpleUDPClient(IP, PORT)

# 送信開始
print("> OSC 送信開始 (Ctrl‑C で終了)")

# ターミナルでCtrl+Cを押すまでループ
try:
    while True:
        val = random.random() # 0.0から1.0のランダムな値を生成
        client.send_message(ADDRESS, val)  # アドレスと値を送信
        time.sleep(1) # 1秒待つ
except KeyboardInterrupt:
    print("送信終了")

大まかな処理は下記の通り。

  1. 送信先の設定
  2. 送信クライアントの設定
  3. 送信開始

ターミナル(コマンドプロンプト)を2つ起動し、それぞれのプログラムを実行してみます。

ターミナル1:python osc_receiver.py
ターミナル2:python osc_sender.py

実行前の状態

まずは osc_receiver.py を実行

osc_sender.py を実行すると…送受信が確認できた!

受信側で /test → (0.208…, ) のように表示されれば成功です。

5. 集中度・リラックス度のデータを受信する

osc_receiver.py を拡張して、脳波デバイスのデータを受信できるようにしてみましょう。

まずは、osc_receiver.py を複製して、gbfocus_osc_receiver.py を作成します。

osc_receiver.py のコピーを作成
gbfocus_osc_receiver.py に名前を変更

GB Focus から送信されるアドレスは下記の通りです。

  • /Attention:集中度
  • /Meditation:リラックス度
  • /EEG :生波形
  • /Bandpower :δ, θ, α, β, γ
  • /Acc:加速度
  • /Gyro:ジャイロ
  • /EulerAngle:デバイスの角度

詳しい情報はこちらのセミナー資料にも記載されているので、合わせてご参照ください。

まずは、/Attention と /Meditation を受信してみます。

13行目以降の「アドレスと関数を紐付ける」処理を、下記の通りに編集しましょう。

# アドレスと関数を紐付ける
addresses = ["/Attention", "/Meditation"]
for address in addresses:
    disp.map(address, handler)
アドレスと関数を紐付ける処理を編集

GB Focus アプリを開いて、UDP計測を選択します。利用する脳波デバイス(今回は FocusCalm™)を選択すると、ポートの設定画面に遷移します。

ネットワークの「ホスト」は、PCのWiFiの設定等から確認できます。

Macの場合

「送信ポート」は Python のプログラムですでに9000に設定しています。

ポート1(Attention)とポート2(Meditation)を設定します。

ターミナルで gbfocus_osc_receiver.py を実行します。

python gbfocus_osc_receiver.py
実行した様子

GB Focus でデバイスを選択し、計測を開始します。

すると、ターミナルに受信したデータが表示されます。

集中度とリラックス度を4回ずつ取得した様子

出力をみてみると、受信できたデータは、(計測値, タイムスタンプ) という形式になっていることがわかります。

/Attention → (40.81196594238281, '2025-07-31 21:26:06.193')
/Meditation → (10.469873428344727, '2025-07-31 21:26:06.195')

これを念頭に、次章からは計測値をリアルタイムでプロットしてみましょう。

ここまでのコードを下記に示します。

from pythonosc import dispatcher, osc_server

# 受信するポート番号
PORT = 9000

# 受信したデータを処理する関数
def handler(address, *args):
    print(f"{address} → {args}")

# ディスパッチャ(アドレスと関数を紐付ける)を作成
disp = dispatcher.Dispatcher()

# アドレスと関数を紐付ける
addresses = ["/Attention", "/Meditation"]
for address in addresses:
    disp.map(address, handler)

# サーバーを起動
print(f"> OSC 受信 (UDP:{PORT}) … Ctrl-C で終了")
server = osc_server.ThreadingOSCUDPServer(("", PORT), disp) # サーバーを作成
server.serve_forever() # サーバーを起動(Ctrl+Cで終了)

次のページでは、集中度とリラックス度をリアルタイム描画します。