Vistas de página en total

lunes, 24 de octubre de 2011

PRACTICA 1: PRIMERAS APLICACIONES

En la última entrada terminé habiendo dejado todo el entorno de desarrollo listo y probando que toda la configuración del PC y el brick estaba correcta.

En esta práctica, tras configurar el entorno de programación, del cual explicaré un poco el proceso, mostraré las primeras aplicaciones que he desarrollado para el Lego NXT. La práctica está formada por varios apartados independientes y para explicar cada una de las partes seguiré la misma estructura: Explicación breve sobre lo que se desea conseguir, señalaré aquellas partes de código que, bajo mi punto de vista, son más creativas o interesantes, y por último mostraré un vídeo con la ejecución de la aplicación (porque una imagen vale más que mil palabras!).

Como he señalado, el paso previo ha sido instalar el IDE con el que vamos a programar todas las futuras aplicaciones, Eclipse (Gavab). El lenguaje elegido ha sido Java, me gustaría señalar que no domino este lenguaje pero gracias a C y a los conceptos de POO me está resultando (de momento) sencillo acoplarme a él. Sobre el IDE, unicamente comentar la necesidad de añadir todo el API de leJOS insertando el fichero "classes.jar" como "External JARs".

*****************************************************************************

Bien, pues vamos con la primera aplicación:

CONTROL BÁSICO DEL MOTOR

Este apartado tiene como objetivo iniciarnos con la clase "Motor" y los métodos que ésta ofrece para el manejo de los diferentes motores de Manué. Además, también se hace uso de algún método de la clase Button, que se utiliza para interactuar con los botones del brick. Para este primer apartado unicamente mostraré un vídeo ya que la ejecución es muy similar en todos. Concretamente se piden 3 clases:

BasicMotor1.java:
Con esta clase, la intención es aprender a utilizar el método forward
Motor.A.forward(); -> Hace avanzar el motor conectado a A.
y el método waitForPress()
Button.waitForPress(); -> Detiene  la ejecución hasta que se presiona un botón

BasicMotor2.java:
En este caso, la intención es hacer girar el motor en un ángulo determinado en grados:
Motor.A.rotate(x) -> Donde x es un integer que indica el nº de grados.

BasicMotor3.java:
Por último y muy similar al anterior, hay que girar el motor pero utilizando el método rotateTo, el cual hace girar al motor tomando como referencia una posición absoluta:
Motor.A.rotate(x+angle);
x=x+angle; -> de esta forma avanzará "angle" grados respecto a la última posición.




*****************************************************************************

VISUALIZACIÓN DE LA ODOMETRÍA DEL MOTOR

Una vez que hemos tomado nuestro primer contacto con la API de leJOS basándonos en los métodos de la clase Button y Motor, toca dar paso al LCD. La cuestión principal de esta práctica es aprender las herramientas y restricciones que ofrece la pantalla de Manué. Se puede decir que los mayores problemas que he tenido han sido, por un lado el hecho de que cuando mostramos algo en la pantalla ésta no se borra, con lo que a medida que añades cosas se pueden ir solapando unas a otras, y por otro lado el tamaño, ya que limita el tamaño del contenido que se quiere mostrar.

Lo que se pide concretamente es que la pantalla muestre, a medida que giramos un motor manualmente, los grados que éste lleva girado en todo momento en un rango [0-360º). La mayor complicación ha sido, como cito en el primer párrafo, controlar el hecho de pasar de mostrar un número de "x" cifras a un número con un número de cifras menor. Para ello simplemente he hecho uso de una función longitud, con la que recuerdo el número de cifras que tenía el último número mostrado para, si el siguiente número tiene menos, limpiar la pantalla antes de mostrar el nuevo, algo como:


if (longitud(num_anterior)>longitud(numero_nuevo))
    LCD.clearDisplay();
LCD.drawInt(numero_nuevo);



*****************************************************************************

CUADRADO DE CALIBRACIÓN DE MOVIMIENTO

Una vez aprendidos los conceptos básicos para el manejo de los motores y el LCD, el siguiente paso es comenzar a navegar. Para esta tarea la clase elegida es TachoPilot, ya que provee métodos para que realizar un recorrido sea más sencillo que ir comandando continúamente el movimiento de cada uno de los motores. El primer paso para utilizar estos métodos es instanciar un objeto definiendo la configuración del robot por medio del constructor, concrétamente la distancia que hay entre las ruedas y el diámentro de éstas.

