Figura 28 Sprint Número Cuatro Fuente: Propia
En este sprint se realiza la adquisición de los datos para el registro de la actividad cerebral, esto se realiza por medio del Community SDK del Emotiv Epoc, en donde se toman métricas de rendimiento traducidas como emociones y los valores de las bandas de poder que vienen en PSD (Power Spectral Density) y son procesados para tenerlos en decibeles.
Historia de Usuario
Historia de Usuario Número: 1 Fecha:
Nombre historia: Adquisición de registro de actividad cerebral Prioridad en negocio: Riesgo en desarrollo:
90
Alta Media
Puntos estimados: 2 Iteración asignada: 1
Programador responsable: Andrés Ovidio Restrepo Rodríguez, Daniel Esteban Casas Mateus
Descripción:
Por medio del Community SDK del Emotiv Epoc se realiza la implementación de funcionalidades para establecer una conexión con el dispositivo y luego capturar la actividad cerebral detectada tanto en emociones como en bandas de poder.
Observaciones:
1. El Emotiv Epoc debe estar con carga para realizar la conexión. 2. El Dongle debe estar conectado al computador.
Tabla 29 Historia de usuario sprint 4 Fuente: Propia
Sprint Backlog
ID Nombre Descripción Estimación
(horas)
Prioridad
1
Implementación del SDK del Emotiv Epoc junto con herramienta de desarrollo Seleccionar la herramienta de desarrollo y realizar la conexión con el SDK al Emotiv Epoc 150 Alta 2 Adquisición de registro de la actividad cerebral Almacenar mediante el SDK los datos de las emociones y de las bandas de poder en variables
234 Alta
Tabla 30 Sprint backlog sprint 4 Fuente: Propia
Capítulo 5 - Modelo de Desarrollo Propuesto
91
Tareas Sprint 4
Tarea
Número tarea: 1 Número historia: 1
Nombre tarea: Implementación del SDK del Emotiv Epoc junto con herramienta de desarrollo
Tipo de tarea: Desarrollo
Puntos estimados: 1
Fecha inicio: 05/11/2018 Fecha fin: 14/11/2018
Responsable: Andrés Ovidio Restrepo Rodríguez, Daniel Esteban Casas Mateus Descripción:
Se realiza la implementación del SDK del Emotiv Epoc en Python para establecer la conexión con el dispositivo y empezar la interacción con este.
Tabla 31 Tarea 1 sprint 4 Fuente: Propia
Tarea
Número tarea: 2 Número historia: 1
Nombre tarea: Adquisición de registro de la actividad cerebral Tipo de tarea:
Desarrollo
Puntos estimados: 1
Fecha inicio: 15/11/2018 Fecha fin: 01/12/2018
Responsable: Andrés Ovidio Restrepo Rodríguez, Daniel Esteban Casas Mateus Descripción:
Con la conexión satisfactoria al Emotiv Epoc por medio del SDK, se procede a implementar las funciones para la extracción de datos específicos como lo son los valores normalizados de las emociones y las bandas de poder.
92
Tabla 32 Tarea 2 sprint 4 Fuente: Propia
Desarrollo Tareas Sprint 4
5.5.4.1
Desarrollo Tarea 1 : Implementación del SDK del Emotiv Epoc junto con
herramienta de desarrollo
Para realizar la implementación del Emotiv SDK (Software Development Kit) Community Edition. Version 3.5 se procede a realizar su descarga del repositorio en línea, el cual se encuentra en la siguiente dirección.
https://github.com/Emotiv/community-sdk
Dentro del SDK se tienen ejemplos e implementación para distintos lenguajes de programación, los cuales fueron explorados para conocer la funcionalidad del software, a partir de esta exploración se determinó que el lenguaje a utilizar es Python.
Para realizar la conexión con el Emotiv Epoc es necesario importar el EDK (Embedded Devolopment Kit) que se selecciona dependiendo del sistema operativo en uso, para este caso la implementación se realiza en Windows, y el fragmento de código para seleccionar el EDK es el siguiente:
try:
if sys.platform.startswith('win32'):
libEDK = cdll.LoadLibrary("../../bin/win64/edk.dll")
elif sys.platform.startswith('linux'):
srcDir = os.getcwd()
if platform.machine().startswith('arm'):
libPath = srcDir + "/../../bin/armhf/libedk.so"
else:
libPath = srcDir + "/../../bin/linux64/libedk.so"
libEDK = CDLL(libPath)
else:
Capítulo 5 - Modelo de Desarrollo Propuesto
93 except Exception as e:
print 'Error: cannot load EDK lib:', e exit()
Código 35 Conexión Emotiv SDK Community Fuente: Propia
Al realizar la ejecución del fragmento de código anterior, se importa el archivo ya mencionado y se ejecuta, al finalizar la ejecución y con el Dongle conectado al computador la conexión debe ser satisfactoria, para comprobar esto se ejecuta lo siguiente:
if libEDK.IEE_EngineConnect("Emotiv Systems-5") != 0:
print "Emotiv Engine start up failed."
exit();
Código 36 Comprobación de conexión Emotiv Epoc Fuente: Propia
Esto quiere decir que si la función IEE_EngineConnect() con parámetro "Emotiv Systems-5" retorna un valor diferente a 0 quiere decir que la conexión no se realizó, en caso contrario la conexión se realizó satisfactoriamente.
5.5.4.2
Desarrollo Tarea 2 : Adquisición de registro de la actividad cerebral
Con la conexión al dispositivo realizada satisfactoriamente se procede a la adquisición de la actividad cerebral en dos partes, la primera el valor normalizado de las emociones y la segunda el valor de las bandas de poder.Como primera parte se obtendrá un valor entre 0 y 1 de una emoción específica donde la función de la emoción retornará un valor decimal dentro de este rango, las emociones a utilizar son estrés, relajación, compromiso, interés y concentración, a continuación, se muestra como ejemplo la forma de obtención del valor para el estrés:
# stress
IS_PerformanceMetricGetStressScore =
libEDK.IS_PerformanceMetricGetStressScore IS_PerformanceMetricGetStressScore.restype = c_float
94
IS_PerformanceMetricGetStressScore.argtypes = [c_void_p]
…
stress = IS_PerformanceMetricGetStressScore(eState)
Código 37 Adquisición de valores normalizado de emociones Fuente: Propia
Con los valores almacenados en variables y la conexión abierta se realiza un ciclo para actualizar en tiempo real el valor que va cambiando para cada una de las emociones, a continuación, se muestra el fragmento de código con esta funcionalidad:
while True:
cnt+=1
t += 0.05
state = libEDK.IEE_EngineGetNextEvent(eEvent)
if state == 0:
eventType = libEDK.IEE_EmoEngineEventGetType(eEvent)
libEDK.IEE_EmoEngineEventGetUserId(eEvent, user)
if eventType == 64:
libEDK.IEE_EmoEngineEventGetEmoState(eEvent, eState)
stress, relax, engag, interes, focus =
logPerformanceMetrics(userID, eState)
elif state != 0x0600:
print "Internal error in Emotiv Engine ! "
time.sleep(0.1)
Código 38 Captura de emociones en tiempo real Fuente: Propia
Como segunda parte se obtendrán los valores de las bandas de poder, para ello se debe tener la lista de los 14 canales que tiene el Emotiv Epoc, a continuación, se muestra el arreglo con dicha información:
Capítulo 5 - Modelo de Desarrollo Propuesto
95
channelList = array('I',[3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16])
Código 39 Lista de canales Emotiv Epoc Fuente: Propia
Cada uno de los canales representa un electrodo, para el caso de la graficación de las bandas de poder se seleccionaron los canales 3, 4, 5, 6, 14, 15, 16 y 17 que representan los canales que se encuentran ubicados en el lóbulo frontal, el cual se relaciona directamente con la corteza motora.
Las unidades de los valores de las bandas de poder vienen en PSD (Power Spectral Density), para poder realizar una gráfica de estos valores se debe realizar la conversión a Decibeles (Db) lo cual se realiza con la siguiente función:
def psdToDb(voltage):
if (voltage == 0):
valueDB = 1
else:
valueDB=10*np.log10(voltage)
return valueDB
Código 40 Convertir PSD a Decibeles Fuente: Propia
En esta función se recibe el valor en PSD y se devuelve en dB, la fórmula matemática usada para este proceso es la siguiente (Universiteit van Amsterdam, 2010):
𝑃𝑆𝐷𝑑𝐵(𝑓) = 10 log10𝑓
Luego de pasar cada uno de los valores a decibeles se realiza el cálculo del promedio para cada tipo de onda cerebral, que para este caso son, theta, alpha, gamma, low_beta y high_beta, el promedio se realiza para tener un único valor entre los canales utilizados, adicionalmente se realiza en un ciclo para obtener los valores en tiempo real, esto se realiza de la siguiente forma:
while True:
96 if state == 0:
eventType = libEDK.IEE_EmoEngineEventGetType(eEvent)
libEDK.IEE_EmoEngineEventGetUserId(eEvent, user)
ready = 1
if ready == 1:
for i in channelList:
result = c_int(0)
result = libEDK.IEE_GetAverageBandPowers(userID, i, theta, alpha, low_beta,
high_beta,gamma)
promedio_theta = psdToDb(promedio_theta/len(channelList))
promedio_alpha = psdToDb(promedio_alpha/len(channelList))
promedio_gamma = psdToDb(promedio_gamma/len(channelList))
promedio_low_beta =
psdToDb(promedio_low_beta/len(channelList))
promedio_high_beta =
psdToDb(promedio_high_beta/len(channelList))
Código 41 Captura Power Band en tiempo real Fuente: Propia