sábado, 24 de mayo de 2014

Sesion 2: Solución del problema de sesnibilidad de la Kinect

Hola amigos lectores, hoy les hablaré de una problemática que surgió en la implementación del piano virtual utilizando la kinect, y de la solución que propusimos con mi grupo desarrollador. Aquí va el detalle.

Problemática

Al utilizar los puntos del esqueleto con el dispositivo kinect, éstos sufrían de un exceso de sensibilidad (incluso si uno se encontraba en reposo), por lo tanto, al posicionarnos en la frontera de una tecla del piano, éste sonaba en forma constante debido a que la sensibilidad de la kinect hacía que el pie estuviese fuera y dentro de la tecla en el transcurso de los frame.





Solución propuesta: Lógica Difusa

Las razones por lo cual se eligió utilizar lógica difusa fueron las siguientes:
  1. El pie está dentro o fuera de la tecla en cierto grado.
  2. Mientras más cercano esté el pie a la frontera de la tecla, menos grado de pertenencia tiene el pie de estar dentro de la tecla.
  3. Si el pie está más cercano al centro de la tecla, mayor grado de pertenencia tiene de estar dentro de la tecla.

Variables de entrada

Para poder implementar la lógica difusa deberemos definir las variables lingüísticas que tendrá el sistema, en este caso serán 2:
  1. Eje X.
  2. Eje Y.
El eje Y se omitió, pero en las próximas sesiones se incluirá dentro del sistema difuso. Para las variables lingüísticas X y Z se crearon 3 conjuntos difusos con sus respectivas funciones de pertenencia:
  1. Fuera 1.
  2. Dentro.
  3. Fuera 2.
Conjuntos difusos.jpeg

Considerar que existen 2 conjuntos "fuera"para tomar en cuenta los 2 margenes que tiene cada eje.


Variables de salida

La variable de salida nos permitirá determinar si se debe o no tocar el sonido de una tecla en función de las variables que hayan entrado al sistema, por lo mismo, los conjuntos difusos definidos para la salida son los siguientes:
  1. No Toca
  2. Toca

Diagrama3.jpeg

Reglas difusas

Las reglas difusas necesarias para hacer la transición entre las entradas del sistema y la salida son las siguientes:

IF (X IS Fuera1) AND (Z IS Fuera1) THEN Exito IS NoToca
IF (X IS Fuera1) AND (Z IS Dentro) THEN Exito IS NoToca
IF (X IS Fuera1) AND (Z IS Fuera2) THEN Exito IS NoToca
IF (X IS Dentro) AND (Z IS Fuera1) THEN Exito IS NoToca
IF (X IS Dentro) AND (Z IS Dentro) THEN Exito IS Toca
IF (X IS Dentro) AND (Z IS Fuera2) THEN Exito IS NoToca
IF (X IS Fuera2) AND (Z IS Fuera1) THEN Exito IS NoToca
IF (X IS Fuera2) AND (Z IS Dentro) THEN Exito IS NoToca
IF (X IS Fuera2) AND (Z IS Fuera2) THEN Exito IS NoToca

Como podemos observar, la única regla que hace tocar una tecla es cuando la variable X se encuentra dentro del conjuto difuso "Dentro" y la variable Z se encuentra dentro del conjunto difuso "Dentro".

Defuzificación

Luego debemos defuzificar la salida a través del método de Mandami, lo cual nos permitirá obtener una salida real. Si la salida real es mayor a 72,14, entonces la tecla sonará.

Conclusiones

Como vimos en esta entrada, mi grupo desarrollador tenía un problema con la sensibilidad de la Kinect, la cual hacía que una tecla sonara infinidad de veces cuando uno posaba un pies en la frontera de la tecla. Luego propusimos utilizar la lógica difusa para poder solucionar este problema y eso fue lo que sucedió. En este vídeo se puede ver la solución funcionando.




Bueno amigos, eso ha sido todo por esta entrada, en la próxima les enseñaré a como añadir más teclas al piano. Nos estamos leyendo.

Sesión 1 implementación piano Kinect

Hola amigos lectores, hoy les hablaré un poco del proyecto que estoy implementando con algunos compañeros en un electivo de mi universidad. El proyecto tiene como meta la implementación de un piano virtual utilizando el dispositivo Kinect, así que les detallaré lo que hicimos en la primera sesión. 

Creación de proyecto en Visual Studio