Imagen 1
Con el método travel(arg1, arg2) podemos comandar al robot que avance una distancia de "x" centímetros a través del argumento "arg1" y puesto que el objetivo del apartado es realizar una aplicación que haga recorrer al robot un circuito en forma de cuadrado, este método y rotate(angle), donde angle son los grados a rotar, son suficientes para que desempeñe la tarea.

Para las pruebas de precisión, realicé un acople (imagen 1) con el quede precisar mejor el punto final donde finaliza y comienza la trayectoria. De tal modo que el robot pudiese sujetar un bolígrafo y de esta forma dejar marcado el recorrido que va siguiendo el robot a lo largo de los ejes "x" e "y", además de precisar mejor el punto final donde finaliza y comienza la trayectoria.


Aprovecharé este apartado para dar respuesta a dos cuestiones que se nos formulan en el enunciado de la práctica:

- ¿Cual es aproximadamente el rango de error cometido?
Para responder a la pregunta realicé un test de pruebas sobre una cartulina marcando, el propio robot, el recorrido que iba realizando (como se ve en el vídeo). Tras 10 ejecuciones, se podía comprobar que todas los intentos finalizaban en un rango de aprox. 1.5cm², siendo este el rango de error.


- ¿Existe un error sistemático?
Es complicado responder esta cuestión, ya que es me resultó muy difícil hacer que el robot comenzase siempre en exactamente la misma posición y con la misma orientación. Tras las 10 pruebas he de decir que no, ya que finalizaba con bastante precisión pero no fallaba siempre de una misma forma, sino que el error oscilaba en "+-x" y "+-y".



*****************************************************************************

MATRIZ DE COVARIANZA

Este apartado trata de mostrar, por medio de la covarianza, la dependencia que existe entre la distancia recorrida (eje y) y el error que se produce (eje x) al ejecutar un recorrido rectilíneo 20 veces. Ya que los cálculos son simplemente aplicar la fórmula que viene en el enunciado, prefiero omitir todos estos pasos y centrarme en responder la dos cuestiones que se nos plantean:


¿Cómo podr a generalizarse esta matriz para cualquier recorrido en línea recta?
Como ya he señalado, el objetivo de la covarianza es ver la dependencia existente entre dos variables estudiadas, es decir, si existe una relación directa que determine si a medida que aumenta un valor, también aumenta el otro, o bien si a medida que aumenta uno el otro disminuye. Por lo tanto, una vez que tenemos ese valor, podemos generalizar para cualquier otro recorrido, ya que sabemos la relación que tiene nuestro robot entre el error que comete y la distancia que recorre.

*****************************************************************************

VISUALIZACIÓN DE LA TRAYECTORIA

En esta última aplicación se combinan los métodos aprendidos para programar el recorrido de un robot con los vistos para mostrar en la pantalla determinada información.

El objetivo es conseguir mostrar en el LCD el recorrido (a escala) que realiza el robot. Para ello, he pensado hacer 2 tipos de recorridos, y así ver cómo el mostrado se relaciona directamente con el realizado por el robot. La aplicación queda entonces como un menú, en el que si seleccionamos el botón derecho el robot realizará la figura de un cuadrado, mientras que si seleccionamos el botón izquierdo realizará la figura de un rectángulo.

Para programar esta aplicación, parto del código implementado en el cuadrado de calibración y la base está en establecer dos estados, girando y avanzando, de tal forma que cuando avanza tenemos que saber en que dirección lo hace por medio de senos y cosenos del ángulo hacia el que está orientado, y si gira, debemos actualizar dicho ángulo. A continuación muestro un vídeo sobre como se va mostrando el recorrido que realiza el robot, he de decir que por comodidad lo mantengo sujeto en la mano ya que a medida que avanza sería más complicado poder mostrar la pantalla:

lunes, 17 de octubre de 2011

PRACTICA 0: PREPARANDO EL ENTORNO DE DESARROLLO

