• No se han encontrado resultados

5. Casos de Estudio

5.4. Caso 3 Relaxity

El tercer caso de estudio consistió en la implementación de Relaxity. En la figura 5.27 se puede apreciar una imagen del sistema implementado. Relaxity es una aplicación de relajamiento mental / antiestrés en la que el usuario se encuentra inmerso dentro de un ambiente virtual en el que puede apreciar distintas imágenes como así también sonidos. La finalidad de esta aplicación es permitir al usuario relajarse y liberar el stress pudiendo controlar el ambiente virtual en el que se encuentra con suaves movimientos provocados por su cabeza. Se desea agregar la siguiente lista de gestos para poder permitirle al usuario controlar el volumen, la melodía o música ambiente, la imagen del ambiente, etc.:

● Mirar hacia la izquierda: Cambiar sonidos.

● Mirar hacia la derecha: Cambiar la imagen de fondo.

● Inclinar cabeza hacia la izquierda: Bajar volumen del sonido de fondo. ● Inclinar cabeza hacia la derecha: Subir volumen del sonido de fondo.

En primer lugar, se desarrolló una implementación básica de la aplicación que no contenía los gestos para permitir la interacción con el espacio virtual. Luego, se le solicitó a un desarrollador que implemente los 4 gestos nombrados anteriormente utilizando la implementación del framework descrita en el capítulo 4 para lograr el fin planteado en 5.1.3 mientras que a un segundo desarrollador se le solicitó lo mismo sin utilizar el framework. A continuación, procederemos a analizar ambas estrategias y el resultado que cada una arrojó.

Figura 5.27. Relaxity antes de incluir el reconocimiento de gestos.

5.4.1. Implementación sin utilizar el framework

Para implementar los requerimientos descritos inicialmente en esta sección se decidió realizar un script que maneje el cambio de canciones, otro que maneje el cambio de imagen de fondo y un tercero que maneja el control del volumen. Los tres utilizan el método Update() de Unity

para verificar en cada generación de frame si estos se están cumpliendo. Cada script debe evaluar en todo momento si se realizan los gestos deseados, es decir, no es necesario estar en ningún lugar del espacio virtual.

5.4.1.1. Configuración del script número 1: CambiarMusica

El script 1 tiene como objetivo cambiar la canción que se está reproduciendo de fondo al reconocer un gesto Look Right, sin utilizar el framework. Este script tiene 3 parámetros:

1. Canciones: Es un arreglo con las canciones disponibles para reproducir

2. Origen de Audio: Se debe especificar cuál es el Audio Source que se está utilizando en la aplicación.

3. Velocidad Rotación: Indica la velocidad con la que se debe rotar la cabeza para que el gesto sea reconocido.

4. Tiempo entre llamados: Es el tiempo entre las distintas veces que se ejecuta la acción de cambiar la canción de fondo.

Para este ejemplo, establecimos Velocidad de Rotación en 2, se especificó el origen de audio de la aplicación, se cargaron 10 canciones en el arreglo Canciones y se estableció dos segundos de espera entre llamadas a la acción. En la figura 5.28 puede verse una captura de Unity con el script configurado.

Figura 5.28. Configuración del script CambiarMusica. 5.4.1.2. Funcionamiento del script número 1: CambiarMusica

En la Figura 5.29 se puede ver el script número 1. Como se puede observar en el código del script el mismo no posee una condición convencional en la que se define una zona a la que debe entrar el User para luego activarse el reconocimiento de gestos. En este caso, el reconocimiento está activado desde el principio. Desde el comienzo, se toman los datos del sensor giroscopio para comprobar si el usuario realiza el movimiento necesario (mover la cabeza a la derecha) para cumplir con la velocidad configurada (líneas 29). De cumplirse esta