Lo primero que debemos hacer para programar utilizando la kinect es crear un proyecto tipo WPF en el Visual Studio (en mi caso utilizo la versión del 2010). Luego debes incluir las librerías correspondientes de la Kinect y ya podremos programar sin problemas

Definiendo teclas en el piso

Para poder realizar nuestro piano, deberemos definir un espacio en el espacio tridimensional que representará la posición en la que se encontrará la tecla virtual, para ello deberemos realizar los siguientes pasos:
  1. Definir la altura  en la que se encontrará la Kinect respecto del suelo.
  2. Definir la distancia en la que comenzará y terminará una tecla con respecto a la Kinect (eje Z).
  3. Definir el ancho de una tecla (eje X).
  4. Definir altura de una tecla (eje Y)
Con estos pasos podremos implementar ya una pequeña versión de nuestro piano.


Definición la altura  de la Kinect

La kinect tendrá como soporte una mesa, la cual posee una altura de 75 cms, por lo tanto, esa será la altura en la cual se encontrará la kinect.


Definición eje Z

Con esta coordenada podremos determinar a qué distancia de la Kinect comienza y finaliza una tecla. Con mi grupo desarrollador definimos que la distancia sería entre 2,25 mts y 2,58 mts, con la cual tendremos mejor precisión de los datos que lleguen al sensor, además de permitirnos en el futuro la inclusión de más teclas.




Definición eje X

Con esta coordenada podremos definir el ancho que poseerá cada tecla virtual. Para esta primera sesión se ha determinado que el ancho debe ser de 20 cms, la cual debe estar comprendida entre 0.04 y 0.24 (tomando como referencia la representación del eje X que hace la Kinect)


Definición eje Y

Con esta coordenada podremos definir la altura que poseerá cada tecla. Para esta primera sesión se ha determinado que la altura de la tecla debe ser de -0,78 (tomando como referencia la representación del eje Y que hace la Kinect).


Código para hacer sonar un archivo de sonido al pisar una tecla virtual

Lo primero que debemos hacer es crear una instancia de la clase WindowsMediaPlayer, la cual nos permitirá cargar un archivo de música (.mp3) de nuestro ordenador, en nuestro caso hemos cargado un archivo de música que contiene el sonido de un piano en la nota musical DO. El siguiente código realiza lo anteriormente descrito:

WindowsMediaPlayer wplayer = new WindowsMediaPlayer();
wplayer.URL= "C:/ACÁ DEBES LA RUTA DEL ARCHIVO/NOMBRE_ARCHIVO.mp3";

Luego debemos capturar un esqueleto trackeado (explicado en la entrada anterior) y capturar los puntos de coordenadas X,Y,Z del pie derecho (en futuras sesiones lo extenderemos a los 2 pies). Posteriormente, comprobaremos si estos valores se encuentran dentro de el espacio definido para cada tecla, en caso de que así sea, haremos sonar la tecla con el método play() de la clase WindowsMediaPlayer. En caso de que las coordenadas del pie no se encuentren en el espacio definido para la tecla, entonces no realizaremos ninguna acción. El siguiente código realiza lo anteriormente descrito:

float x = 0.0F, y = 0.0F, z = 0.0F;
x = S.Joints[JointType.FootRight].Position.X;
y = S.Joints[JointType.FootRight].Position.Y;
z = S.Joints[JointType.FootRight].Position.Z;

if (z >= 2.25 && z <= 2.58)
     if(x >= 0.04 && x <= 0.24){
         if(y <= -0.78){
              wplayer.controls.play();
         }
     }
}

Bueno amigos, eso ha sido todo por hoy, en los próximos días subiré el avance del proyecto, así que deben estar atentos. PD: Les dejo un vídeo de presentación en el cual se muestra el funcionamiento del código que acabamos de explicar.



miércoles, 14 de mayo de 2014

Capturar el esqueleto en la Kinect

Hola amigos lectores, hoy les enseñaré cual es el procedimiento que se debe realizar para poder capturar las articulaciones del esqueleto de una o más personas que se encuentren en el campo de visión de la kinect, para ello primero será necesario instalar el SDK de Kinect para Windows, si deseas saber cómo instalarlo puedes revisar mi entrada anterior.




Skeleton Traking

El SDK de Kinect para windows posee una funcionalidad llamada Skeleton Traking, la cual permite hacer un seguimiento de uno o más esqueletos que se encuentre dentro del área de visión del sensor, esto permite a los desarrolladores capturar los datos de la posición espacial de las articulaciones de los esqueletos en cada frame que sea procesado por la aplicación (recordar que la kinect envía 30 frames por segundo a la aplicación). Para identificar a cada articulación es necesario relacionarla con un nombre. En la siguiente imagen se ilustra el nombre que posee cada articulación del cuerpo humano.




