суббота, 8 октября 2011 г.

Подключаем Emotiv EPOC к LabView (или суп из топора)

Всем хорош BioExploer, но для серьезного математического анализа или обработки он к сожалению не подходит. Предел мечтаний это простейший стат.анализ (среднее, СКО) и преобразование Фурье.

Конечно можно написать программу на Delphi, куда затем вставить ActiveX-объект и делать в ней, что хош (как это делается можно прочитать тут). Но следующим этапом будет либо самостоятельная релизация алгоритма обработки данных, либо поиск сторонних библиотек функций.

Сколько веревочке не виться, а придется ставить LabView.
Who is f@$king Alice?
LabVIEW (англ. Laboratory Virtual Instrumentation Engineering Workbench) — это среда разработки и платформа для выполнения программ, созданных на графическом языке программирования «G» фирмы National Instruments (США)...
Но как подключить к LabView наш мозгонавтический аксессуар?

Перетряхивание сайта National Instruments и форума Emotiv выдало минимум два решения.

Решение 1 (Emotiv EEGlogger sample program with LabVIEW) от пользователя hideok34
Он выложит пример подключения к EPOC-у через свою DLL. Вобщем, делает все что нам надо. Но решение к сожалению несколько запутанно, комментарии в проекте исключительно на японском :)

Решение 2 (LabVIEW Emotiv Toolkit) от пользователя BigCheese
Это Toolkit - набор компонентов оберток функций библиотеки edk.dll. Прекрасно сделано и структурировано все отлично , кроме того что нет прямого доступа к ЭЭГ данным.

(Я понимаю, что некоторым читателям моего блога интересен конечный результат. Поэтому забегая вперед скажу что в итоге пришлось сделать свою DLL и свой VI файл доступа к нему взять проект можно тут :). Те кто хочет разъяснений или просто являются поклонниками моего литературного стиля :) могут читать дальше :))

Сначала у меня возникла несколько иная идея. Подключить к LabView не Emotiv, а BioExplorer через его ActiveX-объект. Очень уж мне нравится в BioExplore-ре возможность проигрывать и останавливать запись ЭЭГ. Все было классно, пока не дошел до момента извлечения данных из массива передаваемого по указателю. В CallBack обработчике ActiveX объекта добраться до всего массива мне так и не удалось. Особо обидно, что передавался только один элемент массива из 8. Пощелкав зубами в шаге от победы, решил искать иной выход.

Кстати кому хочется потрахаться с ActiveX могут взять VI-файл с моими последними изысканиями.

Разбираться в японских комментариях не хотелось поэтому пошел разбираться с EmotivToolkit-ом.

BigCheese - молодец, код просто замечательный, но видимо код делался либо на Developer версии SDK либо вообще на SDKLite поэтому вообще не содержит функций доступа к ЭЭГ данным. Но это же самое интересное!

Что Я могу сказать?
LABVIEW это отличная среда, прекрасно документированная и снабженная примерами. Просто хочется закинуть горячо любимые Delphi, Visual Studio далеко-далеко, а потом идти искать их обратно. Потому как Labview непривычно и неудобно использовать в работе с указателями и структурами. То что в обычной среде делается за 15-20 минут, в Labview рисуется не меньше часа. Даже с хорошо продуманной структурой VI проекта, все выглядит уж очень мудрено и запутанно.

Поэтому Я решил убрать всю мороку с хэндлами внутрь DLL-ки которая имеет всего 3 функции.

int OpenEEG(PTDevice hDevice);
- Инициализировать движок. Вернуть клюшку :).Если все ОК вернуть 0 , если все плохо вернуть -1

int ReadEEG(PTDevice hDevice, int Channel, double * DataOut, int *BuffSize);
- Считать с выбранного канала данные и вернуть их количество. Если все ОК - вернуть 0, и -1 если наоборот.

int CloseEEG(PTDevice hDevice);
- Отключится от движка, освободить память.
Используя такую DLL VI файл будет максимально компактным и простым для понимания и использования.

В результате проект получился такой (в архиве версия несколько сложнее, тут удалены все отладочные переменные).


Никаких вложенных VI (кроме использования своей DLL). Красота :)

Да такой проект не умеет брать одновременно данные с нескольких каналов, или выводить мигание или настроения пользователя.
Мне это не надо. Если Вам надо, используйте Toolkit от BigCheese.

Кстати есть подозрение, что полученную DLL-ку можно использовать не только в LabView.

Итак что лежит в архиве:
biolab.vi - Проект LabView с использованием DLL
DLL - Проект Visual Studio 2008 с кодом DLL. Там же в файле (BioLabDLL.cpp) можно откопать таблицу соответствий номеров каналов.

Если Вас еще мучает вопрос, а стоит ли мучения того посмотрите какой широкий набор готовых алгоритмов обработки сигналов предоставляет LabView.

Еще вопросы есть? Да где бы взять $1440 для его покупки. :)

З.Ы. Заполнив форму тут можно скачать 30-дневный триал LABVIEW 2011
Непослушные дяди и тети, которые не уважают интеллектуальную собственность, копирастов и U.S.Patent найдут ВСЁ, что надо для счастья на РуТрекере.

4 комментария:

  1. Классно. Я так понял это получается РЭГ как в больничке и выводиться на график)))

    ОтветитьУдалить
    Ответы
    1. Ну да только есть один вопрос - а что с этим делать. Даже в среде врачей - ЭЭГ-диагност - это где-то близко к шаману который ставит диагноз по пульсу.

      Удалить
  2. Перезалейте архив плиз. Он уже протух давно ((((

    ОтветитьУдалить
    Ответы
    1. Ну вообще уже не актуально они все поправили ... правда последний раз когда я ставил Опенвайб месяца два назад обнаружил под XP такой косяк. Т.к. программисты явно закладывались на 7-ку и на работу с SDK версии 1.04 то ищет оно Emotiv по пути.
      C:\Program Files (x86)\Emotiv Research Edition SDK_v1.0.0.4-PREMIUM

      Вылечить это два способа.
      Первый длинный поправить на 1.05 пересобрать дистрибутив.
      Или просто создать такую папку на компьютере и просто туда скопировать последнюю версию SDK ну и в настройке DataAcquisionServer указать к ней путь.

      Удачи.

      Удалить