premisa, se lanza la acción configurada. En este caso, la acción se encuentra dentro del mismo script (línea 31-41). Entonces, si se realiza el gesto correspondiente, cambiará la canción de fondo de la aplicación. Cabe aclarar que, en este caso de estudio, en la figura donde puede observarse el script desarrollado no hay un recuadro que especifique la condición, como los casos anteriores. Esto puede observarse en los tres scripts desarrollados, debido a que no poseen ninguna condición para reconocer el gesto deseado. De esta forma, el script número 1 resuelve la problemática sin utilizar el framework. El script adicionalmente contiene controles para evitar que la acción sea ejecutada cada vez que se llama a la función Update (es decir, una vez por cada actualización de frame).

5.4.1.3. Configuración del script número 2: CambiarCielo

El script 2 tiene como objetivo cambiar la imagen que se ve de fondo al reconocer un gesto

Look Left, sin utilizar el framework. Este script tiene 2 parámetros:

1. Cielos: Es un arreglo con las distintas imágenes que se pueden colocar de fondo de la aplicación.

2. Velocidad Rotación: Indica la velocidad con la que se debe rotar la cabeza para que el gesto sea reconocido.

3. Tiempo entre llamados: Es el tiempo entre las distintas veces que se ejecuta la acción de cambiar el fondo.

Para este ejemplo, establecimos Velocidad Rotación en 2, se cargaron dos imágenes de fondo en el arreglo Cielos y se establecieron dos segundos de espera entre llamadas a la acción. En la figura 5.30 puede verse una captura de Unity con el script configurado.

Figura 5.30. Configuración del script CambiarCielo. 5.4.1.4. Funcionamiento del script número 2: CambiarCielo

En la Figura 5.31 se puede ver el script número 2. Como se puede observar en el código del script el mismo no posee una condición convencional en la que se define una zona a la que debe entrar el User para luego activarse el reconocimiento de gestos. En este caso, el reconocimiento está activado desde el principio. Desde el comienzo, se toman los datos del sensor giroscopio para comprobar si el usuario realiza el movimiento necesario (mover la cabeza a la izquierda) para cumplir con la velocidad configurada (línea 24). De cumplirse esta premisa, se lanza la acción configurada. En este caso la acción se encuentra dentro del mismo script (línea 26-34). Entonces, si se realiza el gesto correspondiente, cambiará la imagen de fondo de la aplicación. De esta forma, el script número 2 resuelve la problemática sin utilizar el framework. El script adicionalmente contiene controles para evitar que la acción

sea ejecutada cada vez que se llama a la función Update (es decir, una vez por cada actualización de frame).

Figura 5.31. Script implementado para la operación de CambiarCielo. 5.4.1.5. Configuración del script número 3: CambiarVolumen

El script 3 tiene como objetivo subir o bajar el volumen en respuesta a un gesto Tilt Right o

Tilt Left, respectivamente. Ambos sin utilizar el framework. Este script tiene 4 parámetros: 1. AudioMixer: Se debe especificar el Mixer que se está utilizando para manejar el

volumen.

2. Inclinación a derecha: A cuantos grados debe inclinar la cabeza el usuario hacia la derecha para reconocer el gesto Tilt Right.

3. Inclinación a izquierda: A cuantos grados debe inclinar la cabeza el usuario hacia la izquierda para reconocer el gesto Tilt Left.

4. Segundos entre llamadas: Es el tiempo entre las distintas veces que se ejecuta la acción de bajar o subir el volumen.

Para este ejemplo, establecimos el AudioMixer, inclinación a derecha en 45º, inclinación a izquierda 45º y se especificó un segundo de espera entre llamadas a las acciones. En la figura 5.32 puede verse una captura de Unity con el script configurado.

Figura 5.32. Configuración del script CambiarVolumen. 5.4.1.6. Funcionamiento del script número 3: CambiarVolumen

