Mostrando entradas con la etiqueta TFG. Mostrar todas las entradas
Mostrando entradas con la etiqueta TFG. Mostrar todas las entradas

domingo, 3 de mayo de 2015

Proyecto Kinect: Comparación de esqueletos

Se puede obtener una solución a la comparación entre articulaciones de distintos esqueletos, de la forma en que realizamos el guardado de las mismas en el punto anterior.

Teniendo guardado los puntos de las articulaciones de dos esqueletos, se podría realizar una comparación de los ángulos que forman entre sí. La utilización de esta técnica de comparación viene motivada por el hecho de que, por ejemplo, existen personas con diferente altura, es decir, diferente tamaño de esqueleto. Por tanto, otra técnica como, por ejemplo, la de diferenciar los puntos de las articulaciones, nos daría muchos problemas en la comparación. Dicho lo cual, se decide utilizar la técnica de cálculo de la amplitud o ángulo de las articulaciones del esqueleto. Esas amplitudes son comparadas para buscar las similitudes con las amplitudes de otros esqueletos.

Observando el esqueleto de la siguiente ilustración podemos observar los ángulos que serán calculados para realizar la comparación entre posturas, concretamente, para la parte del miembro superior.
Esquema con los ángulos a calcular

Fijándonos en un ángulo concreto su cálculo se realizará llamando al método devAnguloEntrePuntos, que devuelve el ángulo calculado y recibe como parámetros las coordenadas (x, y, z) de los tres Joints o puntos de unión. En la siguiente imagen se muestra el ángulo formado por las tres articulaciones (Joints).
Esquema del ángulo calculado a partir de tres articulaciones
El método en código C# es el siguiente:

Código C# para el cálculo del ángulo
El método devAnguloEntrePuntos hace uso de otro método para calcular el vector normal producido por las coordenadas de los tres Joints. El método para calcularlo es el siguiente:

Código C# para el cálculo del vector normal
Finalizando con este post, una vez que se ha realizado el cálculo de los ángulos de las articulaciones de dos posturas distintas (en nuestro sistema se habla de dos posturas una para el paciente, y otra, para el fisioterapeuta) se realiza la diferencia entre ambos ángulos. En la siguiente figura se puede ver el código necesario para realizar la diferencia entre el ángulo de la muñeca derecha del esqueleto del fisioterapeuta y del paciente.
Diferencia entre el ángulo del fisioterapeuta y del paciente
En el siguiente post, hablaré del reconocimiento de comandos de voz con Microsoft Kinect.

Un saludo!

Álvaro Alcolea

jueves, 30 de abril de 2015

Proyecto Kinect: Guardado y manejo de esqueletos

Como se comentó en el post anterior, el seguimiento del esqueleto es una de las características estrella del sensor Kinect. A través de la función Skeleton Tracking nos permite obtener la situación de un esqueleto completo, haciendo uso de un algoritmo que logra identificar partes del cuerpo de las personas que se encuentran en el campo de visión del sensor.

El Skeleton Tracking ofrece toda la información del esqueleto en forma de un conjunto de puntos o articulaciones (Joints). En la siguiente imagen se pueden observar las 20 articulaciones distintas que Kinect puede detectar y nos permite manejar:

Esqueleto que muestra las 20 articulaciones capturadas por el sensor Kinect

El SDK de Kinect permite obtener los puntos y la posición en el espacio de las 20 articulaciones de una forma sencilla. Cada vez que el sensor detecta un esqueleto lanza el evento SkeletonFrameReady, éste a su vez, haciendo uso del objeto SkeletonFrame, captura los datos del Skeleton (esqueleto detectado).

Para nuestro sistema a desarrollar se requiere la detección de aquellos esqueletos que generen datos, es por ello que en el evento SkeletonFrameReady se comprueba la propiedad TrackingState, la cual verifica si el estado del esqueleto es el esperado. Dicha propiedad puede tener los siguientes valores: NotTracked (No se detecta esqueleto), PositionOnly (Se detecta esqueleto pero no de forma completa), Tracked (Se detecta esqueleto completamente).

Realizado lo anterior, se puede proceder a la obtención de los puntos que conforman el esqueleto detectado. Lo haremos haciendo uso del tipo enumerado JoinType.[nombreArticulación], el cual nos permite acceder de una forma fácil a cada punto. Puede verse un ejemplo en la primera línea de la siguiente imagen:

Código C# para obtener las coordenadas (x,y,z) de una articulación

Nuestro objetivo aquí, es obtener los datos de la posición de cada articulación, es por ello que tenemos que ir un poco más allá y utilizar el tipo SkeletonPoint ofrecido por el SDK de Kinect. Podemos ver un ejemplo en la segunda línea de código de la imagen anterior.

Finalmente, una vez hemos obtenido la posición de la articulación, el objetivo final es conseguir su guardado en la base de datos. Para ello se utilizarán tres variables: una variable X, una Y, y otra Z que hacen referencia al punto en el espacio que tiene la articulación con respecto a la posición del sensor. Esto facilitaría la tarea de almacenar las articulaciones en, por ejemplo, nuestra base de datos. Siguiendo con el ejemplo, a partir de la tercera línea de código de la imagen anterior se puede ver claramente.

Para terminar este post, recordar que el código en lenguaje C# de la imagen anterior está relacionado con el modelo creado para almacenar los datos recogidos por el sensor Kinect. Se comentarán en siguientes post las tecnologías relacionadas para crear un bloque completo de todo el sistema, en el que todas las partes se relacionen, ya que, además, se tendrá una interfaz gráfica por un lado, por otro, datos recogidos por el sensor a almacenar en el modelo de base de datos, servicios web, etc.

En el siguiente post, seguiré hablando de la detección de esqueletos. 

¡Un saludo!

Álvaro Alcolea

jueves, 9 de abril de 2015

Proyecto Kinect: Tecnologías aplicadas (SDK Oficial Kinect)

Para la implementación del sistema se requerían diversas tecnologías y entornos de desarrollo. En este post y siguientes, se describen tales tecnologías y su aplicación en el sistema

La última SDK oficial de Kinect lanzada por Microsoft fue publicada el 17 de Septiembre de 2013. Se denomina Kinect for Windows SDK en su versión 1.8. Con anterioridad, Microsoft lanzó otras cuatro versiones comerciales, la primera de ellas lanzada el 1 de Febrero de 2012.

El SDK de Kinect brinda una serie de bibliotecas y herramientas que ayudan a los desarrolladores a utilizar todas las funcionalidades del dispositivo Kinect. Este dispositivo en conjunción con sus bibliotecas interactúa con la aplicación como muestra la siguiente imagen:

Interacción entre software y hardware de Kinect con la aplicación

El SDK de Kinect, por tanto, funciona como una interfaz entre el dispositivo Kinect y la aplicación desarrollada. Cuando es necesario acceder al sensor, la aplicación envía una llamada a la API y ésta a los drivers.

Los drivers instalados para los diferentes sensores que incorpora Kinect se asientan con los componentes de los drivers de los dispositivos del sistema Windows, pudiéndose comunicarse entre sí. Los drivers ayudan a transmitir los datos de video y audio de los sensores y devolverlos a la aplicación. Estos drivers, por ejemplo, ayudan a detectar el conjunto de micrófonos que incluye Kinect como un dispositivo de audio predeterminado y también a ayudarle a interactuar con el motor de reconocimiento de voz de Windows por defecto.

Para entender la funcionalidad de las diferentes APIs y conocer su uso,  es bueno tener una visión clara de la manera en que trabajan. Se pueden clasificar las bibliotecas del SDK de Kinect en las dos categorías siguientes:
  • Aquellas que controlan y acceden a los sensores de visión de Kinect.
  • Aquellas que acceden a los micrófonos y el control del audio.
