Upload
others
View
1
Download
0
Embed Size (px)
Citation preview
BCI
LEZIONI DI LABORATORIOCome interfacciare BCI mindwave ed emotiv
Neurosky Mindwave
• Obiettivo: integrare Neurosky Mindwave in un ambiente grafico per la creazione di esperimenti/giochi rispondenti a comandi mentali
• Proviamo prima con integrazione in C++ con un motore di gioco molto documentato su Internet
• Trattiamo quindi l’esperimento come se si trattasse di un gioco
Prof. R. Folgieri Realtà Virtuali aa 2010/2011
Ambiente di sviluppo GUI
• darkgdk.thegamecreators.com• scaricate ambiente di sviluppo Dark GDK per
videogames in Visual C++– insieme di librerie e oggetti grafici– utilizzano Microsoft DirectX
• installare Microsoft Visual C++ 2008 (o 2010)• installare Microsoft DirectX 9.0c SDK• installare Dark GDK• Microsoft’s DirectX 9.0c SDK è reperibile qui:
http://download.microsoft.com/download/3/3/f/33f1af6e-c61b-4f14-a0de-3e9096ed4b3a/dxsdk_aug2007.exe
Prof. R. Folgieri Realtà Virtuali aa 2010/2011
Risultato dell’installazione
Prof. R. Folgieri Realtà Virtuali aa 2010/2011
• Tutorials: progetti Visual C++ di esempio e modello.• Samples: progetti più complicati. Es. Sample Viewer • Media: alcuni oggetti musicali e grafici da utilizzare nei
videogames.• Documentation: file di Help con descrizione di tutte le
funzioni• Al primo tentativo di compilare un progetto, potremmo
avere messaggi di errore da parte del sistema. Occorrerà allora impostare manualmente i percorsi delle directory VC++, come mostrato nella slide successiva
Percorsi delle directory
Prof. R. Folgieri Realtà Virtuali aa 2010/2011
• Strumenti>Opzioni
• Impostare anche i percorsi delle librerie (file .lib)• Ora la compilazione non darà errori
Bottone per aggiungere un percorso
percorsi
• Si possono ora creare oggetti da poter poi muovere con il mindset• Vediamo un programma per creare un cubo rotantevoid DarkGDK ( void ){
// this is the entry point for the program// switch on sync rate and set the maximum// refresh rate to 60 frames per seconddbSyncOn ( );dbSyncRate ( 60 );// make our cube, load the effect and apply// it to our objectdbMakeObjectCube ( 1, 1 );dbLoadEffect ( "DetailMapping.dbs", 1, 1 );dbSetObjectEffect ( 1, 1 );dbSetEffectConstantFloat ( 1, "detailScale", 1 );
Prof. R. Folgieri Realtà Virtuali aa 2010/2011
Creare un’interfaccia gioco/esperimento (1)
// main program loopwhile ( LoopGDK ( ) )
Anche qui c'è la struttura di ripetizione{ // rotate the object
dbTurnObjectLeft ( 1, 0.5 );
// update the screendbSync ( );
}}
Prof. R. Folgieri Realtà Virtuali aa 2010/2011
Creare un’interfaccia gioco/esperimento (2)
// whenever using Dark GDK you must include the header file#include "DarkGDK.h"// the main entry point for the application is this functionvoid DarkGDK ( void ){
// at the start of the program we will switch the sync rate ondbSyncOn ( );dbSyncRate ( 60 );// this is our main loopwhile ( LoopGDK ( ) ){
// inside our main loop we can control the logic of the program,// the final call in our main loop is to dbSync, this function will// update the screen and draw any graphicsdbSync ( );
}
// return back to windowsreturn;
}Prof. R. Folgieri Realtà Virtuali aa 2010/2011
Modello di programma vuoto
file Dark GDK.hlp nella cartella Documentation. Categorie di comandi:1. CORE COMMANDS 2. TEXT COMMANDS3. INPUT COMMANDS 4. FILE COMMANDS5. DISPLAY COMMANDS 6. BASIC2D COMMANDS7. BITMAP COMMANDS 8. SOUND COMMANDS9. MUSIC COMMANDS 10. SPRITE COMMANDS11. IMAGE COMMANDS 12. LIGHT COMMANDS13. CAMERA COMMANDS 14. BASIC3D COMMANDS15. MATRIX COMMANDS 16. WORLD COMMANDS17. PARTICLES COMMANDS 18. 3DMATHS COMMANDS19. FTP COMMANDS 20. MEMBLOCKS COMMANDS21. MULTIPLAYER COMMANDS 22. SYSTEM COMMANDS23. TERRAIN COMMAND• funzioni i cui prototipi sono descritti nei corrispondenti file di inclusione che si trovano
nella cartella INCLUDE.• Es funzioni che realizzano aggiornamento dello schermo (categoria CORE):
dbSyncOn : void dbSyncOn ( void )dbSyncOff : void dbSyncOff ( void )dbSync : void dbSync ( void )dbSyncRate : void dbSyncRate ( int iRate )
Prof. R. Folgieri Realtà Virtuali aa 2010/2011
Come usare le funzioni di DarkGDK (1)
blocco note – aprire il file DarkSDKCore.h in cui si trova la definizione dei prototipi delle funzioni:
voiddbSyncOn ( void );voiddbSyncOff ( void );voiddbSync( void );voiddbSyncRate ( int dbiRate );
categoria particolarmente interessante:• BASIC3D
– contiene comandi per visualizzare, manipolare, muovere, far collidere oggetti tridimensionali
– utilissimi nella creazione di videogames.• Personaggi creati in Blender possono essere utilizzati in
DarkGDK
Prof. R. Folgieri Realtà Virtuali aa 2010/2011
Come usare le funzioni di DarkGDK (2)
Leggere i segnali rilevati da Mindwave• Per leggere i segnali EEG rilevati da Mindwave ho bisogno di
installare i componenti del mindset development tool (MTD), reperibili gratuitamente qui:
• http://store.neurosky.com/products/mindset-development-tools• MTD ha 3 livelli di interfaccia per comunicare con l’haedset
Mindwave:1. ThinkGear Connector (TGC), eseguibile Windows e Mac OS2. ThinkGear Communications Drivers (TGCD), librerie per Windows, Windows
Mobile, Mac OS X e J2ME (Symbian)3. ThinkGear Stream Parser, codice sorgente per ogni piattaforma C
• I primi due livelli più alti forniscono supporto per le più comuni piattaforme, quali Windows e Mac OS X, mentre il livello più basso, Stream Parser interface fornisce codice sorgente e specifiche per la comunicazione a basso livello che permettono l’interfaccia al mindwave virtualmente su ogni piattaforma che possa ricervere un stream dati seriale Bluetooth
Prof. R. Folgieri Realtà Virtuali aa 2010/2011
ThinkGear• ThinkGear è la tecnologia che abilita i device NeuroSky ad
interfacciare chi indossa un brain headset
• ThinkGear include i sensori posti sullo scalpo, i punti di contatto e di
riferimento posti sull’orecchio e sul lobo auricolare ed il chip posto
sul BCI che processa i dati
• Sia le onde cerebrali che gli “eSense Meters” (attenzione e
meditazione) vengono lette dal chip
• La tecnologia ThinkGear abilita i tool di sviluppo, i driver e le api
dell’MDT
Prof. R. Folgieri Realtà Virtuali aa 2010/2011
1. Creiamo un nuovo progetto, con Visual Studio o Visual C++ (vanno entrambi bene)– Usiamo il template in "Visual C/C++ > Win32 > Win32 Console
Application"– Chiamiamo il progetto "thinkgear_testapp"– Mettiamolo in una cartella “Solution”– Click OK.
2. Quando compare il Win32 Application Wizard, selezioniamo "Application Settings":– in “Application type” selezioniamo "Console application”– nelle Additional options, assicuriamoci che sia selezionato solo “Empty
project"– in common header files non deve essere selezionato nulla– click Finish
3. Copiamo i file “thinkgear.h", "thinkgear.lib", e "thinkgear_testapp.c" files nella directory di progetto di thinkgear_testapp
Prof. R. Folgieri Realtà Virtuali aa 2010/2011
Leggere il mindwave dalla porta adeguata (1)
4. In Visual Studio, click con il tasto ds del mouse sul folder "Source Files":– Selezioniamo "Add" > "Existing Item..."– Selezioniamo il file "thinkgear_testapp.c" nel folder thinkgear_testapp
5. Click con il tsto ds del mouse sul folder "Header Files":– Selezioniamo "Add" > "Existing Item..."– Selezioniamo il file "thinkgear.h" nel folder thinkgear_testapp
6. Click con il tasto ds del mouse sul progetto "thinkgear_testapp":– Selezioniamo "Add" > "Existing Item..."– Selezioniamo il file "thinkgear.lib" nel folder thinkgear_testapp
(probabilmente dovremo cambiare "Files of type" sotto "All Files", e ignorare ogni messaggio)
7. Costruiamo il progetto (Build) (il file "thinkgear_testapp.exe" dovrebbe apparire nel folder "SOLUTION\Debug\")
Prof. R. Folgieri Realtà Virtuali aa 2010/2011
Leggere il mindwave dalla porta adeguata (2)
8. Copiamo il file "thinkgear.dll" nello stesso folder del file "thinkgear_testapp.exe" ("SOLUTION\Debug\")
9. Assicuriamoci ora che l’headset sia connesso al computer alla COM corretta**
10. Eseguiamo il file "thinkgear_testapp.exe" e leggiamo i valori delle onde EEG
11. Ora possiamo leggere, comprendere ed adttare il codice del file thinkgear_testapp.cpp ai nostri progetti per collezionare i dati dall’Headsets
12. Nell’API documentation potete trovare tutti I dettagli relativi alle API ThinkGear
** modificare, se necessario, il numero della porta COM mediante il Device Manager
Prof. R. Folgieri Realtà Virtuali aa 2010/2011
Leggere il mindwave dalla porta adeguata (3)
Prof. R. Folgieri Realtà Virtuali aa 2010/2011
Leggere il mindwave dalla porta adeguata (4)
#include <stdlib.h>#include <stdio.h>#include "thinkgear.h"/*** Prompts and waits for the user to press ENTER.*/
voidwait() {
printf( "\n" );printf( "Press the ENTER key...\n" );fflush( stdout );getc( stdin );
}/*** Program which prints ThinkGear EEG_POWERS values to stdout.*/
Prof. R. Folgieri Realtà Virtuali aa 2010/2011
Leggere il mindwave dalla porta adeguata: il programma in Visual C ++ commentato (1)
intmain( void ) {
char *comPortName = NULL;int dllVersion = 0;int connectionId = 0;int attPacketsRead = 0;int errCode = 0;
int attention=0;/* Print driver version number */dllVersion = TG_GetDriverVersion();printf( "ThinkGear DLL version: %d\n", dllVersion );/* Get a connection ID handle to ThinkGear */connectionId = TG_GetNewConnectionId();if( connectionId < 0 ) {
fprintf( stderr, "ERROR: TG_GetNewConnectionId() returned %d.\n", connectionId );
wait();exit( EXIT_FAILURE );
}
Prof. R. Folgieri Realtà Virtuali aa 2010/2011
Leggere il mindwave dalla porta adeguata: il programma in Visual C ++ commentato (2)
/* Set/open stream (raw bytes) log file for connection */errCode = TG_SetStreamLog( connectionId, "streamLog.txt" );if( errCode < 0 ) {
fprintf( stderr, "ERROR: TG_SetStreamLog() returned %d.\n", errCode );wait();exit( EXIT_FAILURE );
}/* Set/open data (ThinkGear values) log file for connection */errCode = TG_SetDataLog( connectionId, "dataLog.txt" );if( errCode < 0 ) {
fprintf( stderr, "ERROR: TG_SetDataLog() returned %d.\n", errCode );wait();exit( EXIT_FAILURE );
}
Prof. R. Folgieri Realtà Virtuali aa 2010/2011
Leggere il mindwave dalla porta adeguata: il programma in Visual C ++ commentato (3)
/* Attempt to connect the connection ID handle to serial port "COM5" */comPortName = "\\\\.\\COM17";errCode = TG_Connect( connectionId,
comPortName, TG_BAUD_9600, TG_STREAM_PACKETS );
if( errCode < 0 ) {fprintf( stderr, "ERROR: TG_Connect() returned %d.\n", errCode );wait();exit( EXIT_FAILURE );
}
Prof. R. Folgieri Realtà Virtuali aa 2010/2011
Leggere il mindwave dalla porta adeguata: il programma in Visual C ++ commentato (4)
/* Read 10 ThinkGear Packets from the connection, 1 Packet at a time */attPacketsRead = 0;while( attPacketsRead < 100 ) {
/* Attempt to read a Packet of data from the connection errCode = TG_ReadPackets( connectionId, -1 );*/
int packetsRead = TG_ReadPackets(connectionId, -1);/* If TG_ReadPackets() was able to read a complete Packet of data... */if( packetsRead > 0 ) {
/* If attention value has been updated by TG_ReadPackets()... if( TG_GetValueStatus(connectionId, TG_DATA_ATTENTION) != 0 ) */
if(TG_GetValueStatus(connectionId, 2) != 0){attention = TG_GetValue(connectionId, 2);
attPacketsRead++;/* Get and print out the updated attention value */fprintf( stdout, "New attention value: %d\n",attention );fflush( stdout );
} /* end "If attention value has been updated..." */} /* end "If a Packet of data was read..." */
} /* end "Read 10 Packets of data from connection..." *//* Clean up */TG_FreeConnection( connectionId );/* End program */wait();return( EXIT_SUCCESS );
}
Prof. R. Folgieri Realtà Virtuali aa 2010/2011
Leggere il mindwave dalla porta adeguata: il programma in Visual C ++ commentato (5)
Integrare Mindwave: segnali, controlli e oggetti grafici
• Ora che sappiamo come leggere i segnali del mindwave, dobbiamo:– Creare un ambiente grafico per l’esperimento– Collegare l’oggetto(i) grafico creato ai controlli
• Ecco un esempio (Visual C ++), in cui– Viene creato uno sprite rappresentante un cubo– Si resta in ascolto dei segnali EEG– A seconda dei livelli di attenzione raggiunti, lo sprite ruota
Prof. R. Folgieri Realtà Virtuali aa 2010/2011
// Dark GDK - The Game Creators - www.thegamecreators.com// include DarkGDK header file#include "DarkGDK.h"#include <stdlib.h>#include <stdio.h>#include "thinkgear.h"void DarkGDK ( void ){
inizio programma// settaggio del refresh rate a 60 frames per secondo
// parte inizializzazione portechar *comPortName = NULL;
int dllVersion = 0;int connectionId = 0;int attPacketsRead = 0;int errCode = 0;
int attention=0;dbSyncOn ( );dbSyncRate ( 60 );
Prof. R. Folgieri Realtà Virtuali aa 2010/2011
Integrare Mindwave in applicazione: esempio (1)
// caricamento dell’oggetto cubo e applicazione del layer desideratodbMakeObjectCube ( 1, 1 );dbLoadEffect ( "DetailMapping.dbs", 1, 1 );dbSetObjectEffect ( 1, 1 );
dbSetEffectConstantFloat ( 1, "detailScale", 1 );// verifica versione drivers installati e loro presenza nel sistema
dllVersion = TG_GetDriverVersion();// inizializzazione id di sessione e configurazione del bus di ascolto sulla porta
//16 (quella che risulta essere utilizzata dal mindset)
connectionId = TG_GetNewConnectionId();comPortName = "\\\\.\\COM16";
errCode = TG_Connect( connectionId, comPortName, TG_BAUD_9600, TG_STREAM_PACKETS );
attPacketsRead = 0;
Prof. R. Folgieri Realtà Virtuali aa 2010/2011
Integrare Mindwave in applicazione: esempio (2)
Integrare Mindwave in applicazione: esempio (3)// main program loopwhile ( LoopGDK ( ) ){
// lettura pacchetto dati dalla porta comint packetsRead = TG_ReadPackets(connectionId, -1);
if( packetsRead > 0 ) {// se il valore letto relativo all’attenzione è diverso da 0if(TG_GetValueStatus(connectionId, 2) != 0){
attention = TG_GetValue(connectionId, 2);// se il valore attenzione è superiore a 40, rotazione del cubo
if(attention > 40){dbSetCursor(10,10);dbPrint(double(attention));
// rotazione oggettodbTurnObjectLeft ( 1, 0.5 );
}attPacketsRead++;
} }// forzatura refresh dello schermodbSync ( );
}}
Prof. R. Folgieri Realtà Virtuali aa 2010/2011
ThinkGear in python• In Blender è incluso un motore python • disponibile un modulo python che fa il parser del protocollo ThinkGear• Funziona sia in Linux che in Windows• A questo link si trova il modulo (al momento la porta com deve essere
impostata a mano): http://github.com/groner/pythinkgear/
Prof. R. Folgieri Realtà Virtuali aa 2010/2011
ThinkGear in python: getting start• Serve python 2.6• Per download e install del modulo pythinkgear: easy_install thinkgear
(add on per scaricare e installare facilmente che si scarica dal Python Package index (pypi.python.org), e precisamente da http://peak.telecommunity.com/dist/ez_setup.py
• ora dalla shell python (avvio python in console mode), lanciarerfcomm_device=raw_input(‘num porta del mindwave (e.g. COM1)? ')
import loggingimport thinkgear
logging.basicConfig(level=logging.DEBUG)for pkt in thinkgear.ThinkGearProtocol(rfcomm_device).get_packets():packet_log.append(pkt)
• alla fine deve esserci una riga vuota. Questa serie di comandi comincerà ad inviare il log con i pacchetti attention/meditation/poor signal/eeg che riceve dal mindset
Prof. R. Folgieri Realtà Virtuali aa 2010/2011
ThinkGear in python: getting start• Dopo tante prove e bipbip…. Serve anche
http://sourceforge.net/projects/pyserial/
• Purtroppo la documentazione non è delle più chiare e non si
trovano esempi
• Occorre andare per tentativi
• Pyton – Blender può leggere i segnali
Prof. R. Folgieri Realtà Virtuali aa 2010/2011
Leggere Epoc Emotiv in python (1)• L’headset Emotiv Epoc ha 14 sensori EEG• Esiste un SDK a disposizione per scopi di ricerca, acquistabile a
$750, per ambiente Windows e totalmente proprietario.
• Cody Brocious ha però avviato l’Emokit project, una interfaccia open source per l’EPOC.
• Il codice è disponibile su github nel repository daeken/Emokit• Contiene una libreria Python per interagire con l’EPOC e per
mostrare graficamente I dati rilevati dai sensorihttps://github.com/daeken/Emokit
• La libreria consente di accedere ai dati Eeg da Emotiv EPOC su Windows, Linux, e OS X con Python.
Prof. R. Folgieri Realtà Virtuali aa 2010/2011
Prof. R. Folgieri Realtà Virtuali aa 2010/2011
Leggere Epoc Emotiv in python (3)
Prof. R. Folgieri Realtà Virtuali aa 2010/2011
Leggere Epoc Emotiv in python (4)
• Blender ha un motore python incorporato • attraverso il quale è possibile, dunque, utilizzare le librerie
viste sia con Neurosky mindwave, sia con Emotiv Epoc• Vedremo
– Come programmare in python– Come utilizzare python e includere librerie in blender
Prof. R. Folgieri Realtà Virtuali aa 2010/2011
Neurosky Mindwave ed Epoc Emotivin Blender con Python
• http://openvibe.inria.fr• Documentazione:
http://openvibe.inria.fr/documentation/unstable• Sistema modulare per organizzare velocemente ambienti
sperimentali• Più punti di vista
Prof. R. Folgieri Realtà Virtuali aa 2010/2011
Open VIBE – Open-Source Software Platformfor Brain-Computer Interfaces and Virtual Reality
AUTOREOPERATORE
SOGGETTO
• Piattaforma per analisi e processing real time di dati cerebrali (EEG, ECoG, MEG...) :– Acquisizione, pre-processing, processing e display
• Forum: http://openvibe.inria.fr/forum
Prof. R. Folgieri Realtà Virtuali aa 2010/2011
Open VIBE – funzionalità
• Graphical User Interface– Non necessario programmare– User-friendly– WYSIWYG– Per creare, monitorare
e raffinare scenari BCI• Supporta più device
– anche neurosky e epoc
Prof. R. Folgieri Realtà Virtuali aa 2010/2011
Open VIBE – Scenario designer
Prof. R. Folgieri Realtà Virtuali aa 2010/2011
Open VIBE – tool di visualizzazione
Prof. R. Folgieri Realtà Virtuali aa 2010/2011
Open VIBE – presentazione stimuli
Prof. R. Folgieri Realtà Virtuali aa 2010/2011
Open VIBE – presentazione stimuli
Prof. R. Folgieri Realtà Virtuali aa 2010/2011
Open VIBE – presentazione stimuli
Prof. R. Folgieri Realtà Virtuali aa 2010/2011
Open VIBE – presentazione stimuli
Prof. R. Folgieri Realtà Virtuali aa 2010/2011
Open VIBE – presentazione stimuli
Prof. R. Folgieri Realtà Virtuali aa 2010/2011
BCI2000: tool per esperimenti• http://www.bci2000.org/wiki/index.php/Programming_Howto:Quick
start_Guide• Occorre creare un account• Per chi è interessato: segnalare, perché l’account può essere
creato come lab
• Brain-controlled word processor: http://www.youtube.com/watch?v=J4Qw-iY6OGk
Prof. R. Folgieri Realtà Virtuali aa 2010/2011
BCI2000: tool per esperimenti• Occorre sempre lanciare moduli per:
– Signal source– Signal processing– Application
» un aiuto: BCI2000Launcer.exe