• No se han encontrado resultados

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

5.6

Sprint 5: Desarrollo de Aplicación para Visualización de

Documento similar