La primera categoría hace referencia a los sensores de captura del flujo de color, flujo de datos infrarrojos, y flujo de profundidad, también el control de la inicialización del sensor y el seguimiento de los esqueletos humanos. Un conjunto de APIs en esta categoría se comunica directamente con el hardware del sensor, mientras que unas pocas APIs de procesamiento se aplican a los datos que se capturan desde el sensor.

Por otro lado, las APIs de audio controlan el conjunto de micrófonos Kinect y ayudan a capturar el flujo de audio a partir de los sensores, el control del origen del sonido que permite el reconocimiento de voz. En la siguiente imagen se muestra una clasificación de alto nivel basada en el tipo de trabajo que realiza la API:
Clasificación del SDK de Kinect (Imagen: Libro "Kinect for Windows SDK Programming Guide". autor Abhijit Jana)
También se define la API SDK como Natural User Interfaces (NUI), que recupera los datos del sensor de profundidad y cámara a color y captura el flujo de datos de audio. Hay varias APIs que se escriben en la parte superior de las API NUI, tales como, aquellas para la recuperación de la información del sensor, simplemente mediante la lectura de los detalles del sensor y para el seguimiento de esqueletos humanos, siempre basado en el flujo de datos de profundidad devuelto desde el sensor.

La arquitectura que nos ofrece este SDK de Kinect se puede ver en la siguiente imagen:

Arquitectura SDK de Kinect (Imagen: Libro Kinect "Kinect for Windows SDK Programming Guide". autor Abhijit Jana)
Puntos clave detallados:
  1. Hardware: se compone de los componentes hardware, como son el sensor Kinect y el hub USB a través del cual el sensor se conecta al PC.
  2. Drivers: se compone de todos los drivers que necesita Windows para que el sensor funcione correctamente. Son instalados como parte del proceso de instalación del SDK de Kinect.
  3. Componentes de video y audio: permiten el acceso a los recursos del dispositivo. Como son el seguimiento del esqueleto, datos de profundidad e imagen capturada de la cámara.
  4. DirectX Media Object (DMO): para usar con aplicaciones como DirectShow o Media Foundation. Necesario para el funcionamiento del conjunto de micrófonos.
  5. Speech APIs: proveen el acceso al audio, y las APIs necesarias de Windows 8 para el reconocimiento de voz.
En cuanto a las funcionalidades y características del SDK de Kinect  que son de utilidad para el TFG realizado se tienen las siguientes:
  • Captura y procesamiento del flujo de datos de imágenes en color: captura imágenes a través de la cámara a color y permite obtener lo que ocurre en tiempo real.
  • Procesamiento del flujo de datos de la imagen de profundidad: captura imágenes, pero, sin embargo, son realizadas en escala de grises siendo capaz de detectar la profundidad de un cuerpo.
  • Seguimiento del esqueleto humano y los movimientos articulares: es una de las características más importantes del sensor Kinect, ya que es capaz de detectar 20 articulaciones de 2 esqueletos diferentes situados delante del sensor.
  • Activación del reconocimiento de voz: Kinect utiliza la tecnología de reconocimiento de voz a través de su conjunto de micrófonos que lleva consigo y permite localizar el origen del sonido.
  • Ajuste del ángulo del sensor Kinect: el sensor permite ser orientado hacia arriba o hacia abajo a través de la aplicación desarrollada.

Tras este paseo por las características y funcionalidades más importantes del SDK de Kinect, en siguientes posts os adentraré en los algoritmos y funcionalidades que he considerado aplicar en el TFG.


Álvaro Alcolea

martes, 7 de abril de 2015

Proyecto Kinect: Arquitectura considerada para el sistema

