高通台灣AI黑客松|競賽說明會
|

【腦機介面BCI】抓到了!腦波儀不能在 RPi 上運行的原因

   

作者:無名

緣由

近日,接連接到有伙伴依照我先前撰寫的《【腦機介面BCI】透過 Raspberry Pi 讀取腦波數據》一文操作時,無法讀取到神念腦立方(MindWave Mobile )的腦波數據,會報錯誤。

由於神念科技近日發行了新版的腦波儀,改變了先前的舊版腦波儀時,將開關往前推5秒進入配對模式的動作;新版的腦波儀改成以開機即可配對。

(左)新版腦立方(開關一推到底);(右)舊版腦立方(三段開關)

聽說還有伙伴直接將此問題反應給神念。坦白講,神念怎麼會理我們呢?他們只要保證使用由他們提供的 Library連接讀取沒問題即可,其餘皆不在技術支援的範圍內。

「自己的腦波儀自己搞」於是,我出於好奇,前陣子社團內在發起團購時,便入手一支新版的腦波儀。當大家到101跨年看煙火時,我在家看一晚的腦波儀,好好的看一看這支新版的腦波儀到底怎麼回事。至於怎麼一回事呢?咱們往下看~

問題

原先,我想可能是神念想通了,不使用藍牙,改使用 BLE 傳輸,所以可能是 Python 的藍牙連接的Lib(PyBluez)要改。我對 Python 的熟練程度是「心嚮往之」的層級,先用我熟悉的 C++ 寫個 BLE 程式連看看,一試之下才發現,它根本還是Bluetooth,沒改BLE。

此路不通,拿我原本寫的 App連看看,發現還是可以用的,程式運行無誤。看來不是神念的腦波儀的問題!難道是我們使用由robintibor提供的 Lib 有問題?再拿舊版的腦波儀試,可以連接並讀取到腦波數據,但新版的不行。此時,彷彿進入一個死胡同,我的C++的程式,新舊腦波儀皆正常讀取資料,因此不是腦波儀的問題;到 Python時,舊的腦波儀運行正常,新的不正常,這似乎又是指向腦波儀的問題。若不是腦波儀的問題,難道是 python 的 Library 沒處理好由腦波儀傳來的資料?

我開始trace robintibor的代碼,根據代碼,程式是死在一個 MindwavePacketPayloadParser.py 的一個 assert。

上面這段代碼是要將腦波的資料依控制碼將值讀出來,根據神念官方提供的 protocol 規範,確實只有上述幾個控制碼,怎麼會有其他新的控制碼?要知道答案,就只有看腦立方送了些什麼資料出來。

舊版腦波儀送的封包資料

新版腦波儀送的封包資料

從上面兩張圖可以看出,新版腦波儀的錯誤格式的raw data封包增加了,而 robintibor的 Library 就是把 checksum 當作控制碼,而後接了一個 NULL,所以會 Assert false。

解決方法

我覺得 robintibor的代碼中,若要根本的解決此問題,須改變其代碼(MindwavePacketPayloadParser.py)中對封包長度的判斷:

這段代碼 len(…)會把 NUL也算到 packet中。但因我對 python 的語法並不熟,所以我的做法是治標不治本的方法:

1. 將前述的 assert False, 改成 pass


2. 主程式(read_mindwave_mobile.py)的部分加入 exception handle.

加入 try…except IndexError,IndexError也不用做啥事,把它 bypass,讓程式不至於因此跳出就可以了。

結論

根據我這幾年使用 TGAM的經驗,腦立方的錯誤封包並不是TGAM吐出來的,應是Bluetooth 在處理TGAM封包時的 noise。這種錯誤的 raw data封包其實在舊版的腦波儀就有了,只是量較少,新版明顯增加;但為何 robintibor的代碼在舊版的腦波儀可正常運行,新版就跳 assert,說實話,我也不明白,若有對 python 較了解的高手前輩知道的話,也請不吝指導一下。

目前我修改的代碼,已上傳到 github了,若有對 python熟練的伙伴,歡迎下載並協助修正後上傳。坦白講,我覺得神念這次對腦立方的改版,似乎沒改好就 release了,藍牙的韌體部分明顯多有缺失,才有較多的noise。程式的流程若依照神念提供的 protocol spec. 的 parsing 流程,其實這些 NUL 應該是會被 ignore掉的,而 robintibor的代碼顯然在流程上或判斷上有小bug啦。

使用 python 的庫除了 robintibor的外,還有幾個也不錯用的介紹給伙伴們:

1.     Python-mindwave

2.     NeuroPy

(責任編輯:葉于甄)

訂閱MakerPRO知識充電報

與40000位開發者一同掌握科技創新的技術資訊!

Author:

Share This Post On
468 ad

Submit a Comment

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *