Práctica 5: Radar

En esta parte de la Práctica 5 teníamos que implementar un radar que guardara un histograma representativo de las distancias a las que están los obstáculos que rodean al robot. Hemos utilizado el sensor de ultrasonidos montado sobre el robot apuntando siempre hacia adelante y hemos utilizado los motores de las ruedas para que el robot entero rote sobre sí mismo y vaya tomando medidas con una frecuencia proporcional a la resolución que el usuario pide al utilizar el radar en su programa. Hemos decidido utilizar la rotación del robot en vez de montar el sensor sobre un motor para así evitar problemas con los cables (se enredan), ya que deshacer el giro cada vez que lo hiciéramos equivaldría a una acumulación de errores en la odometría considerable. Además, hemos colocado el sensor en el cruce entre el eje de simetría del robot y el eje de rotación de las ruedas, para que al tomar medidas se mantenga siempre en la misma posición y rote sobre sí mismo.

El sensor de ultrasonidos del NXT no es una maravilla precisamente, por lo que las medidas tienen errores frecuentemente y aparecen picos en el histograma. Por ejemplo, un histograma obtenido tomando 90 medidas en 360º (una medida cada 4º) tiene una pinta de este estilo:

Práctica 5: Dibujado de un mapa y sus partículas

En este apartado se nos pide que creemos un objeto de tipo MCLParticleSet a partir de un mapa que recibimos desde un fichero llamado map1.bin. Es un apartado sencillo ya que nos limitaremos a dibujar el mapa en la pantalla (escalado, eso sí, ya que nuestra pantalla tiene un límite de 100 x 64 píxeles y el mapa es de 189 x 189 aproximadamente) con una función que nos hemos creado ad hoc llamada dibujarRecta (sólo dibuja líneas horizontales y verticales, pero nuestro mapa no tiene líneas diagonales ni oblicuas así que no hay problema) que recibe por parámetros dos puntos y después de crear el objeto MCLParticleset con todas sus partículas, obtenemos la posición de cada partícula con getPose, escalamos la posición a nuestra pantalla y las dibujamos. El resultado es el siguiente:

Práctica 4: introducción a los filtros de partículas y navegación local

En el primer punto de esta práctica hemos tanteado un poco el filtro de partículas; hemos inicializado cien partículas dentro de un mapa en la misma posición del robot y les hemos aplicado cuatro traslaciones y cuatro rotaciones con un cierto umbral de ruido. El resultado lo hemos ido dibujando en el display del NXT. Se puede comprobar el resultado en las siguientes imágenes:




El mayor tiempo lo hemos invertido inicializando las partículas a una posición determinada; ya que la clase partícula no tiene un método para situarla en un punto (x,y) ni para fijar una orientación, hemos tenido que calcular los grados a rotar, la distancia de traslación y hemos aplicado el método applyMove que recibe un objeto de tipo Movement y que define una rotación o una traslación.

El primer apartado del segundo punto de la práctica lo hemos abordado calculando utilizando los métodos travel y rotate; rotate lo aplicamos al ángulo que necesitamos rotar para ponernos de cara al destino, algo similar a lo que hemos hecho con las partículas en el apartado anterior. A continuación, hemos aplicado el método travel a la distancia que debemos recorrer para terminar en el destino.

El segundo apartado, por desgracia, no nos ha dado tiempo a abordarlo.

Práctica 2: Un poco de teoría

cono de apertura

Este es el resultado de las comprobaciones para calcular el cono de incertidumbre, que representa el área que abarca el sensor de ultrasonidos. Suponiendo que el sensor se pusiera a la izquierda del gráfico mirando hacia la derecha, la zona que hay entre el eje horizontal y la gráfica sería el área en la que el sensor es capaz de detectar un objeto. La zona por encima de la gráfica es la zona de incertidumbre en la que el sensor no detecta nada.

La matriz de covarianza del error de lectura del sensor en los dos ejes (x e y) es:

0,0054321 0,03703704
0,03703704 22,2222222

Practica 2: Siguiendo paredes

Por último, hemos combinado el sensor de contacto del parachoques y el sensor de ultrasonidos apuntando hacia el lateral izquierdo para que Menganitor sea capaz de seguir una pared a una distancia prudencial. Si se aleja o se acerca demasiado a la pared corrige su trayectoria para mantenerse paralelo a la pared. Si encuentra una esquina hacia la izquierda (es decir, la distancia que mide el sensor de ultrasonido aumenta drásticamente) avanza un poco para rebasarla, gira 90º y avanza otro poco para que el sensor no se confunda con el otro lado de la misma esquina. Si se encuentra con una esquina hacia la derecha se dará cuenta porque el sensor de contacto golpeará contra la pared, y Menganitor reaccionará retrocediendo unos centímetros, girando 90º y continuando su recorrido. El siguiente vídeo muestra este comportamiento:

Practica 2: Bump & Go (sensor de ultrasonidos)

También hemos hecho que Menganitor tenga el mismo comportamiento que en la versión con sensor de contacto, pero con un sensor de ultrasonidos que sustituye al de contacto. De este modo no necesita llegar a chocarse contra la pared, sino que detecta el obstáculo y reacciona cuando aún está a unos centímetros. La pega es que el sensor de ultrasonidos envía una señal y calcula cuánto tarda en rebotar, por lo que si se acerca a una pared con un ángulo muy abierto la señal rebota fuera del rango del sensor y no detecta la pared correctamente. En los últimos segundos del vídeo se puede observar este comportamiento.

En las primeras pruebas tuvimos algún problema con ciertos obstáculos que incluso consiguieron que nuestro Menganitor volcase…

Practica 2: Bump & Go (sensor de contacto)

El siguiente paso ha sido colocar un parachoques delantero conectado a un sensor de contacto, de modo que cuando el robot choca frontalmente contra una pared, retroceda unos centímetros, gire aleatoriamente entre 20º y 180º hacia la izquierda o hacia la derecha (también aleatoriamente) y continúe con su movimiento en otra dirección.

Practica 2: Clap Control

Esta semana hemos hecho algunos avances más vistosos que la anterior, ya que por primera vez usamos los sensores del Lego Mindstorms para que el robot interactúe de forma automática con el entorno.

En primer lugar le hemos instalado un micrófono al robot, para que cuando detecte un sonido fuerte (como una palmada o un grito) se ponga en movimiento, y se pare al detectar otro ruido, como se puede ver en el vídeo:

Con las primeras pruebas nos dimos cuenta de que si el ruido era demasiado largo, o había algo de eco, a Menganitor le daba tiempo de ponerse en marcha y pararse con una sola palmada, por lo que pausamos la ejecución del programa durante 200 milisegundos después de cada lectura del micrófono.

Configurando LeJOS en Mac OS X

Para hacer las prácticas con el Lego NXT vamos a utilizar LeJOS, que es compatible con Windows, Linux y OS X. Como yo uso este último y me ha costado encontrar una documentación decente para su instalación, voy a dejar aquí unas instrucciones detalladas para que cualquiera que se encuentre con este problema en el futuro encuentre aquí la solución. Yo utilizo OS X 10.5, pero la guía es exactamente la misma para OS X 10.6. Empecemos:

1. Descarga de la web de soporte el archivo Mac Leopard Fix, que se encuentra dentro de la categoría firmware e instálalo

2. Descarga LeJOS. La última versión al escribir estas líneas es la 0.8.5.

3. Descomprime el tar y guarda la carpeta lejos_nxj donde quieras. Personalmente la he guardado en ~/Library/lejos_nxj/ y te recomiendo que hagas lo mismo.

4. Ahora vamos a establecer algunos parámetros, así que abre una Terminal y escribe:
sudo pico ~/.bash_profile
Tras poner la contraseña de administrador, se abrirá un editor de texto en el que debes introducir lo siguiente:
cd /Users/tu_nombre_de_usuario/Library/lejos_nxj
LEJOS_HOME=`pwd`
NXJ_HOME="$LEJOS_HOME"
PATH="$LEJOS_HOME/bin:$PATH"
export LEJOS_HOME NXJ_HOME
export PATH

Recuerda que si has guardado la carpeta lejos_nxj en otro sitio deberás modificar estos valores. Ahora pulsa CTRL+X para salir del editor, ¡pero no olvides guardar cuando te pregunte!

5. Escribe source ~/.bash_profile en la terminal para que estos cambios sean tenidos en cuenta.

6. Dale los permisos necesarios a la carpeta lejos_nxj con el siguiente comando:
chmod -R 755 ~/Library/lejos_nxj/

7. Si usas Snow Leopard deberás abrir las Preferencias de Java que puedes encontrar entre las Utilidades de la carpeta Aplicaciones y poner la versión de 32bit por delante de la versión de 64bit. Como ya he dicho antes, yo uso OS X 10.5, por lo que esto último no lo he tenido que hacer.

Si has llegado hasta aquí siguiendo paso a paso las instrucciones, todo debería estar funcionando ya. Si quieres, para comprobarlo, conecta tu NXT al Mac y escribe esto en una terminal:
nxjbrowse -u

Esta información la he sacado de un hilo del foro de la comunidad de LeJOS.

Espero que le sea útil a alguien :)

Bienvenidos

Hola, somos Miguel y Diego y este pretende ser el blog que utilizaremos para hacer el seguimiento de nuestros avances en la asignatura de Robótica que estamos cursando en la URJC.

Para realizar las prácticas, utilizaremos un kit de Lego Mindstorms NXT al que la verdad es que yo personalmente le tenía ganas, así que veremos lo que da de si. ¡Nos vemos por aquí!

Seguir

Get every new post delivered to your Inbox.