Por ejemplo, si quisiéramos capturar los datos correspondientes del pie derecho, sólo tendríamos que referenciarlo con la palabra "FOOT_RIGHT". Para poder realizar esto en código, deberemos añadir la opción UseSkeletalTracking cuando inicializamos el sensor en el evento loaded y creamos el evento SkeletonFrameReady que nos permitirá capturar los datos del esqueleto una vez que se obtengan.

kinect = new Runtime(); 
kinect.Initialize(RuntimeOptions.UseDepthAndPlayerIndex | RuntimeOptions.UseSkeletalTracking); 
kinect.SkeletonFrameReady += new EventHandler<SkeletonFrameReadyEventArgs>(kinect_SkeletonFrameReady);

En el método Kinect_SkeletonFrameReady que se habrá creado será donde implementemos el código para obtener las articulaciones del cuerpo. Para este objetivo deberemos obtener los datos del Skeleton a partir del SkeletonFrame que se captura. El SkeletonFrame que se captura permite obtener un arreglo de esqueletos, esto quiere decir que esta estructura de datos contiene las articulaciones de todas las personas que estén en el campo de visión del sensor (aunque la máxima cantidad de esqueletos que se pueden consultar a las vez son 2). Si queremos recorrer los esqueletos será necesario utilizar foreach para poder recorrer las articulaciones de los esqueletos que haya reconocido la kinect. También deberemos saber si el esqueleto consultado es correcto o no, esto se hace con la propiedad TrakingState (NotTracket, PositionOnly, o Tracket).


