Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Учебное пособие 2232

.pdf
Скачиваний:
29
Добавлен:
30.04.2022
Размер:
14.85 Mб
Скачать

При невозможности остановки будет следующий ответ: {"type":"impedance", "action": "stop", "code": 415, "message": "Error message"}.

Команда “protocol” должна быть запущена до начала каждой сессии. Эта команда представляет собой число, означающее начало сеанса. В настоящее время поддерживаются протоколы “ble”, “bled112”, “serial” и “wifi” (версия программы v2.0.0).

Параметр “action – start” запускает протокол. Необходимо остановить все остальные протоколы перед запуском нового (версия программы v2.0.0).

Наличие: по состоянию на v2.0.0.

Параметр “protocol” в настоящее время поддерживает протоколы “ble”, “bled112”, “serial” и “wifi”. Плата Ganglion использует только “ble” и “bled112”

на сегодняшний день. После выполнения команды с данным параметром будет предпринята попытка запустить драйверы Bluetooth с низким энергопотреблением. При использовании CSR Dongle в Windows очень важно использовать инструмент Zadig.

Пример запуска протокола “ble” или “bled112” для платы Ganglion: {"type":"protocol", "action": "start", "protocol": "ble"}. В случае успеха запуска для платы Ganglion: {"type":"protocol", "action": "start", "protocol": "ble", "code": 200}. При невозможности запуска драйвера для платы Ganglion будет ответ: {"type":"impedance", "action": "start", "code": 419, "message": "failed to start driver"}.

Инструмент Zadig не обязательно использовать для ключа BLED112.

Пример установки протокола “serial” для платы Cyton: {"type":"protocol", "action": "start", "protocol": "serial"}. В случае успеха выполнения команды: {"type":"protocol", "action": "start", "protocol": "serial", "code": 200}. Пример установки протокола wifi для платы Cyton: {"type":"protocol", "action": "start", "protocol": "wifi"}. Ответ в случае успеха установки протокола “wifi” для платы

Cyton: {"type":"protocol", "action": "start", "protocol": "wifi", "code": 200}.

Параметр “action – status” можно выполнить после проверки, запущен ли в настоящее время протокол и установлен ли он как текущий протокол (для версии программного обеспечения v1.0.0). Пример установки протокола “ble”

или “bled112”: {"type":"protocol", "action": "status", "protocol": "ble"}. В случае успеха успешного запуска и работы протокола на плате Ganglion будет следующий ответ: {"type":"protocol", "action": "status", "code": 200}. Ответ о том,

что протокол остановлен, будет следующий: {"type":"protocol", "action": "status", "code": 501}. Пример установки протоколов serial или wifi: {"type":"protocol", "action": "status"}. Ответ по запущенному протоколу: {"type":"protocol", "action": "status", "code": 304}. Ответ по остановленному протоколу: {"type":"protocol", "action": "status", "code": 305}.

Параметр “action – stop” выполняется после проверки, запущен ли протокол и установлен ли он как текущий протокол. Пример установки протоколов ble, bled112, serial и wifi: {"type":"protocol", "action": "stop",

210

"protocol": "ble"}. Ответ после остановки для протоколов ble, bled112, serial и wifi: {"type":"protocol", "action": "stop", "protocol": "ble", "code": 200}

Команда “scan” предназначена для сканирования устройства на наличие протокола, установленного ранее. При обнаружении протоколов команда отправляет их локальные имена запрашивающему клиенту.

Параметр “action – start” запускает сканирование. Необходимо остановить уже начатое сканирование, если оно выполняется. Пример выполнения команды: {"type":"scan", "action": "start"}. Ответ в случае успеха: {"type":"scan", "action": "start", "code": 200}. Ответ при невозможности начать сканирование: {"type":"scan", "action": "start", "code": 412, "message": "Error message"}. Ответ при невозможности остановить сканирование в процессе его исполнения: {"type":"scan", "action": "start", "code": 411, "message": "Error message"}.

Параметр “action – status” проверяет, выполняется ли сканирование.

Пример выполнения команды: {"type":"scan", "action": "status"}. Ответ о том,

что в настоящее время проводится сканирование на наличие протоколов “ble” и “bled112” для платы Ganglion: {"type":"scan", "action": "status", "code": 302}.

