domingo, 1 de junio de 2014

Para las las propuestas solución sin éxito se ha encontrado una solución estable:
Control Fuzzy para piano kinect (2da parte)
Como se ocupo la lógica difusa para solucionar el problema de sensibilidad ¿?

Como hemos mencionado anteriormente, se ha escogido ocupar lógica difusa por lo puntos mencionados en el post anterior.
La lógica difusa trabaja de la siguiente manera
Para esto entonces lo primero que necesitamos es variables de entrada. En una primera instancia se ocuparon solo 2 variables de entrada, sabiendo que se tienen que ocupar 3 por lo que son 3 ejes dimensionales (x,y,z), pero para probar la lógica difusa se ocuparon 2:
·         Eje x (horizontal)
·         Eje z (profundidad)
Para estas variables de entrada, se crearon 3 conjuntos difusos con sus funciones de pertenencia correspondiente:
·         Fuera  1
·         Dentro
·         Fuera 2
Conjuntos difusos.jpeg
El siguiente paso es, el de inferencia, para esto necesitamos reglas, que hay que crear dependiendo de las variables de entrada y de los conjuntos difusos creados:
  1. IF (X IS Fuera1) AND (Z IS Fuera1) THEN Exito IS NoToca
  2. IF (X IS Fuera1) AND (Z IS Dentro) THEN Exito IS NoToca
  3. IF (X IS Fuera1) AND (Z IS Fuera2) THEN Exito IS NoToca
  4. IF (X IS Dentro) AND (Z IS Fuera1) THEN Exito IS NoToca
  5. IF (X IS Dentro) AND (Z IS Dentro) THEN Exito IS Toca
  6. IF (X IS Dentro) AND (Z IS Fuera2) THEN Exito IS NoToca
  7. IF (X IS Fuera2) AND (Z IS Fuera1) THEN Exito IS NoToca
  8. IF (X IS Fuera2) AND (Z IS Dentro) THEN Exito IS NoToca 
  9. IF (X IS Fuera2) AND (Z IS Fuera2) THEN Exito IS NoToca
Cabe destacar que estas reglas hacen un puente entre las variables de entrada y las variables de salida.
Como se puede observar la mayoría de las reglas hace que la tecla no suene,  y por el contrario existe una única regla que hace que la tecla suene y es cuando la variable x perteneciente al eje x y la variable z perteneciente al eje z están dentro del área de la tecla.

La última parte del proceso de lógica difusa es la defuzificacion, donde se generan variables de salida. Este proceso lo hacemos por medio del método mandami, el cual nos entrega un % de pertenencia. Este grado de partencia, nos define si el pie esta dentro de la tecla o fuera.  
Se crearon conjuntos difusos para las salidas:
Diagrama3.jpeg

Después de haber aplicado la lógica difusa para el proyecto, este es el resultado:





Para las las propuestas solución sin éxito se ha encontrado una solución estable:
Control Fuzzy para piano kinect (1ra parte)

A pesar de haber probado 2 posibles soluciones para el problema de la sensibilidad de la kinect, las cuales fueron :
  •          sacando un promedio de los ejes, para no tener el problema de sensibilidad de la kinect.
  •          sacando la diferencia de los ejes, respecto a las áreas en donde se ubicaran las teclas, para verificar si el pies se cambio de una tecla a otra.

se tuvo la necesidad de encontrar una nueva forma de llevar a cabo el proyecto, donde lo mas importante es la reproducción de una nota en un área determinada en el suelo, creada virtualmente por la kinect.
Para esto se pensó en ocupar lógica difusa debido a que:

  •       El pie que está tocando una tecla esta dentro de la tecla o está fuera de la tecla.
  •          Mientras el punto central del pie, determinado por un punto creado por el esqueleto de la kinect, esté más cerca de la frontera de la tecla, menos será su grado de pertenencia a estar pisando esa tecla .
  •          Mientras el punto central del pie, determinado por un punto creado por esqueleto de la kinect, este más cercano al centro de la tecla, mayor será el grado de pertenencia a estar pisando la tecla para así reproducir su sonido sin falla alguna.

domingo, 4 de mayo de 2014


Avances proyecto.

Lo avances que hemos logrado como grupo han sido, poder reproducir una nota del piano en un lugar determinado. A continuación se presenta en el siguiente vídeo lo logrado:



A pesar de haber logrado llegar hasta este punto, tenemos 2 dificultades muy grande, que son las que hemos tratado de solucionar en la sesión pasada.

1- Debido a la inexactitud de la kinect, si nosotros determinamos una área para una tecla, estando en el borde el pie, programa reconoce como, dentro y fuera, aunque el pies no se mueva. Este problema que hemos encontrado deriva en que al poner el pie en el borde del área, suena muchas veces las tecla, siendo que no debería pasar esto, ya que el pies no se mueve, pero por el problema de la kinect, pasa esto.

El segundo problema, el cual esta muy asociado al primero, es que la kinect funciona con 3 dimensiones, X,Y,Z (horizontal, vertical, y profundidad), por ende hay que trabajar con estas 3 dimensiones en la programación. El problema que se nos presenta es poder reproducir una nota del piano, en cualquier de estas 3 dimensiones, es decir, entrando detrás del piano a tocar la tecla (profundidad), estando en la misma tecla y levantar el pie (vertical), y por ultimo estando en el piano y moverse a otra tecla (horizontal).

Se nos propuso solucionar este problema de 2 maneras:
* sacando un promedio de los ejes, para no tener el problema de exactitud de la kinect.
* sacando la diferencia de los ejes, respecto a las áreas en donde se ubicaran las teclas, para verifcar si el pies se cambio de una tecla a otra.

domingo, 27 de abril de 2014

Reproducción de Sonido 

La reproducción de sonido en este proyecto es fundamental, ya que el proyecto que queremos realizar es una emulación de un piano.


  • Lo primero que se hizo fue investigar, las formas de reproducción de formatos de sonido wav o mp3 en código c#.
  • Mientras avanzábamos en la investigación, nos dimos cuenta con los códigos ejemplos que encontrábamos solo se podía reproducir un archivo de sonido a la vez. Esto fue un problema ya que no nos servia reproducir un solo sonido a la vez, si no que varios, para emular las teclas de un piano, que como todos sabemos se pueden tocar varias teclas a la vez.
  • Investigamos varias formas de reproducir un sonido en código c# y después de varias pruebas llegamos a la conclusión y elección de ocupar la siguiente forma que fue muy sencilla y corta :
WindowsMediaPlayer wplayer = new WindowsMediaPlayer();
wplayer.URL = "My MP3 file.mp3";
wplayer.controls.play();



  •  Utilizando la libreria WMPLib y añadiendo la referencia wmp.dll que se encuentra en la carpeta System32.
  • Como vemos, el código es muy simple, pero este sirve para reproducir un archivo de audio a la vez. El truco esta en ocupar una instancia distinta del reproductor WindowsMediaPlayer  para cada archivo de audio.
  • Ejemplo: 
                             WindowsMediaPlayer wplayer1 = new WindowsMediaPlayer();
                             WindowsMediaPlayer wplayer2 = new WindowsMediaPlayer();
  • y así para cada instancia, asignar una ruta del archivo a reproducir y después de eso, darle play, por algún botón o algún evento que se programe. 




domingo, 20 de abril de 2014

Primeros pasos del Proyecto


Para poder empezar a realizar el proyecto el cual se centra en la programación de instrucciones de la kinect, necesitamos instalar una serie de programas y que los computadores que se usen cumplan con ciertas características que se mencionaran a continuación...

Por la parte Hardware:

PC:

  • Procesador dual core 2.66-GHz o mejor.
  • 2 GB de RAM
  • Tarjeta de video que soporte Direct X 9.0 o superior
y obviamente la Kinect:
  • Cable de corriente con puerto USB para Kinect
Por la parte Software:

  • Windows  7
  • Visual Studio 2010 o cualquier edición de Visual Studio con soporte para WPF
  • Microsoft .NET Framework 4 (Incluido con el visual Studio 2010)
  • SDK para Kinect
  • Speech Platform SDK
  • Kinect for Windows Language Packs v1.5.0
Con esta serie de programas instalados en win7 uno ya puede empezar a programar la kinect.

Una vez ya instalados estos programas, uno debe crear un proyecto WPF (Windows Presentation Foundation) en Visual Studio y a programar!!!.



Elección de Proyecto Final


Después de una lluvia de ideas para el proyecto final del electivo que se realizo en clases, se voto por las ideas de mayor  interés, de las cuales se eligieron 2 y por ende se formaron 2 grupos de trabajo. Mi grupo de trabajo esta compuesto de 5 personas y desarrollaremos un piano kinect.

El proyecto a realizar se trata de desarrollar una aplicación utilizando la kinect, el cual realizara el papel de piano  virtual. Se analizo la posibilidad de desarrollar un piano que se pueda tocar con las manos y con los pies, y cual era mas factible de realizar en el tiempo que dura la asignatura.

A continuación 3 vídeos que muestran proyectos realizados en este ámbito de piano kinect.






Los pasos a seguir son recaudar la mayor información para poder determinar si se hará un piano que se pueda tocar con la manos o un piano que se pueda tocar con los pies.
Se repartirán las tareas y así optimizar recursos y abarcar mas información.