En la Figura 5.33 se puede ver el script número 3. Como se puede observar en el código del script el mismo no posee una condición convencional en la que se define una zona a la que debe entrar el User para luego activarse el reconocimiento de gestos. En este caso, el reconocimiento está activado desde el principio. Desde el comienzo, se toman los datos del sensor acelerómetro para comprobar si el usuario realiza alguno de los movimientos necesarios (inclinar la cabeza a la izquierda o a la derecha) en el ángulo configurado (línea 30 y 36). En este caso, el desarrollador decidió realizar las últimas dos acciones en un mismo script debido a que ambas son similares. De lo que no se percató el desarrollador es que, de esta manera, con los controles de tiempo para evitar el múltiple llamado de la acción por cada frame, evita que puedan ejecutarse seguidamente los distintos gestos. De todas maneras, seguiremos con el análisis. De cumplirse alguno de los dos gestos mencionados, se lanza alguna de las acciones configuradas. En este caso las acciones se encuentran dentro del mismo script (línea 52-66). Entonces, si se realiza alguno de los gestos necesarios, subirá o bajará el volumen de la música de la aplicación. De esta forma, el script número 3 resuelve la problemática sin utilizar el framework de los dos últimos puntos.

Figura 5.33. Script implementado para la operación de CambiarVolumen.

5.4.2. Implementación utilizando el framework

Para aprovechar las ventajas del framework se decidió primero formar las reglas que se utilizarían para los 4 requerimientos presentados en la introducción del caso 3. Recordemos que cada regla está conformada por Condición - Gesto - Acción. Así, análogamente al caso anterior cada regla será asociada uno a uno con una Condición, un gesto y una Acción utilizando los componentes que el framework provee. En la regla número 1 se asociará con

la Condición - Gesto - Acción relacionado al cambio de música. La regla número 2 se asociará con la Condición - Gesto - Acción relacionado al cambio de imagen de fondo. Las reglas número 3 y 4 se asociarán con las Condición - Gesto - Acción relacionados con el manejo del volumen de la aplicación. A continuación, la Tabla 5.5 muestra como ejemplo la materialización de las 4 reglas haciendo uso de la implementación del framework explicado en el capítulo 4. En ella podemos ver en la primera columna el número de regla. En la segunda columna se puede ver la condición de dicha regla. En la tercera columna se puede ver el/los gesto/s que se encuentran en dicha regla y por último en la cuarta columna la acción asociada a dicha regla. Así, la regla 1 por ejemplo está formada por la condición Condition_True el gesto Gesture_LookLeft y la acción ChangeMusic.ChangeMusicAction().

Implementación Regla N.º

Condición Gesto Acción

1 Condition_True Gesture_LookLeft ChangeMusic.C

hangeMusicActi on()

2 Condition_True Gesture_LookRight ChangeSkybox.

ChangeSkyboxA ction()

3 Condition_True Gesture_TiltLeft SetAudioLevels.

SetMusicLevel()

4 Condition_True Gesture_TiltRight SetAudioLevels.

SetMusicLevel()

Tabla 5.5. Configuración de las reglas utilizando la implementación del framework en Unity.

5.4.2.1. Configuración de la regla número 1

El objetivo de la regla número 1 es el de cambiar la melodía que se está reproduciendo en la aplicación en ese momento estando en cualquier lugar del mundo virtual al realizar el gesto LookLeft. La regla número 1 (fila 1 en tabla 5.5) no presenta una condición de cercanía a una zona, así que se utilizará la condición Condition_True para habilitar el reconocimiento del gesto continuamente. De esta forma queda configurada la condición de la regla. Para la configuración del gesto Gesture_LookLeft se establece la velocidad de movimiento de giro del gesto (turnSpeed) en 2 r/s para que cuando el usuario realice el giro de la cabeza hacia la izquierda (sentido Levógiro) a una velocidad tal que supere los 2 r/s partiendo desde una posición Landscape Left con el dispositivo mirando al frente, el gesto sea reconocido. Luego se configura un GestureListener con el gesto y la condición anteriormente descritos y se agrega la acción a ejecutar en caso de cumplirse las premisas antes enunciadas. En este caso la acción es el método ChangeMusic.ChangeMusicAction(). La figura 5.34 muestra la

configuración completa de la regla explicada. En dicha figura se puede ver la configuración de Condition_True, Gesture_LookLeft y GestureListener. A continuación, explicaremos cada parámetro a configurar de las diferentes partes de la regla. La condición será