La arquitectura propuesta para llevar a cabo la finalidad de la aplicación se basa en el patrón Model-View-ViewModel, en el uso de servicios web, en la consideración de dos aplicaciones cliente y del dispositivo Kinect en ambos clientes. Por un lado, el sistema estaría compuesto por un cliente que únicamente utilizaría el rol administrador o fisioterapeuta, y por otra parte, existiría otro cliente que utilizaría el rol usuario o paciente. Siendo esas dos aplicaciones cliente diferentes en su funcionalidad y presentación. En cualquier caso, el cometido de ambos tipos de cliente consiste en realizar consultas a una base de datos distribuida a través de servicios web.

Arquitectura hardware del sistema

En siguientes posts, detallaré las tecnologías utilizadas y los casos concretos más importantes.


Álvaro Alcolea

jueves, 19 de febrero de 2015

Proyecto Kinect: Metodología de diseño centrado en el uso

A continuación se detalla, en qué consiste la metodología de diseño centrado en el uso, el por qué de su elección y los diferentes modelos a realizar para conseguir la elaboración final del sistema.

La metodología de diseño centrado en el uso propone un proceso sistemático basado en modelos abstractos para diseñar un sistema de la forma más sencilla posible, siendo éste compatible con todas las tareas que los usuarios necesitan llevar a cabo.

La elección de esta metodología viene motivada a que la aplicación gira en torno a diferentes usuarios objetivo que necesitan llevar a cabo diferentes tipos de uso de la aplicación. Esta metodología, por tanto, está enfocada y considera especialmente el uso que el usuario hace o hará de la aplicación, es por ello que se trata de la metodología idónea para llevar a cabo el desarrollo de este proyecto y facilitar un producto software con garantías de éxito y aceptación.

El diseño centrado en el uso descansa en la elaboración de tres modelos abstractos estrechamente relacionados que se siguen en este TFG. Estos modelos son: modelo de roles, modelo de tareas y un modelo de contenidos.
  • El modelo de roles captura las características más destacadas de los papeles que desempeñan los usuarios en relación con el sistema.
  • El modelo de tareas representa la estructura del trabajo o los pasos que los usuarios necesitan llevar a cabo en relación con el sistema.
  • El modelo de contenidos representa los contenidos y la organización de la interfaz de usuario, necesarios para apoyar las tareas identificadas en el modelo de tareas.
Proceso basado en modelos abstractos en el diseño centrado en el uso



Conceptualmente, una derivación sencilla y directa une el diseño final a los casos de uso que apoyan los roles de usuario. Cada pantalla, formulario u otra interacción corresponden a un prototipo abstracto que apoya un grupo de casos de uso interrelacionados.


Este post, pese a que es teórico, lo creo muy importante en la ayuda que supone para la realización del proyecto. Se trata de aplicar y seguir una metodología que aporta las pautas y relaciones necesarias para que todo encaje de la mejor manera en el proyecto.

Nota: todos los modelos realizados para el diseño del sistema los puedo compartir previa solicitud en forma de comentario en este mismo blog.


Álvaro Alcolea

martes, 3 de febrero de 2015

Proyecto Kinect: Entorno de captura y gestión de movimientos utilizando Kinect

Se trata de mi trabajo fin de grado (TFG) realizado entre Febrero y Julio del año 2014. Fue desarrollado con el objetivo de elaborar un entorno que facilitase la definición de terapias ligadas al ámbito de la rehabilitación física, utilizando el sensor Kinect como dispositivo que controle la ejecución de los ejercicios por parte de un paciente. Que además, permita almacenar, consultar, modificar y eliminar movimientos corporales y otros datos de interés utilizando la tecnología de Kinect y una serie de herramientas que ayuden a la gestión de los datos empleados. Los movimientos almacenados en la aplicación podrán ser, más tarde, comparados con otros movimientos similares identificando similitudes y diferencias. 



En este blog voy a añadir los estudios y trabajos llevados a cabo para la consecución final del proyecto. Publicaré en siguientes posts la gran mayoría de detalles y conocimientos sobre el manejo de todos los aspectos y tecnologías utilizadas.

Álvaro Alcolea