El título de esta entrada hace referencia al objetivo que se persigue en la práctica 0, instalar y configurar todo el software que necesitaremos para el robot, el firmware que contiene el ladrillo y aprender los conceptos básicos para poder comunicar al robot con el pc vía USB.

Para no repetir lo que ya dice el enunciado de la práctica, haré un resumen sobre los pasos que he realizado para conseguir configurar todo el sistema.

El primer paso fue descargar el entorno de programación leJOS para el robot Lego NXT, concretamente la versión 9.0. Una vez descomprimido y establecidas las variables de entorno necesarias el siguiente paso fue actualizar el firmware del brick (o ladrillo) a su versión más reciente, lo cual en mi caso no fue necesario puesto que ya se encontraba instalada la versión 8.5.

Tras esto, y a modo de prueba, utilicé algún ejemplo que trae el entorno leJOS ya programados y que sólo es necesario compilar y linkar para su ejecución. Sin embargo, aquí comienzan a surgir los primeros problemas ya que, una vez compilado y linkado el ejemplo HelloWorld.java y generado su ejecutable HelloWorld.nxj compruebo que no puedo enviar el ejecutable al brick por medio del USB puesto que me falta una librería relacionado con el mismo USB.
Después de navegar un rato, doy con el blog de otro alumno que había cursado la asignatura y que detalla las librerías que necesitó él para solucionar el problema. La solución no era más que ejecutar los comandos:

sudo apt-get install libusb-0.1-4
sudo apt-get install libbluetooth-dev

para instalar las librerías necesarias tanto para el USB como para el bluetooth (ya que además de vía USB la comunicación pc-brick se puede realizar por bluetooth).

El resto, y teniendo en cuenta que para transmitir el fichero ejecutable era necesario ejecutar el comando correspondiente con permisos administrativos (root user), fue tan sencillo como esperar el sonido de confirmación que lanza el ladrillo al finalizar la transferencia y ejecutar mi primer programa con el entorno leJOS.

Otra utilidad intersante, ya finalizando la práctica 0 es el comando:

nxjbrowse

ya que muestra una GUI desde la que podemos administrar los ficheros que están contenidos en el brick.

Y con esto finaliza la primera práctica dando paso a una siguiente en la que, tras configurar el entorno de programación, crearé mi primera aplicación.


CREANDO A MANUÉ

Mi primera experiencia con las prácticas de la asignatura fue asegurarme de que no faltaba ninguna de las piezas con las que tendríamos que dar forma a nuestro robot, algo sencillo.

Junto a la caja que nos daban y que contenía todas estas piezas venía un manual donde explica cómo crear un robot con un diseño standard, así que decidí que lo mejor sería montar éste y después realizar modificaciones en él, ya que en un principio no se me ocurría que forma darle con tanta pieza suelta.

Bien, pues es así como surje Manué, a quién podemos ver en las siguientes imágenes.



Si tuviésemos el manual a mano, se podría comprobar que faltan componentes (sensores principalmente) que sí trae el diseño que él muestra. En un principio he preferido prescindir de ellos por comodidad a la hora de manipular el robot, tanto para cuando necesito conectar el ladrillo al pc, como para transportarlo y realizar futuras pruebas, o simplemente cuando es necesario quitar y volver a poner la batería porque se ha quedado "colgado".

Con un primer diseño del robot ya montado, el siguiente paso fue comenzar la realización de la primera práctica, la práctica 0 que pasaré a explicar en la siguiente entrada.


EL INICIO

Se ha demorado más de lo previsto pero aquí comienza mi primer blog. 

La intención y el objetivo de este blog es poder reflejar mi andadura en la asignatura de Introducción a la Robótica mostrando los avances que tendré que ir realizando para crear lo que será mi primer robot. Para ello la asignatura consta de diversas prácticas en las que, de manera progresiva, intentaré dotar a un robot de cierta inteligencia artificial para que, de una forma autónoma, consiga tomar ciertas conductas ante estímulos concretos.

Siguiendo este objetivo, iré explicando de una forma genérica los pasos a seguir en cada práctica e incidiendo más en aquellas situaciones que, o bien me resultan más interesantes, o se ha tratado de algún tipo de problema para el que he necesitado investigar por mi cuenta y de esta forma que sirva, por ejemplo, para futuros alumnos.

Sin más que añadir, paso a explicaros la creación del robot Manué...