UNIVERSIDAD POLITÉCNICA DE SAN LUIS POTOSÍ

“Ciencia, Tecnología y Cultura al Servicio del Ser Humano”

Lego NXT controlado con Kinect
Proyecto Final
M.C. Víctor Manuel Fernández Mireles Organización Computacional

Integrantes: Diego Gabriel De La Fuente Moreno K’icháj Fernández Esteban Erika Nohemí Reyna Ramos Aldo Damián Noyola Martínez 30 de noviembre de 2011

Lego NXT controlado con Kinect
Proyecto Final

CONTENIDO
1. 2. 3. 4. a. b. c. d. e. f. 5. 6. 7. 8. Introducción............................................................................................................................. 3 Objetivo ..................................................................................................................................... 3 Aplicación................................................................................................................................. 4 Implementación ...................................................................................................................... 4 Pasos previos ...................................................................................................................... 4 Instalación del SDK de Kinect ........................................................................................ 5 Configuración del IDE ....................................................................................................... 5 Codificación de la Aplicación ....................................................................................... 10 Conexión y control del Lego NXT ................................................................................ 12 Interfaz Gráfica .................................................................................................................. 13 Pruebas ................................................................................................................................... 14 Conclusiones......................................................................................................................... 14 Propuesta a futuro ............................................................................................................... 14 Referencias ............................................................................................................................ 16

2

Lego NXT controlado con Kinect
Proyecto Final

1. Introducción En el presente trabajo se presenta la implementación del proyecto para controlar un robot Lego NXT con la tecnología Kinect de Microsoft. Se muestra el proceso seguido hasta la finalización del proyecto. Por un lado se muestra la programación del Kinect y por otro lado se presentan los pasos necesarios para realizar la conexión de la PC con el Lego NXT a través de una conexión Bluetooth. El Kinect es un dispositivo creado para jugar a los videojuegos de Xbox 360 sin necesidad de ningún mando o controlador. 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.

Imagen1: Se muestra el Kinect y sus cables de conexión a la computadora.

2. Objetivo Controlar el robot Lego NXT mediante un dispositivo Kinect a través de una conexión Bluetooth. Sólo se trabajará en el control de los motores, por lo que la programación de los sensores queda excluida. Quedando este proyecto como base a otros proyectos más complejos y de propósito más específico. Se plantea utilizar el Lego NXT en una carrera entre Legos, por lo tanto, los principales movimientos que el robot debe interpretar son Avanzar, Detener, Reversa, vuelta a la Derecha y vuelta a la Izquierda.

3

Lego NXT controlado con Kinect
Proyecto Final

También a través de este proyecto se pretende mostrar la versatilidad de los robots Lego NXT, ya que pueden ser usados para muchos propósitos de investigación, enseñanza y entretenimiento. Se muestra de manera implícita como los sistemas computacionales (en este caso el robot Lego y la PC) pueden intercomunicarse para llevar a cabo una tarea, esto sólo se logra gracias a los componentes de su arquitectura y su organización. 3. Aplicación Una aplicación práctica puede ser utilizar el Kinect como detector de presencia de una sala, y en base a ello, encender las luces, o realizar alguna operación en las PCs, en los equipos móviles o en la red. Con el uso del robot Lego pueden derivarse proyectos como la exploración de sitios pequeños, donde los humanos no puedan acceder fácilmente, o proyectos más complejos como la desactivación de la energía eléctrica en caso de un incendio. 4. Implementación Este proyecto se pudo realizar gracias a la facilitación por parte de la Universidad Politécnica de San Luis Potosí en equipo e instalaciones necesarias. a. Pasos previos Empezamos a explorar las alternativas disponibles para la programación del Kinect. Las dos principales alternativas fueron usar:  Uso del proyecto OpenKinect (www.openkinect.org), que habilita el uso del Kinect para los sistemas Linux, Windows y Mac en una amplia gama de lenguajes de programación (Java JNA y Java JNI, C, C++, C#, Python, ActionScript, Javascript y Lisp) usando librerías open source.  Uso del SDK y toda la suite oficial de Microsoft. (Se restringe a sistemas con Windows 7 y a los lenguajes C# y C++ principalmente).

4

Lego NXT controlado con Kinect
Proyecto Final

Después de varios intentos fallidos y sólo un intento exitoso de usar las librerías de Open Kinect en sistemas Linux, se optó por usar la suite oficial de Microsoft. Debido a tal situación tuvimos que dejar de usar nuestros equipos personales y depender totalmente de las instalaciones y del equipo de UbiLab. Cabe señalar que en sistemas Linux se intentó usar las librerías para Java JNI, Java JNA y C#. b. Instalación del SDK de Kinect i. Material  Sensor Kinect  Cable especial para el Kinect USB/Power ii. Requerimientos Para un funcionamiento óptimo del Kinect, la PC necesita contar con ciertos requerimientos mínimos como lo son:  PC 32 o 64 bits  Procesador Dual-Core 2.66 GHz ó superior  Puerto USB 2.0  2GB RAM  Sensor Kinect con cable USB/Power  Windows 7  Visual Studio 2010  .NET Framework 4 iii. Observaciones Todo el software que ocupamos en este proyecto se puede instalar en una PC con menos de estos requerimientos pero se corre el riesgo de que se trabe o trabaje lento. c. Configuración del IDE Paso 1: El primer paso es instalar Microsoft Visual C# Express 2010 que se pude descargar del siguiente link: http://www.microsoft.com/visualstudio/en-us/products/2010editions/visual-csharp-express Esta es una versión de prueba por 90 días.

5

Lego NXT controlado con Kinect
Proyecto Final

Es necesario tener conexión a internet mientras se está instalando el programa.

Imagen2: Ventana que muestra la página de descarga de Microsoft Visual C# Express 2010

Paso 2: Una vez que se instala el visual C# hay que descargar e instalar los drivers y el SDK del Kinect de Microsoft. Se puede descargar del siguiente link http://www.kinectforwindows.org/download/

Imagen3: Se muestra la página de descarga del SDK de Kinect. Se debe elegir la versión apropiada.

6

Lego NXT controlado con Kinect
Proyecto Final

Una vez que descargamos el archivo ya sea el de 32 ó 64 bits hay que conectar el Kinect a la PC y se procede a instalar. Realmente lo que se instalará son los drivers del Kinect y el SDK. Para instalarse no debería de existir ninguna complicación, con solo seguir las instrucciones.

Imagen4: Se muestra el estado de la instalación de los drivers de Kinect en Windows 7.

Una vez que se instaló el driver y el SDK nos debemos de asegurar que se ha instalado correctamente, para esto hay que dirigirnos 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.

Imagen5: Vista del Shape Game. Si la instalación se realizó con éxito, los programas de prueba deben ejecutarse sin problema.

Paso 3: El siguiente paso es abrir Visual Studio 2010 para crear el proyecto WPF (Windows Presentation Foundation). Le damos un nombre y aceptamos.

7

Lego NXT controlado con Kinect
Proyecto Final

Imagen6: Figura que muestra la creación de un proyecto en Visual Studio.

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. 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 cómo se ha agregado una nueva referencia a nuestro proyecto que corresponde al SDK.

Imagen7: Se muestran el cuadro de diálogo para añadir las referencias.

8

Lego NXT controlado con Kinect
Proyecto Final

Ahora ya se puede comenzar a programar el Kinect agregando la referencia:  using Microsoft.Research.Kinect.Nui;

La instrucción anterior funcionaba para las versiones anteriores del SDK de Kinect. En las nuevas versiones el nombre de esta librería cambia un poco, sólo que no hemos probado nuestra aplicación en la nueva versión disponible. Paso 4: Una vez que ya se tiene todo lo necesario para comenzar a programar con el Kinect hay que descargar e importar las librerías necesarias para poder establecer la conexión con el Lego NXT. La librería para establecer la conexión y programar el Lego en C# la pueden descargar del siguiente link http://nxtnet.codeplex.com/releases/view/12686.

Imagen8: Vista de la página de descarga de las librerías necesarias para trabajar con los Legos NXT desde Visual Studio.

Ahí encontraran 2 archivos para descargar, pero el que más nos interesa es “NxtNet Release 1.0.0.0 (Debug)” pues en ese archivo se encuentran las librerías y la documentación, mientras que en el otro viene el código fuente.

9

Lego NXT controlado con Kinect
Proyecto Final

Una vez que lo tenemos hay que descomprimirlo y comenzar a programar. Paso 5: Ya agregamos la librería del SDK del Kinect, ahora hay que agregar la referencia a la librería de “NXT#”, para esto 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 buscaremos la librería dentro de la carpeta “NxtNet Release 1.0.0.0 (Debug)/Library”.

Imagen9: Vista que muestra cómo agregar las referencias a la librería NxtNet.

d. Codificación de la Aplicación Paso 1: El siguiente paso es establecer la conexión entre el Lego y la PC, lo recomendable es utilizar un Bluetooth genérico 2.0 plug and play. Una vez que esta encendido el Bluetooth del Lego y conectado el Bluetooth en la computadora, hay que emparejarlos dando clic derecho en el icono del Bluetooth que aparece en la barra de tareas. Luego se presiona en “agregar un dispositivo” y elegimos el Lego Mindstorm, el cual nos pedirá una clave que por default es 1234. Ya que tenemos asociado el Lego NXT con la PC hay que verificar cual es el puerto de salida de comunicación del Lego para establecer la conexión en la programación. Los pasos que se deben de seguir son dar clic derecho en el icono del Bluetooth, abrir configuración,

10

Lego NXT controlado con Kinect
Proyecto Final

seleccionar la pestaña “puertos COM” y ahí observaremos el puerto de salida y el puerto entrante, el que nos interesa es el de salida.

Imagen10: Pantallas que muestran cómo verificar qué puerto de salida es usado para asociar el Lego a la computadora, y muestra el código que se debe usar para la conexión.

Como se puede observar, ese fragmento de código es el encargado de establecer la comunicación con el Lego y se le indica el puerto en el cual se encuentra. Por ultimo Pues ya se puede comenzar a programar la aplicación, a continuación se describirán brevemente cada uno de los métodos utilizados en el programa.
void MainWindow_Loaded(object sender, RoutedEventArgs e)

Crea el objeto Kinect, inicializa los parámetros como la ventana, el panel, etc. E inicializa los streams de video del Kinect.
void kinect_VideoFrameReady(object sender, ImageFrameReadyEventArgs e)

Ese método sirve para obtener el frame desde el que podremos

11

Lego NXT controlado con Kinect
Proyecto Final

extraer el objeto tipo PlanarImage que será con el que trabajaremos en nuestra aplicación. El PlanarImage lo utilizaremos para crear un BitmapSource con el método Create pasando a éste como parámetros la anchura y altura de la imagen, el dpi, el formato de píxeles de la imagen (brg32, brga32, blackWhite…), la representación en bytes de la imagen y por último el stride.
void kinect_DepthFrameReady(object sender, ImageFrameReadyEventArgs e)

Este método es el de profundidad, nos sirve para saber que tan lejos encuentra un píxel del sensor (que mas adelante esto nos sirve para obtener la distancia a partir del sensor).
byte[] convertDepthFrame(byte[] depthFrame16)

Este método recibe los datos de profundidad y los va a convertir en datos de imagen RGB para poder mostrarlos.
void kinect_SkeletonFrameReady(object sender, SkeletonFrameReadyEventArgs e)

Este método detecta el esqueleto de las personas, que en nuestra aplicación es utilizado para poder diferenciar los brazos
bool isMakingAFist(ImageSource imgHand)

Este método es el que detecta las palmas de nuestras manos y nos devuelve las coordenadas de la palma de las manos izquierda y derecha.
public void verificarLego()

En este método comprueba la posición de la palma de nuestras manos y envía la señal al robot para realizar su correspondiente acción. e. Conexión y control del Lego NXT La ventana principal de la aplicación esta dividida en secciones. En la parte superior se encuentra el titulo de la aplicación y un panel que nos muestra un mensaje acerca de donde posicionarnos (si más adelante o más atrás), las coordenadas de las manos izquierda y derecha tanto en X como en Y. Debajo del panel se encuentra el VideoStream (que es el video en vivo) y debajo, del lado derecho se encuentra el DepthVideo (que es un video RGB). Es la cámara que detecta la profundidad de los objetos. Debajo de ese cuadro de video se encuentra otro pequeño panel en donde nos indica el Status de la conexión y de las instrucciones que se le están indicando el Lego NXT.

12

Lego NXT controlado con Kinect
Proyecto Final

El programa funciona de la siguiente manera: Se levantan ambas manos. Esto le indica al Lego NXT que debe avanzar Se extiende la mano izquierda (formando aproximadamente un ángulo de 90°con el cuerpo), esto le indica al Lego NXT que gire hacia la izquierda. Se levanta la mano derecha (formando aproximadamente un ángulo de 90°con el cuerpo), esto le indica al Lego NXT que gire hacia la derecha. Ambas manos se posicionan aproximadamente a media pantalla, levemente extendidas, esto le indica al Lego NXT que retroceda. Ambas manos deben de estar semipegadas al cuerpo y hacia abajo (como una posición natural), esto le indica al Lego NXT que se detenga.

Imagen11: Vista que muestra la interfaz principal de la aplicación y muestra las regiones en que se deben posicionar las manos para un correcto funcionamiento de la aplicación. Nótese que el jugador debe posicionarse en el centro del ángulo de visión de Kinect.

f. Interfaz Gráfica La interfaz gráfica se diseñó usando un tipo de archivo especial de Visual Studio. Se trata de un archivo con extensión XAML. Dicho archivo soporta la inclusión de componentes de la interfaz gráfica (etiquetas, botones, imágenes, campos de texto, deslizadores, etc.)

13

Lego NXT controlado con Kinect
Proyecto Final

muy similar a los componentes de un formulario HTML. Se dispone de una vista diseño, donde se visualiza la interfaz en modo gráfico; y una vista de código, donde se pueden nombrar cada componente de la interfaz y ajustar sus propiedades. Dichos nombres de los componentes son visibles desde el código base de la aplicación y se puede hacer referencia a ellos y cambiar sus propiedades desde el programa principal (que está escrito en C#). El archivo XAML es un tipo de XML/HTML que Microsoft Visual Studio usa para la definición de la interfaz gráfica. 5. Pruebas Las pruebas de funcionalidad de la aplicación fueron probadas en las instalaciones del UbiLab. Las pruebas consistieron en ajustar la distancia a la que el jugador debe posicionarse, el puerto COM al que debe estar conectado el Bluetooth, la tolerancia a fallos de nuestra aplicación, la estabilidad de los hilos manejados, etc. Dichas pruebas nos permitieron detectar errores y resolverlos. 6. Conclusiones El proyecto presentó las oportunidades de trabajar con tecnologías de punta, pues el dispositivo Kinect apenas tiene un año en el mercado, y aun ni siquiera el SDK oficial es lo suficientemente robusto en varios aspectos. Se trabajó con un lenguaje de programación con el cual no se acostumbra realizar los desarrollos, y se reafirmaron los conocimientos y habilidades adquiridas no solo durante este curso, sino dentro de todo el plan de la carrera, permitiendo así pasar de la teoría a la aplicación de los conceptos. Durante la elaboración del mismo se presentaron retos, que se supieron sortear de manera positiva, para así lograr el objetivo, controlar un Lego mediante un dispositivo Kinect. 7. Propuesta a futuro Tomando como base el presente se propone desarrollar un sistema que permita concientizar a las personas con respecto de la cultura vial. En este trabajo se logró controlar el Lego con el dispositivo

14

Lego NXT controlado con Kinect
Proyecto Final

Kinect y se propone desarrollar una maqueta vial donde se puedan manejar los Legos, que contenga algunos cruceros con algún método que simule los semáforos. Por ejemplo, se podría poner algunos Legos en cada esquina e implementar en el Lego un sensor de luz, que sea capaz de leer el color del semáforo, asignando un puntaje cuando el conductor realice la acción apropiada, si es verde avanzar o continuar avanzando, y en caso de ser rojo, detenerse. Obviamente el conductor con mayor puntaje ganará. Otra opción a desarrollar es que con un mismo dispositivo Kinect se puedan manipular dos Legos, ya que el actual solo se puede hacer con uno y de esta manera, poder competir de igual forma en una carrera entre los participantes para probar sus habilidades motrices y de conducción.

15

Lego NXT controlado con Kinect
Proyecto Final

8. Referencias 1. Reto SDK Kinect. Proporciona la documentación básica para programar para el Kinect. Muy útil a la hora de crear el “Hola Mundo”.
http://blogs.msdn.com/b/esmsdn/archive/2011/07/07/sdk-de-kinect-desarrolla-conkinect.aspx

2. Librería NXT.NET para Lego Mindstorms. Permite usar el Lego Mindstorms usando Microsoft Visual Studio y C#.
http://nxtnet.codeplex.com/

3. Hemos decidido liberar el código fuente, pues sabemos que este proyecto tiene buenos campos de aplicación. De aquí pueden descargar el código fuente de nuestra aplicación.
http://www.mediafire.com/?4tw0rqf7ifn1a35

16

Sign up to vote on this title
UsefulNot useful