Condition_True, el gesto será Gesture_LookLeft y la acción a llamar será

ChangeMusic.ChangeMusicAction(). La condición permitirá el reconocimiento del gesto en todo momento, el gesto reconocerá si el gesto Look Left fue realizado y la acción cambiará la música que se encuentra sonando en ese momento.

Figura 5.34. Configuración de la regla número 1. 5.4.2.2. Configuración de la regla número 2

El objetivo de la regla número 2 es el de cambiar el ambiente que se está mostrando en la aplicación en ese momento estando en cualquier lugar del mundo virtual al realizar el gesto

Look Right. La regla número 2 (fila 2 en tabla 5.5) no presenta una condición de cercanía a una zona, así que se utilizará la condición Condition_True para habilitar el reconocimiento del gesto continuamente. De esta forma queda configurada la condiciónde la regla. Para la configuración del gesto Gesture_LookRight se establece la velocidad de movimiento de giro del gesto(turnSpeed) en 2 r/s para que cuando el usuario realice el giro de la cabeza hacia la derecha (sentido dextrógiro) a una velocidad tal que supere los 2 r/s partiendo desde una posición Landscape Left con el dispositivo mirando al frente, el gesto sea reconocido. Luego se configura un GestureListener con el gesto y la condición anteriormente descritos y se agrega la acción a ejecutar en caso de cumplirse las premisas antes enunciadas. En este caso la acción es el método ChangeSkybox.ChangeSkyboxAction(). La figura 5.35 muestra la configuración completa de la regla explicada. En dicha figura se puede ver la configuración de Condition_True, Gesture_LookRight y GestureListener. A continuación, explicaremos

cada parámetro a configurar de las diferentes partes de la regla. La condición será

Condition_True, el gesto será Gesture_LookRight y la acción a llamar será

ChangeSkybox.ChangeSkyboxAction(). La condición permitirá el reconocimiento del gesto en todo momento, el gesto reconocerá si el gesto Look Right fue realizado y la acción cambiará el ambiente que se está mostrando en ese momento.

Figura 5.35. Configuración de la regla número 2. 5.4.2.3. Configuración de la regla número 3

El objetivo de la regla número 3 es el de bajar el volumen de la música que se está reproduciendo en la aplicación en ese momento estando en cualquier lugar del mundo virtual al realizar el gesto Tilt Left. La regla número 3 (fila 3 en tabla 5.5) no presenta una condición de cercanía a una zona, así que se utilizará la condición Condition_True para habilitar el reconocimiento del gesto continuamente. De esta forma queda configurada la condiciónde la regla. Para la configuración del gesto Gesture_TiltLeft se establece la inclinación del dispositivo (inclination) en 45 grados para que cuando el usuario incline el dispositivo hacia la izquierda superando los 45 grados configurados partiendo desde una posición Landscape Left con el dispositivo mirando al frente, el gesto sea reconocido. Luego se configura un

Gesture_Listener con el gesto y la condición anteriormente descritos y se agrega la acción a ejecutar en caso de cumplirse las premisas antes enunciadas. En este caso la acción es el método SetAudioLevels.SetMusicLevel() al que se le pasa un parámetro de -0.1 para que disminuya el volumen con esa intensidad. La figura 5.36 muestra la configuración completa de la regla explicada. En dicha figura se puede ver la configuración de Condition_True, Gesture_TiltLeft y GestureListener. A continuación, explicaremos cada parámetro a

configurar de las diferentes partes de la regla. La condición será Condition_True, el gesto será Gesture_TiltLeft y la acción a llamar será SetAudioLevels.SetMusicLevel(). La condición permitirá el reconocimiento del gesto en todo momento, el gesto reconocerá si el gesto Tilt Left fue realizado y la acción disminuirá el volumen con el que la música se está reproduciendo en ese momento.

Figura 5.36. Configuración de la regla número 3. 5.4.2.4. Configuración de la regla número 4