void kinect_SkeletonFrameReady(object sender, SkeletonFrameReadyEventArgs e) 

     foreach (SkeletonData skeleton in e.SkeletonFrame.Skeletons) 
        if (skeleton.TrackingState == SkeletonTrackingState.Tracked) 
        {


Ahora lo único que tenemos que hacer es llamar al método JointID que utilizamos para obtener el vector de las articulaciones de un esqueleto. Para identificar una articulación particular será necesario poner como índice del vector una constante numérica, la cual posee como nombre identificadores como los que se mostraron en la imagen anterior.

float HandRightX = skeleton.Joints[JointID.HandRight].Position.X; 
float HandRightY = skeleton.Joints[JointID.HandRight].Position.Y; 
float HandRightZ = skeleton.Joints[JointID.HandRight].Position.Z;

Bueno eso ha sido todo por esta entrada, espero que les haya sido de utilidad, ya que para mi y mi grupo de desarrollo en la universidad nos ha servido para comenzar con los primeros prototipos de un piano virtual utilizando la kinect, la cual detallaré en profundidad en la próxima entrada. Nos estamos leyendo...

lunes, 12 de mayo de 2014

Comenzando a porgramar con la Kinect

Hola amigos lectores, hoy les traigo una entrada en la cual enseñaré a instalar la librería SDK, la cual nos permitirá desarrollar aplicaciones utilizando la kinect de Xbox 360 con el lenguaje C# o Visual Basic.Net.




Hardware

Para poder comenzar a desarrollar aplicaciones usando la Kinect necesitaremos los siguientes requerimientos de hardware:


PC
  • Procesador dual core 2.66-GHz o mejor.
  • 2 GB de RAM
  • Tarjeta de vídeo con soporte para DirectX 9.0 o superior.

Dispositivo Kinect para Xbox 360
  • Cable de corriente con cable USB para Kinect (en caso de no ser kinect for windows)


Software
  • Windows 7 u 8 (en mi caso se ha utilizado Windows 8).
  • Microsoft Visual Studio 2010 Express o cualquier edición de Visual Studio 2010 con soporte para WPF, para conseguirlo puedes descargarlo de:

  • Kinect for Windows Deeloper TooolKit.

  • Speech Platform  SDK.

  • Kinect for Windows Lenguage Packs v1.5.0 (El idioma en el que desarrollen sus aplicaciones puede variar, es por ello que deben descargar el pack del lenguaje que satisfaga sus necesidades). En este caso yo descargue el Spanish/México - KinectSpeechLenguagePack_es-MX.


Experiencia en programación

Para poder comenzar a programar se necesitan conocimientos básicos en C# o Visual Basic.Net, o en su defecto, deberíamos al menos saber programación orientada a objetos.


Procedimiento 

Lo primero que debemos realizar es instalar el Visual Studio (en caso de que no esté instalado), luego de eso procedes a instalar el Kinect SDK .




Luego de tener instalado el Kinect SDK puedes instalar el Speech Platform SDK. Instala el lenguage pack con el que estarás desarrollado tus aplicaciones.












Consideraciones finales

Luego de haber instalados las herramientas descritas, será necesario abrir Visual Studio y crear un proyecto, ya sea en C# o Visual Basic.Net. Si quieres saber cómo hacerlo en detalle, puedes leer la fuente que pondré al pie de esta entrada, en la cual se describe paso por paso como crear una aplicación que hace uso del micrófono de la Kinect para generar distintas acciones en la aplicación.


Fuente



domingo, 11 de mayo de 2014

La Kinect, una herramienta versátil.

Hola amigos lectores, mi entrada de hoy se debe a que actualmente estoy cursando un electivo en mi universidad enfocado al desarrollo de aplicaciones multimedia. Específicamente, nuestro profesor nos pidió que definiéramos una idea proyecto para desarrollar a través del curso, y entre las muchas que surgieron, yo con un grupo de compañeros nos quedamos con la idea de desarrollar un piano virtual usando el dispositivo kinect. La idea ya ha sido desarrollada por otros programadores, como se puede ver en el siguiente vídeo:






Nuestro primer objetivo como grupo fue investigar sobre las características y funcionalidades de la kinect, lo cual es el objetivo principal de esta entrada. A continuación, los dejo con el detalle del dispositivo.




La kinect

La kinect fue lanzada el año 2010 para la consola Xbox 360, vale decir, que se trata de un dispositivo que fue creado con el propósito de cambiar la forma en como tradicionalmente los jugadores interactuaban con la consola de videojuegos,  es un cambio revolucionario, ya que se pasó de los típicos joystick a un sensor capaz de captar los movimientos, gestos y la voz de una persona, vale decir que los jugadores ya no necesitan de un control manual para jugar a sus videojuegos favoritos, sino que ahora también pueden hacerlo sin necesidad de tener un controlador en sus manos.

Luego de haber sido lanzada la kinect para Xbox 360, se lanzó una versión para desarrolladores para windows 7 y 8, aún así es posible utilizar la kinect de la Xbox 360 para poder desarrollar aplicaciones en un computador, eso sí, teniendo las librerías de programación respectivas.


Característica

La kinect cuenta con diversos dispositivos que le permiten funcionar como tal, estamos hablado de:

  1. Un proyector infrarrojo.
  2. Una cámara infrarroja 640x840.
  3. Una cámara VGA 640x480 a color.
  4. Un motor para la orientación.
  5. 4  micrófonos.





Sensor de movimiento

Para poder captar los mivimientos de una persona, es necesario captar en cada cierto intervalo de tiempo la posición de su cuerpo en el espacio tridimensional, es decir, necesitamos captar las articulaciones del cuerpo humano en los ejes de coordenadas x,y,z.

Para poder realizar esta labor necesitamos utilizar el emisor de infrarrojos que proyectará una trama invisible, la cuál se reflejará en el entorno y será capturada por la cámara infrarroja. Además es necesario utilizar algún modelo corporal para poder identificar las partes del cuerpo con sus respectivos movimientos.


Cámara VGA y micrófonos

La cámara VGA y el micrófono nos permiten enriquecer la experiencia de interacción con el dispositivo kinect, ya que podremos vernos a nosotros mismos en una pantalla o quizás realizar acciones a través de comandos de voz.


¿Qué necesitamos para programar en kinect?

En el 2011 Microsoft publicó el SDK de kinect que permite desarrollar aplicaciones en Windows para uso no comercial.

El SDK facilita el acceso a las cámaras y micrófonos utilizados en la kinect para aminorar el esfuerzo de desarrollo de aplicaciones que utilicen a éste dispositivo. Gracias al SDK podremos crear aplicaciones con una nueva forma de interacción, lo que permite enriquecer nuestras experiencias como programadores y poder crear aplicaciones en ámbitos en los cuales se necesite captar el movimiento de una persona.



Bueno amigos lectores, eso ha sido todo por hoy, en la próxima entrada les enseñaré a instalar la librería SDK para poder empezar a desarrollar aplicaciones en el lenguaje C++ o C#  :)


Fuente: