MSDN España

Noticias, avisos, reflexiones... del equipo que hay detrás de MSDN en España... también tendremos alguna que otra firma invitada :)

Reto SDK de Kinect: Desarrolla con Kinect

Reto SDK de Kinect: Desarrolla con Kinect

Rate This
  • Comments 16

Imprescindible

Descargar el SDK de Kinect para Windows y tener alguna versión de Visual Studio 2010. Te puedes bajar la versión gratuita de Visual Studio 2010 Express o de la Ultimate Trial.

Para programar con el SDK utilizaremos la herramienta de desarrollo Visual Studio 2010 y Windows 7. Para ver más información sobre requerimientos previos y qué se puede hacer con la SDK de Kinect visita el post referente al SDK de Kinect en nuestro blog de MSDN.

Estamos atentos a tus comentarios en el twitter de @esmsdn y en el hashtag #retosmsdn.

Antes de empezar…

Antes de desarrollar aplicaciones con Kinect vamos a explicar un poco qué es Kinect. Kinect es un dispositivo creado para jugar a los videojuegos de Xbox360 sin necesidad de ningún mando o controlador. Nos da la posibilidad de poder interactuar con nuestro propio cuerpo en el videojuego.

El sensor Kinect posee 2 cámaras de profundidad por infrarrojos y una cámara RGB. Con los datos de profundidad se realiza un seguimiento esquemático de nuestro cuerpo (Skeletal Tracking) para poder llevarlo al juego. También tiene una serie de micrófonos para diferenciar el sonido del juego y ambiental del de nuestra voz y una base motorizada para cambiar el ángulo de visión.

Junto con el sensor de Kinect debemos tener un cable USB con fuente de alimentación para conectarlo a la corriente y al ordenador.

imageimage

Primeros pasos

Una vez tenemos el sensor Kinect y un ordenador con Windows 7 y Visual Studio 2010 podemos proceder a descargarnos el SDK de Kinect para Windows eligiendo la versión de 32-bit o 64-bit.

Cuando esté descargado hay que tener en cuenta antes de instalar que no debemos tener instalado ningún otro driver de Kinect, el sensor no debe estar conectado ni Visual Studio abierto. Si esto se cumple podemos proceder a la instalación del SDK ejecutando el archivo descargado.

image

Después de pasar la pantalla de inicio de la instalación, donde nos informan que se va a instalar el “SDK de Kinect para Windows Beta”, nos aparece un mensaje avisándonos que ciertos ejemplos que vienen con el SDK necesitan el último directX SDK. Seguiremos los pasos del asistente para instalar correctamente el SDK.

Ya tenemos el SDK, ahora vamos a enseñar el proceso para conectar el sensor Kinect al ordenador.

Cogemos la fuente de alimentación y la conectamos a la corriente.

El siguiente paso es conectar el otro extremo del cable (con el LED en verde) de la fuente de alimentación al sensor por medio del cable USB

Por último conectamos el cable USB que sale de la fuente de alimentación a un puerto USB libre del ordenador.

Si está conectado correctamente tiene que parpadear el LED verde del sensor.image

image

Cuando lo conectemos nos aparece en pantalla un mensaje informándonos de que se está instalando un driver de un dispositivo nuevo.

image

Si hacemos clic podemos ver más información sobre el proceso. Se muestra el estado de la instalación de los driver para utilizar el dispositivo, el control de audio, la cámara y el control del array de los micrófonos.Cuando se acaba de instalar los diferentes drivers ya estamos listos para usar el sensor.

imageimage

Si vamos a “Panel de control-> Sonido y hardware-> Administrador de dispositivos” nos aparece el sensor instalado:

image

Para asegurarnos que funciona nos dirigimos a “C:\Program Files\Microsoft Research KinectSDK” o la ruta que hayamos elegido para la instalación del SDK y ejecutamos el programa Skeletal Viewer o Shape Game que son 2 programas de ejemplo que se instalan con el SDK.

image  image

                              Shape Game                              Skeletal Viewer

Shape Game es un juego en el que el propósito es golpear las figuras que caen. También tiene reconocimiento de voz (en inglés) pudiendo dar órdenes sobre el tipo de figuras que caen, tamaño, color, velocidad…

Con el Skeletal Viewer podemos ver el funcionamiento de los 2 tipos de cámaras que tiene el sensor, profundidad a la izquierda y RGB a la derecha, y del Skeletal Tracking en el centro.

Preparar el proyecto

Ya toca ponerse manos a la obra. Vamos a crear un proyecto para iniciarnos en la programación con el SDK de Kinect para Windows y que servirá como proyecto base para tus aplicaciones.

Abriremos Visual Studio 2010 y nos crearemos un proyecto WPF (Windows Presentation Foundation).Le damos un nombre y aceptamos.

image

Cuando finalice el proceso de creación y preparación de la solución se abrirá el panel de diseño con la ventana principal (MainWindows.xaml) de la aplicación y el explorador de proyectos a la derecha. Desplegaremos el nodo de MainWindow.xaml para acceder al fichero MainWindow.xaml.cs (el code-behind de la ventana) para empezar a programa en él.

image

Para poder programar con el SDK de Kinect deberemos agregar una referencia a nuestro proyecto. Presionamos con el botón derecho del ratón encima de “References” elegimos “añadir referencia”. Nos aparecerá un cuadro de diálogo en el que seleccionaremos la referencia al SDK “Microsoft.Research.Kinect” y aceptamos. Después de aceptar veremos como se ha agregado una nueva referencia a nuestro proyecto que corresponde al SDK.

image    image    image

Con la referencia agregada añadiremos el espacio de nombres a junto con los demás usings de nuestro fichero para poder utilizar las clases y métodos del SDK.

using Microsoft.Research.Kinect.Nui;

Dentro del constructor (método MainWindow()) de nuestra ventana añadiremos el evento Loaded, donde pondremos el código para inicializar el sensor, y el evento Closed para finalizar el uso. Esto nos creará, presionando la tecla “Tab”, los 2 métodos (MainWindow_Loaded y MainWindow_Closed) que capturarán los eventos creados y se ejecutará el código que pongamos en ellos cuando estos eventos se produzcan.

public MainWindow()

{

InitializeComponent();

Loaded += new RoutedEventHandler(MainWindow_Loaded);

Closed += new EventHandler(MainWindow_Closed);

}

Crearemos un atributo de la clase Runtime, clase que hace referencia al sensor Kinect y que instanciaremos e inicializaremos más adelante.

Runtime kinect;

Dentro del método MainWindow_Loaded creamos la instancia para controlar el sensor e inicializaremos el sensor con las opciones que queremos usar. Tenemos 4 opciones para especificar el uso de la cámara RGB, de la de profundidad y del Skeletal Tracking.

La cámara de profundidad se puede usar con la opción de sólo profundidad o profundidad con índice de jugador. Si ponemos la segunda opción los datos de la cámara de profundidad contendrán también un índice para saber si los datos corresponden a un jugador u otro o a ninguno. Como ejemplo vamos a inicializar con 3 opciones. Color, profundidad con índice de jugador y Skeletal Tracking.

void MainWindow_Loaded(object sender, RoutedEventArgs e)

{

kinect = new Runtime();

kinect.Initialize(RuntimeOptions.UseColor | RuntimeOptions.UseDepthAndPlayerIndex | RuntimeOptions.UseSkeletalTracking);

}

Por último en el método MainWindow_Closed finalizaremos el uso del sensor. Cuando se cierre la aplicación ya no lo estaremos usando.

void MainWindow_Closed(object sender, EventArgs e)

{

kinect.Uninitialize();

}

Con esto ya tenemos la estructura de nuestro proyecto preparada para empezar a utilizar las funcionalidades que nos ofrece el SDK en nuestra aplicación.

Tu turno… ¡el Reto! – Kinect arriba y Kinect abajo

Con el SDK aparte de poder utilizar las cámaras y el Skeletal Tracking podemos cambiar el ángulo de visión de las cámaras gracias al motor que tiene el sensor. Como reto te propongo crear una interfaz para poder manejar este motor y puedas subir y bajar el sensor.

Pista: NuiCamera

Recursos: Post sobre Kinect en el blog de MSDN, documentación sobre el SDK de Kinect y centro de desarrollo de WPF

Solución: http://msdn.microsoft.com/es-es/windows/hh433427

Participa: twitter de @esmsdn o hashtag #retosmsdn.

¡A Kinectear!

José Perona – @JVPerona - Developer Evangelist Jr.

 

Ver el segundo Reto SDK de KinectUsar las cámaras del sensor

Ver el tercer Reto SDK de Kinect: Detectar posturas con Skeletal tracking

Ver el cuarto Reto SDK de Kinect: Reconocer gestos con Skeletan tracking

Leave a Comment
  • Please add 4 and 4 and type the answer here:
  • Post
  • Llego un poco tarde pero bueno, todo sea por la conquista del mundo.

    Hola a todos!

    Ya tengo una pequeña solución que hace lo que se pide. Esta basada en un par de controles button para subir o bajar Kinect con ayuda del motor.

    Aún así me surgen varios problemas, en concreto en el momento en que voy actualizando el valor del angulo del motor.

    Me da la sensación de que no va aumentando o subiendo correctamente, en cuanto a los valores que le intento dar al hacer click en dicho botones.

    Tampoco tengo claro cuales son los valores exacto máximos y mínimos que puede llegar a tomar el angulo del motor.

    Sin más, un saludo!!

  • Hola Luis,

    No llegas tarde! Lo importante es participar, aprender y disfrutar con los retos :D

    Puede ser que no funcione bien el cambio de inclinación con botones debido a que parece ser que la velocidad del motor influye en el tiempo de respuesta del sensor. Esto implica que múltiples cambios en cortos espacios de tiempo no produzca efecto alguno o salte un error.

    Los valores máximo y mínimo son: 27 y -27.

    Muchas gracias por participar, atento a la solución que propondremos pronto y al nuevo reto.

  • Hola José,

    Gracias por tu respuesta. Precisamente lo que dices lo que me ocurre: al intentar cambiar el ángulo mediante los botones de forma "rápida", quizás al motor no le de tiempo a coger tantos cambios y por eso se produzcan esos fallos de memoria que me daba.

    ¿Existe alguna manera de controlar el movimiento del motor, es decir, de saber que se esta moviendo, y hasta que no pare, no realizar ningún cambio?

    Un saludo.

  • Hola Luis,

    El problema está más en los cambios continuos que en cambiar la inclinación cuando aún está en movimiento. El motor no está diseñado para tanto cambio.

    Respondiendo a tu pregunta con el SDK, al menos con en esta versión, no tienes forma de saber si está en movimiento o no. Ten en cuenta que todavía estamos en versión Beta. Habrá que esperar a las mejoras de futuras versiones.

    Volviendo al tema del valor máximo y mínimo de inclinación puedes usar Camera.ElevationMaximum y Camera.ElevationMinimum en lugar de valores numéricos.

    Un saludo! :D

  • Hola:

    Soy nuevo en el tema y este post esta ayudandome mucho en aprender mas.

    Tengo una inquietud. En el momento que tu dices:

    "Crearemos un atributo de la clase Runtime, clase que hace referencia al sensor Kinect y que instanciaremos e inicializaremos más adelante.

    Runtime kinect;"

    Esa clase Runtime, ahi que crerla, si es asi como lo hago?

    Si no, esa linea de codigo donde iria?

    Espero su respuesta. Es valioso para mi su colaboracion!

  • Hola Jhon!

    Las declaraciones de atributos yo las suelo poner al principio, antes del método MainWindow:

    public partial class MainWindow : Window

       {

           Runtime kinect;

           public MainWindow()

           {

    La creación de la instancia en sí misma se realiza dentro del método MainWindow_Loaded, como se explica en el reto un poco más abajo de las líneas que has citado, de la siguiente manera:

    kinect = new Runtime();

    Un saludo y espero haberte ayudado!

  • Hola a todos

    Me han ofrecido hacer el proyecto de fin de carrera basado en una aplicación de Kinect y antes de aceptarlo quisiera preguntar una serie de cuestiones..

    ¿Que diferencias habría entre desarrollar aplicaciones para una cámara kinect de XBOX y hacerlo con el paquete que venden de Kinect for windows?

    Los requisitos mínimos que piden para el ordenador son altos, ¿creeis que valdría con un procesador duo a 2.4 GHz (Core2Duo E6600)?

    Y por ultimo la pregunta que más me preocupa, la aplicación que me han encargado se basa en un control de helicóptero, no a modo de mando a distancia y que siga mis instrucciones, sino que una computadora sea capaz de reconocerlo y corregir el error de posición para hacerlo aterrizar en una posición predeterminada. Mi pregunta seria si veis factible hacer que Kinect reconozca un helicóptero, por lo que tengo entendido ya traen funciones para hacer que reconozca un cuerpo humano y sus movimientos, pero no he leido nada acerca de reconocer otras formas. Estoy ahora mismo aprendiendo por mi cuenta programación orientada a objetos en c++ y no se si este es un jardin que de momento me queda demasiado grande...

    Un saludo y muchas gracias

  • Hola Jose, me gustaría saber dónde puedo adquirir el cable usb necesario para conectar kinect a mi ordenador.

    Muchas gracias de antemano y nos vemos el lunes por la UA.

    Mi correo es adrianmartinezpina@gmail.com

  • hola que tal una pregunta, podrias proporcionarme un lugar o tienda online donde pueda adquirir el cable para conectarlo el kinect a la pc

  • buenas saludos a todos, soy nuevo en el tema me dedico a la electronica pero me llama mucho la atencion este extraordinario sensor, e descargado los ejemplos del kinect studio 1.5 y e modificado el codigo pero no se como probarlo de nuevo con el sensor disculpen mi ignorancia agradesco cualquier ayuda mi correo jrbbravo.75@gmail.com

  • no encuentro esta referencia Microsoft.Research.Kinect

    puede que tenga que instalar algo?

  • marta ten en cuenta que lo aqui publicado era version beta, ya avanzo y la forma de agregar la referencia es con Microsoft.Kinect, o bueno por lo menos son el SKD 1.6 el cual estoy usando.

    y para crearnos una variable seria KinectSensor miKinect;

  • hola esto funciona tambien con visual 2012

    saludos

    porque solamente encuentro blogs con este visual y no con el 2012

  • Hola,

    Queria consultar acerca de las diferencias en cuanto a programacion entre el sensor Kinect para xbox 360 y el kinect para Windows (que creo aparecen en las fotos) y sobre por que usas WPF

  • que hago si no me sale la clase Runtime?? pues sale la clase Run, RuntimeArgumentHandle, RuntimeFieldHandle... tampoco me aparece Uninitialize ?, sera q falta algo en los using ???

Page 1 of 2 (16 items) 12