Ответ о том, что сканирование не выполняется для платы Ganglion по протоколу bled112: {"type":"scan", "action": "status", "code": 303}. Ответ о том, что выполняется сканирование для платы Wi-Fi Shild: {"type":"scan", "action": "status", "code": 304}. Ответ о том, что сканирование для платы Wi-Fi Shild не выполняется: {"type":"scan", "action": "status", "code": 305}.

Параметр “action – stop” останавливает сканирование в процессе. Пример использования команды: {"type":"scan", "action": "stop"}. Ответ в случае успеха: {"type":"scan", "action": "stop", "code": 200}. Ответ при ошибке, если сканирование не выполняется и останавливать нечего: {"type":"scan", "action": "stop", "code": 410, "message": "Error message"}. Ответ при ошибке, если не удается остановить сканирование: {"type":"scan", "action": "stop", "code": 411, "message": "Error message"}.

Команда “SD Card” работает только на платах Cyton. Таким образом, команду можно использовать только для протоколов “wifi” и “serial” (версия программы v1.0.0).

Параметр “action – start” осуществляет запуск и запись на SD-карту с помощью удобночитаемой команды. В настоящее время поддерживаются только протоколы serial и wifi.

Команда открывает новый файл для записи на SD-карте со следующей установленной продолжительностью:

14sec (14 секунд);

5min (5 минут);

15min (15 минут);

30min (30 минут);

1hour (1 час);

2hour (2 часа);

4hour (4 часа);

211

12hour (12 часов);

24hour (24 часа).

Пример выполнения команды: {"type":"sd", "action": "start", "command": "5min"}. Ответ в случае успеха выполнения команды: {"type":"sd", "action": "start", "code": 200}. Ответ при сбое (например, отсутствие SD-карты и т.д.)

будет следующий: {"type":"scan", "action": "start", "code": 499, "message": "Error message"}.

Параметр “action – stop” останавливает запись на SD-карту. Пример выполнения команды: {"type":"sd", "action": "stop"}. Ответ в случае успеха будет таким: {"type":"sd", "action": "stop", "code": 200}. Ответ при неудаче будет таким: {"type":"scan", "action": "stop", "code": 499, "message": "Error message"}.

Команда “status” предназначена для определения текущего статуса Хаба (Hub). Если сервер TCO в концентраторе работает, то это всегда будет соответствовать действительности. Пример выполнения команды: {"type":"status"}. Ответ в случае успеха: {"type":"status", "code": 200}.

Команда “Wi-Fi” используется для получения информации о подключенной плате WiFi Shield.

Параметр “action – eraseCredentials” стирает учетные данные на плате WiFi Shield. К плате WiFi Shield не должно быть прикрепленной платы регистрации ЭЭГ. Для того чтобы подключиться к WiFi Shield без плат Ganglion или Cyton, необходимо использовать команду “Examine”. Процесс займет около 6 секунд. WiFi Shield снова станет точкой доступа (программное обеспечение версии v2.0.0).

Пример выполнения команды: {"type":"wifi", "action": "eraseCredentials"}.

Ответ после выполнения команды в случае успеха: {"type":"wifi", "action": "eraseCredentials", "code": 200, "command": eraseCredentials, "message": "Rebooting wifi shield in 5 seconds"}. Ответ при неудаче, потому что не подключена плата Wi-Fi: {"type":"wifi", "code": 426}. Если при выполнении команды удаления учетных данных произошел сбой, то ответ будет следующий: {"type":"wifi", "code": 428, "command": eraseCredentials, "message": "Error message"}.

Параметр “action – getFirmwareVersion” необходим для получения версии прошивки подключенной платы WiFi Shield. Пример выполнения команды: {"type":"wifi", "action": "getFirmwareVersion"}. Ответ в случае успеха выполнения команды: {"type":"wifi", "command": "getFirmwareVersion", "code": 200, "message": "v3.1.1"}. Ответ при неудаче выполнения команды, в случае,

если не подключена плата Wi-Fi Shield: {"type":"wifi", "code": 426}.

Параметр “action – getIpAddress” служит для получения IP-адреса подключенной платы WiFi Shield.