El objetivo de la regla número 4 es el de subir el volumen de la música que se está reproduciendo en la aplicación en ese momento estando en cualquier lugar del mundo virtual al realizar el gesto Tilt Right. La regla número 4 (fila 4 en tabla 5.5) no presenta una condición de cercanía a una zona, así que se utilizará la condición Condition_True para habilitar el reconocimiento del gesto continuamente. De esta forma queda configurada la condiciónde la regla. Para la configuración del gesto Gesture_TiltRight se establece la inclinación del dispositivo (inclination) en 45 grados para que cuando el usuario incline el dispositivo hacia la derecha superando los 45 grados configurados partiendo desde una posición Landscape Left con el dispositivo mirando al frente, el gesto sea reconocido. Luego se configura un

GestureListener con el gesto y la condición anteriormente descritos y se agrega la acción a ejecutar en caso de cumplirse las premisas antes enunciadas. En este caso la acción es el método SetAudioLevels.SetMusicLevel() al que se le pasa un parámetro de 0.1 para que aumente el volumen con esa intensidad. La figura 5.37 muestra la configuración completa de

la regla explicada. En dicha figura se puede ver la configuración de Condition_True, Gesture_TiltRight y GestureListener. A continuación, explicaremos cada parámetro a configurar de las diferentes partes de la regla. La condición será Condition_True, el gesto será Gesture_TiltRight y la acción a llamar será SetAudioLevels.SetMusicLevel(). La condición permitirá el reconocimiento del gesto en todo momento, el gesto reconocerá si el gesto Tilt Right fue realizado y la acción aumentará el volumen con el que la música se está reproduciendo en ese momento.

5.4.3. Resultados obtenidos

Una vez realizadas las dos implementaciones, se calcularon métricas de código sobre las mismas. En primer lugar, se le preguntó a cada desarrollador cuanto tiempo llevo desarrollar cada implementación. En el caso de la implementación sin framework, el usuario reconoció haber tardado dos horas y cincuenta minutos para desarrollar la solución. De este tiempo, al menos una hora treinta minutos fue el tiempo que invirtió investigando. En cuanto a la implementación utilizando el framework, el usuario reconoció haber tardado una hora y veinticinco minutos en desarrollar la solución. De este tiempo, cuarenta minutos fueron empleados para entender el funcionamiento del framework y de qué manera realizar las acciones deseadas. La tabla 5.6 resume los resultados obtenidos.

Proyecto Tiempo de inducción Tiempo de desarrollo puro Complejidad ciclomática Líneas de código Relaxity (Sin framework) 1:30 hs 1:20 hs 26 65 Relaxity (Con framework) 0:40 hs 0:45 hs 11 17 Diferencia 0:50 hs (55.55%) 0:35 hs (43.75%) 15 (57.69%) 48 (73.84%)

Tabla 5.6. Comparación de resultados de las métricas

Como en los dos casos anteriores, se obtuvieron resultados positivos en todas las métricas, pero hay diferencias mucho menores que en los otros casos.

En cuanto a los tiempos, la diferencia en el tiempo de inducción es mucho menor que en los otros dos casos, debido a que las acciones a ejecutar poseen una complejidad mayor, ya que requiere conocimientos en cuanto al manejo del sistema de audio de Unity, y el manejo de fondos de mapas y materiales. Estos conocimientos deben ser adquiridos en ambas implementaciones.

La dificultad extra en las acciones conlleva a un aumento considerable en el código necesario en las acciones. Esto impacta directamente en la complejidad ciclomática, debido a que el manejo de audio y fondos de pantalla requiere ciertas condiciones para evitar ciertos problemas, como, por ejemplo, el solapamiento al cambiar de canción.

5.5. Resumen

A lo largo de este capítulo pudimos ver las ventajas que aporta la utilización del framework medidas en tiempo de inducción, tiempo de desarrollo, cantidad de líneas de código que hay que escribir para cumplir con la misma funcionalidad y complejidad ciclomática. En cada uno

Documento similar