martes, 22 de mayo de 2012

Integración de Kinect (Parte I)

Como última mejora de nuestro sistema, hemos integrado en él el control del robot Kigo a través de Kinect.

Para ello, hemos partido de un proyecto open source para el reconocimiento de gestos a través del Software Development Kit (SDK) de Kinect que nos ha facilitado nuestro tutor Juan Manuel Montero.
El código de este proyecto está escrito en C#, a diferencia del código con el que hemos estado trabajando en el resto de las fases de desarrollo de nuestro sistema, que estaba escrito en Java.

Al igual que ocurría en el reconocimiento de gestos a través del acelerómetro de un dispositivo Android, el algoritmo usado para calcular distancias es el alineamiento temporal dinámico (DTW).

La principal diferencia que encontramos entre lo explicado para el acelerómetro del móvil y Kinect es que, en esta ocasión, en lugar de trabajar con 3 coordenadas de la aceleración sufrida por el móvil, trabajamos con posiciones de nuestro esqueleto. Estudiaremos la posición de 6 partes de nuestro cuerpo: mano izquierda y derecha, muñeca izquierda y derecha y codo izquierdo y derecho. Nuestro nuevo sistema de coordenadas será de 2 dimensiones, por lo que sólo tendremos coordenadas (x,y). Además, el origen de coordenadas lo tendremos en el punto medio del segmento que une ambos hombros.

En primer lugar, hablaremos en esta entrada brevemente del hardware del que dispone Kinect y las funcionalidades que nos proporciona Microsoft mediante el SDK para Kinect; posteriormente, en la siguiente entrada, nos centraremos en todo el software relacionado con el sistema de reconocimiento de gestos que hemos integrado y en la interfaz gráfica que usamos.


Breve descripción del hardware de Kinect

Kinect es un controlador de videojuegos desarrollado por Microsoft para la videoconsola XBOX 360. Este controlador permite al usuario interactuar con la consola sin necesidad de tener contacto físico, mediante el reconocimiento de gestos, de voz o de imágenes.

El hardware de Kinect está contenido en una barra horizontal de unos 23 cm de largo, conectado a una base circular con un eje de articulación. Dispone de un mecanismo de inclinación motorizado que le permite inclinarse ±27º.

Los sensores que dotan a Kinect de su funcionalidad son principalmente:
  • Sensor de profundidad: Mediante un proyector de infrarrojos y un sensor CMOS monocromático, Kinect puede capturar datos de vídeo en 3D sean cuales sean las condiciones de luz ambiental. Los datos de vídeo tienen una resolución VGA (640x480 píxels) a 11 bits, proporcionando así 2.048 niveles de sensibilidad. Se capturan 30 frames por segundoSu campo de visión es de unos 57º horizontalmente y 43º verticalmente. Además, puede detectar un rango de 1,2-3,5 metros.
  • Cámara de color: Utiliza una resolución VGA (640x480 píxels) a 8 bits
  • Un array de 4 micrófonos, con audio representado por 16 bits y enviado a 16 KHz.


Software Development Kit para Kinect

En febrero del 2011, Microsoft lanzó el SDK (Software Development Kit) oficial para Kinect, gracias al cual se pueden desarrollar aplicaciones basadas en Kinect en C++, C# o Visual Basic, utilizando Microsoft Visual Studio 2010.

Nosotros hemos trabajado con la versión 1.0 del SDK para Kinect. Algunas de las posibilidades que nos ofrece son:
  • Acceder a los datos de todos los sensores de Kinect: el de profundidad, la cámara de color y el micrófono.
  • Skeletal tracking: la habilidad de detectar la posición de cada una de las partes del cuerpo de una persona situada en el campo de visión del Kinect.
  • Técnicas de procesado de audio, como la cancelación de ecos, supresión de ruido o identificación de la fuente de sonido.
  • Documentación y código de prueba.

De todas las funcionalidades de Kinect, la que nos interesa especialmente a nosotros para el reconocimiento de gestos es el “skeletal tracking”. Kinect es capaz de detectar la posición de hasta 20 partes de nuestro cuerpo mediante el siguiente algoritmo:
  1. Con el sensor de profundidad, mide la distancia a la que se encuentra la persona que se coloca delante y dibuja de forma rudimentaria un esqueleto de las zonas donde ha detectado presencia.
  2. El cerebro de Kinect empieza a averiguar cuál es cada parte del cuerpo, basándose en su experiencia reconociendo otros cuerpos y en modelos que lleva implementados. Asigna una serie de probabilidades a los distintos píxels. Por ejemplo, si está seguro de que una zona es el hombro izquierdo, asignará a esos píxels una probabilidad elevada.
  3. Con este conjunto de probabilidades, dibuja un esqueleto con las partes del cuerpo que ha reconocido, escogiendo la combinación que tiene una mayor probabilidad.

El SDK nos proporciona métodos para acceder a la posición de cada parte del cuerpo, obtenida a través de este algoritmo de “skeletal tracking”.

No hay comentarios:

Publicar un comentario