Пример выполнения команды: {"type":"wifi", "action": "getFirmwareVersion"}. Ответ в случае успеха выполнения команды: {"type":"wifi", "command": "getFirmwareVersion", "code": 200, "message":

212

"192.168.4.1"}. Ответ при неудаче выполнения команды, в случае, если не подключена плата Wi-Fi Shield: {"type":"wifi", "code": 426}.

Параметр “action – getMacAddress” служит для получения MAC-адреса подключенной платы WiFi Shield.

Пример выполнения команды: {"type":"wifi", "action": "getMacAddress"}.

Ответ в случае успеха выполнения команды: {"type":"wifi", "action": "getMacAddress", "code": 200, "message": "AA:12:AB:23:11:CD"}. Ответ при неудаче выполнения команды, в случае, если не подключена плата Wi-Fi Shield: {"type":"wifi", "code": 426}

Параметр “action – getTypeOfAttachedBoard” возвращает тип подключенной платы регистрации ЭЭГ к плате Wi-Fi Shield (в том случае, если к Wi-Fi Shield подключены платы регистрации ЭЭГ). Возможные варианты ответа: none, cyton, daisy или ganglion.

Пример выполнения команды: {"type":"wifi", "action": "getTypeOfAttachedBoard"}. Ответ в случае успеха выполнения команды: {"type":"wifi", "command": "getTypeOfAttachedBoard", "code": 200, "message": "cyton"}. Ответ при неудаче выполнения команды, в случае, если не подключена плата Wi-Fi Shield: {"type":"wifi", "code": 426}

Далее рассмотрим набор ответов от работающего “Хаба” (концентратора). Как только клиент установил подключение к концентратору для запроса информации, сообщения с “Хаба” будут асинхронно отправляться клиенту.

Команда “accelerometer” представляет данные акселерометра от платы

Ganglion (версия программы v1.0.0).

Параметр “accelDataCounts” возвращает массив целых чисел с тремя индексами: [AXIS_X, AXIS_Y, AXIS_Z], где AXIS_X ось X (целые необработанные числа); AXIS_Y ось Y (целые необработанные числа); AXIS_Z ось Z (целые необработанные числа).

Пример выполнения команды: {"type": "accelerometer", "code": 202, "accelDataCounts": [50, 0, 30]}.

Команда “channelSettings” используется для установки регистров для каналов платы Cyton.

Параметр “channelNumber” начинает индексацию с нуля, т.е. 0-7 для платы Cyton или 0-15 для платы Cyton + Daisy.

Параметр “powerDown” будет иметь значение “true”, если канал выключен, или значение “false”, если канал включен.

Параметр “gain” (усиление) имеет целочисленные значения усиления, т.е. 1, 2, 4, 6, 8, 12, 24.

Параметр “inputType” служит для выбора источника входного сигнала для канала АЦП. Это строка, которая должна иметь одно из следующих значений: «normal», «shorted», «biasMethod», «mvdd», «temp», «testsig», «biasDrp», «biasDrn».

213

Параметр “bias” (смещение) определяет, должна ли быть включена генерация смещения для входа конкретного канала. Это число, которое имеет значение “true”, если канал имеет смещение (по умолчанию), или значение “false”, если канал не имеет смещения.

Параметр “srb2” имеет значение “ true”, если необходимо подключить вход P конкретного канала к выводу SRB2. При выполнении данной команды происходит замыкание переключателя между входом P (любого канала) и выводом SRB2. Это позволяет входу P также оставаться подключенным к АЦП. Параметр имеет целочисленное значение, при котором значение “true” означает, что вход соединяется с выводом SRB2 (по умолчанию), а значение “false” означает, что вход будет отключен от вывода SRB2.

Параметр “srb1” используется для подключения входов N всех каналов к выводу SRB1. Выполнение этого параметра влияет на все контакты N одновременно и отключает все входы N от АЦП. Параметр имеет целочисленное значение, имеющее значение ”true” для соединения всех входов N с выводом SRB1 и значение “false” для отключения всех входов N от вывода SRB1 (используется по умолчанию).

Пример выполнения команды:

{

"code": 207

"type": "channelSettings", "channelNumber": 3, "powerDown": false, "gain": 24,

"inputType": "normal", "bias": true,

"srb2": true, "srb1": false

}

Команда “Impedance” (полное сопротивление) возвращает данные об импедансе каждого канала на плате Ganglion.

Параметр “channel” служит для установки номера канала. Параметр начинает индексацию с нуля и имеет значения 1,2,3,4 для обычных каналов или значение 0 для опорного канала.

Параметр “value” (значение) позволяет запросить значение импеданса в омах для каждого канала.

Пример выполнения команды:

{

"code": 203

"type": "impedance", "channel": 3, "value": 300

}

214

Команда “Message” служит для организации сообщений от плат регистрации ЭЭГ.

Параметр “message” - это строковое сообщение от плат Ganglion. Пример выполнения команды:

{

"code": 200 "type": "message",

"message": "Hello, world!", "value": 300

}

Команда “Samples” (тип data) возвращает значения образцов от плат регистрации ЭЭГ.

Параметр “startByte” имеет формат 0xA0. Параметр “sampleNumber”

должет иметь целочисленное значение в интервале 0-255. Параметр “channelData” возвращает данные из канала, проиндексированные начиная с нуля и заполненные числами с плавающей запятой в вольтах (в том случае, если параметр “sendCounts” имеет значение “false”).

Параметр “channelDataCounts” возвращает данные из канала, проиндексированные начиная с нуля и заполненные немасштабированными целыми числами из необработанных данных с регистров АЦП (в том случае, если параметр “sendCounts” имеет значение “true”).

Параметр “accelData” возвращает массив со значениями акселерометра X, Y, Z (при наличии новых данных) (в том случае, если параметр “sendCounts” имеет значение “false”).

Параметр “accelDataCounts” возвращает массив со значениями акселерометра X, Y, Z только, когда доступны новые данные (в том случае, если параметр “sendCounts” имеет значение “true”).

Параметр “auxData” устанавливает заполнение буфера либо 2 байтами (если они синхронизированы по времени), либо 6 байтами (если они не синхронизированными по времени).

Параметр “stopByte” имеет числовое значение в формате 0xCx, где x имеет значение от 0 до 15 в шестнадцатеричном виде.

Параметр “boardTime” показывает системное время, установленное на плате регистрации ЭЭГ. Параметр “timestamp” возвращает значение времени в сыром виде. Значение времении рассчитывается, используя смещение.

Пример выполнения команды для платы Ganglion:

{

"code": 200, "type": "data",

"channelDataCounts": [0, 1, 2, 3]

}

Пример выполнения команды для платы Cyton:

215

{

"code": 200, "type": "data",

"channelDataCounts": [0, 1, 2, 3, 4, 5, 6, 7], "accelDataCounts": [0, 1, 2],

"stopByte": 192

}

Пример выполнения команды для платы Cyton, совмещенной с платой

Daisy:

{

"auxData": { "lower": {

"data": [ 1, 215, 1, 45, 3, 250], "type": "Buffer"

}, "upper": {

"data": [ 1, 215, 1, 44, 3, 251], "type": "Buffer"

}

},

"valid": true, "code": 204, "stopByte": 193, "_timestamps": {

"lower": 1543879978994, "upper": 1543879978994 },

"channelDataCounts": [-7729993, -7649407, -7606327, -7571616, -7591709, -7687549, -7552756, -7590690, -7580998, -7556930, - 7596914, -7549892, -7594576, -7658804, -7523426, -7662588],

"type": "data", "sampleNumber": 52, "timestamp": 1543879978994

}

8.2. Обработка данных в программе MATLAB

Matlab - это мощный язык программирования и среда для числовых вычислений, широко используемая в самых разнообразных академических, исследовательских и промышленных приложениях.

Несколько наборов инструментов Matlab были созданы специально для работы с ЭЭГ и платами регистрации BCI, это EEGLAB, BCILAB, ERPLAB и FieldRip.

Далее рассмотрим настройку среды Matlab для использования с оборудованием OpenBCI, а также некоторые основные области применения и функциональные возможности, которые Matlab предлагает для работы с интерфейсами ЭВМ.

8.2.1. Установка программы и загрузка данных

Необходимо обратить внимание, что программа Matlab является коммерческим программным продуктом. Лицензии должны быть куплены или приобретены через академические или профессиональные учреждения.

216

Существует два основных способа передачи данных для анализа с плат регистрации ЭЭГ в программу Matlab. Первый способ заключается в импорте файла CSV из записанного сеанса, а второй способ – в использовании лабораторного потокового уровня (LSL) для потоковой передачи данных платы в Matlab. Далее рассмотрим оба метода.

Рассмотрим первый способ импорта файла CSV из графического интерфейса OpenBCI.

Для начала необходимо включить и использовать любую плату OpenBCI (например, плату Cyton или Ganglion) и графический интерфейс OpenBCI для потоковой передачи любых данных. Всякий раз, когда данные передаются в графический интерфейс, они также автоматически сохраняются в формате .csv на компьютере. Данные и записи программы GUI сохраняются в папке

“/Documents/OpenBCI_GUI/Settings/ во всех операционных системах.

Графический интерфейс обработки OpenBCI сохраняет данные в текстовых файлах (файлы txt) или в файлах, разделяющих значения запятыми (файлы csv). Можно импортировать файлы CSV в программу Matlab в виде матрицы с помощью мастера «Импорт данных» (рис. 8.32).

Рис. 8.32. Импорт файла CSV

Далее необходимо выбрать сохраненный файл данных из графического интерфейса OpenBCI. После открытия экрана импорта данных надо выбрать вариант импорта «Числовая матрица». Затем отменить выбор всех строк заголовка. Также отменить выбор последнего столбца, значений меток времени, поскольку мастер импорта может анализировать только числовые значения.

217

Можно дать импортируемой матрице условное имя, например, "eeg_data" (рис. 8.33).

Рис. 8.33. Открытие экрана импорта

Далее надо нажать кнопку «Выбор импорта». Матрица должна после этого появиться как объект на рабочем пространстве.

Второй способ импорта данных в программу Matlab заключается в импорте потока данных OpenBCI через LSL (Lab Streaming Layer). Данные также можно передавать из Python.

Сначала надо запустить графический интерфейс OpenBCI и запустить работу системы (рис. 8.34). В раскрывающемся меню виджета надо выбрать вкладку «Сеть». В правом верхнем углу виджета «Сеть» есть еще одно выпадающее меню «LSL».

Далее можно будет выбрать данные OpenBCI, которые можно отправить, имя потока LSL, данные, объявленные LSL, и количество каналов, которые надо отправлять. После выбора параметров необходимо включить поток LSL в нижней части виджета. Затем нажать кнопку “Пуск”, и всё готово к работе.

Есть два способа импортировать LSL, используя библиотеку liblsl-Matlab для потоковой передачи в Matlab или используя набор инструментов BCILAB.

Далее рассмотрим использование библиотеки liblsl-Matlab. После успешного добавления правильных каталогов и файлов можно использовать нижеследующий скрипт для потоковой передачи данных OpenBCI из потока

LSL:

218

%% instantiate the library disp('Loading the library...'); lib = lsl_loadlib();

%resolve a stream...

disp('Resolving an EEG stream...'); result = {};

while isempty(result)

result = lsl_resolve_byprop(lib,'type','EEG'); end

%create a new inlet

disp('Opening an inlet...'); inlet = lsl_inlet(result{1});

disp('Now receiving data...'); while true

%get data from the inlet [vec,ts] = inlet.pull_sample();

%and display it fprintf('%.2f\t',vec); fprintf('%.5f\n',ts);

end

Рис. 8.34. Запуск системы

Затем рассмотрим использование инструмента BCILAB. BCILAB - это набор инструментов Matlab и плагин EEGLAB для проектирования, создания прототипов, тестирования, экспериментирования и получения данных с плат регистрации ЭЭГ.

BCILAB предоставляет графический интерфейс, с помощью которого можно управлять плагином, но пакетные сценарии могут быть использованы для тех, кто хорошо разбирается в программировании на языке Matlab.

Для установки BCILAB надо загрузить последнюю версию BCILAB из репозитория (https://github.com/sccn/BCILAB/tree/devel) и распаковать ее в

219