miércoles, 30 de marzo de 2011

Práctica 5 (1ª Sesión)

Ahora dejaremos de lado lejOS y nos centraremos en el simulador 3D Gazebo, el cual nos permite cargar diferentes tipos de robots, sensores y actuadores dentro de un mundo arti cial. También utilizaremos JDE, que nos permitir a desarrollar comportamientos para nuestro robot. Utilizaremos ambas herramientas a la vez, empleando JDE para lanzar los comportamientos que desarrollemos y Gazebo para visualizar el resultado fi nal.

La práctica a realizar consiste en simular con las herramientas dadas un comportamiento de sigue-líneas utilizando la cámara del robot y obteniendo información sobre la imagen recogida podremos decidir como deberá comportarse.

Después de la explicación de la práctica únicamente jugueteamos un poco para ver como funciona el simulador, por ejemplo, cambiando la velocidad lineal y angular y observamos como nuestro robot 3D avanza y gira (hasta chocar con la pared claramente). Tampoco nos ha dado tiempo a más en esta sesión, por tanto la próxima semana veremos como debemos implementar el comportamiento requerido.

martes, 22 de marzo de 2011

Práctica 4 (2ª Sesión)

Seguimos con nuestro robot equilibrista, ahora hemos introducido la componente derivativa que nos faltaba para completar nuestro controlador PID, esta constante nos permitirá actuar más o menos suave en función de si debemos corregir más rapidamente o no la posición del robot.
Después de unos minutos de deliberación y consenso en lo referente a los valores que debíamos poner a las constantes (y básicamente de ver que el robot se comportaba relativamente bien) obtuvimos el siguiente resultado:


Claro que antes obtener el resultado requerido, digamos que hemos tenido que pasar por estado intermedios, donde el robot tenía un comportamiento más nervioso...


...o simplemente tenía tendencia a caerse de espaldas o darse de bruces


...o a revelarse contra nosotros cuando le dábamos un pequeño empujoncito.

Debemos tener en cuenta que según el calibrado de la luz inicial podemos obtener variaciones en el comportamiento, pero si no variamos la luz durante la ejecución no debería pasar nada extraño.

Después de pequeños retoques podemos decir que lo que vemos en el siguiente vídeo es nuestro resultado final.


martes, 15 de marzo de 2011

Práctica 4 (1ª Sesión)

En esta última práctica con lejOS debemos conseguir que nuestro robot tenga un comportamiento similiar a un segway, para ello debemos utilizar un controlador PID y para ello tenemos que ajustar las constantes Kp, Ki y Kd para conseguir una buena respuesta del robot según vaya estando más o menos inclinado y así poder rectificar su posición correctamente.

En esta primera sesión para empezar hemos utilizado únicamente la constante proporcional obteniendo como resultado el siguiente video:

Controlador P

Como vemos, se comporta relativamente bien, pero sólo cuando no se inclina demasiado, es decir, cuando el error no es demasiado grande. Por esto observamos que en cuanto el robot se inclina mucho no es capaz de rectificar su posición correctamente.

Seguidamente hemos añadido la constante integral, aunque no hemos conseguido un mejor comportamiento hemos observado que si aumentamos el valor de Ki el robot tarda algo más de tiempo en reaccionar a los cambios.

Para la siguiente sesión continuaremos intentando ajustar correctamente estas dos constantes anteriormente mencionadas y además añadir la constante derivativa para completar así nuestro controlador PID para el robot.

jueves, 10 de marzo de 2011

Práctica 3 (2ª Sesión)

Continuamos peleándonos con nuestro robot para seguir con los 2 ejercicios restantes.

El tercer ejercicio de esta práctica consiste en la evitación de obstáculos utilizando el sensor de ultrasonidos mediante el cálculo del vector resultante (VFF). Para este apartado lo más costoso ha sido calcular precisamente ese vector resultante, ya que aparecían senos, cosenos, etc. y no es que nos llevemos muy bien con la queridísima trigonometría, pero finalmente hemos conseguido que Menganitor tenga un comportamiento medianamente correcto y que por lo menos no choque con algunos objetos que va encontrando en su camino.
Los comportamientos utilizados para este ejercicio han sido:

        AndaMirando
                  takecontrol( ): true
                  action( ): indicamos a los motores que vayan hacia adelante
                  supress( ): indicamos a los motores que se detengan


         Esquiva
                  takecontrol( ): miramos si la media de las medidas es menor que 255
                  action( ): según la distancia y orientación respecto al objeto detectado giraremos de una forma u otra
                  supress( ): indicamos a los motores que se detengan


Esquivar obstáculos mediante VFF

Esquivar obstáculos mediante VFF

Por último, tenemos que mezclar estos comportamientos utilizados en los ejercicios anteriores para permitir al robot a la vez de que vaya suiguiendo la luz, que sea capaz de esquivar un obstáculo si se interpone en su camino y después continuar el comportamiento sigue-luz.

Los comportamientos utilizados para este ejercicio han sido:

        DriveForward
                  takecontrol( ): true
                  action( ): indicamos a los motores que vayan hacia adelante
                  supress( ): indicamos a los motores que se detengan

        SigueLuz
                  takecontrol( ): takecontrol( ): si el valor absoluto de la diferencia entre el valor de cada sensor de luz es mayor que un determinada cantidad, tomará el control
                  action( ): según hemos declarado los sensores, si dicha diferencia es negativa giraremos a la izquierda (llega más luz por el lado izquierdo del robot) y si la diferencia es positiva giraremos a la derecha
                  supress( ): indicamos a los motores que se detengan

        Esquiva
                  takecontrol( ): si la distancia al objeto detectada es menor de un determinado valor
                  action( ): indicamos que gire adecuadamente para sortear el obstáculo
                  supress( ): indicamos a los motores que se detengan

Video sigue luz y esquiva

miércoles, 2 de marzo de 2011

Práctica 3 (1ª Sesión)

En esta práctica 3 jugaremos con los sensores de luz y ultrasonido mediante la programación de comportamientos. Cada comportamiento debe disponer de tres metodos, el primero de ellos es la toma de control takecontrol( ) que tendrá condición que debe cumplirse para llevar a cabo el comportamiento; después tenemos el método action( ) donde tendremos las instrucciones que se ejecutarán cuando el comportamiento esté activado, y por último, el método supress( ) que finalizará el código que ejecuta el método action( ).

En esta primera sesión hemos comenzado con los dos ejercicios que consideramos algo más asequibles, que son el de un comportamiento de evitación de obstáculo mediante sensor de contacto, donde tenemos los siguientes comportamientos:

         DriveForward
                  takecontrol( ): true
                  action( ): indicamos a los motores que vayan hacia adelante
                  supress( ): indicamos a los motores que se detengan

         HitWall
                  takecontrol( ): si el botón de contacto es presionado
                  action( ): indicamos que retroceda un poco para poder esquivar el objeto
                  supress( ): indicamos a los motores que se detengan



Esquivar obstáculo mediante steer


Esquivar obstáculo mediante rotate

Y el otro ejercicio que hemos visto más asequible es el del comportamiento de sigue-luz, en el que mediante dos sensores de luz nuestro robot deberá desplazarse siempre hacia donde mayor luz esté recibiendo; en este caso tenemos los siguientes comportamientos:

         DriveForward
                  takecontrol( ): true
                  action( ): indicamos a los motores que vayan hacia adelante
                  supress( ): indicamos a los motores que se detengan
         TomaMedidas
                  takecontrol( ): si el valor absoluto de la diferencia entre el valor de cada sensor de luz es mayor que un determinada cantidad, tomará el control
                  action( ): según hemos declarado los sensores, si dicha diferencia es negativa giraremos a la izquierda (llega más luz por el lado izquierdo del robot) y si la diferencia es positiva giraremos a la derecha
                  supress( ): indicamos a los motores que se detengan

Sigue-luz on board

Sigue-luz cámara aérea


Sigue-luz cámara aérea

Por tanto en la próxima sesión seguiremos con los ejercicios restantes de comportamiento de evitación de obstáculos usando el sensor de ultrasonidos mediante el cálculo de vector de fuerza resultante, y también el comportamiento de sigue-luz evitando obstáculos.

miércoles, 23 de febrero de 2011

Práctica 2 (2ª Sesión)

Continuamos con el siguiente ejercicio propuesto, que tendrá como objetivo que nuestro robot sea capaz de seguir una pared, ya sea de forma rápida o más lenta, pero al fin y al cabo que la siga.

Después de que Menganitor haya tenido atracción (demasiada) por las paredes, se haya comido esquinas o una vez detectadas se haya puesto a girar sin control, este ha sido el resultado final que podemos ver que tiene un comportamiento más o menos decente.

Sigue pared


Calibración del sensor de ultrasonidos.


En esta sesión calibramos el sensor de ultrasonido, los datos resultantes son los indicados en las tablas siguientes.


La distancia real máxima y mínima que puede medir el sensor es:



            distancia real máxima:   130  cm


            distancia real mínima:     16   cm



El máximo ángulo con respecto a la pared para los que los valores son válidos son:



Grados    10˚    20˚    30˚    40˚    50˚
DCHA    255    51     52     54     255
IZQ         50     50      51     53     255




¿La media del error entre la medida y la distancia real es diferente de 0?


CM           20    30    40    50    60    70    80    90    100
Medido     23    30    40    51    61    70    81    90    100

media = 0.666...
Podemos ver como sí es diferente de 0.



La incertidumbre en el eje X.

cm               40    50    60    70    80    90    100    110    120
medida1       41    50    61    71    81    90    102    112    123
medida2       41    51    61    71    81    90    103    113    122
medida3       40    51    60    71    81    91    102    114    123
medida4       41    51    61    70    81    91    102    112    123
medida5       40    51    61    71    80    91    102    113    122
medida6       40    51    61    71    81    91    102    114    123
medida7       41    50    61    70    81    91    101    111    123
medida8       41    51    61    71    81    90    102    112    122
medida9       41    51    61    71    80    90    102    111    122
medida10     41    51    61    71    81    91    103    112    122
media error  0,7   0,8   0,8   0,8   0,8   0,6    2,1     2,4     2,5



La incertidumbre en el eje Y.

cm    40    50    60    70    80    90    100    110    120
y     14,5   15    9,5    6    4,5     5       5        4        3



La matriz de covarianza del error P que representa la incertidumbre
del sensor es:



     699.24      -100.96
    -100.96       18.38


Como hemos visto en clase la matriz no tienen relazion con los resultados que nos deben de dar por lo tanto volvimos ha hacerla, nos dieron los resultados siguientes.


0.5706      -0.7588
-0.7588       18.38


Podemos ver como estos datos ya si tiene más sentido que los anteriores, por lo que debimos confundirnos al hacer los calculos en la 1º matriz.

jueves, 17 de febrero de 2011

Práctica 2 (1ª Sesión)

En esta segunda práctica, trabajaremos con los sensores del robot (tanto internos como externos). En el primero de los ejercicios debemos mostrar cierta información en la pantalla del ladrillo accediendo a sus sensores internos, como pueden ser el de la batería o la memoria libre disponible, así como los sensores exteroceptivos de luz, ultrasonido y micrófono.

En el segundo ejercicio tendremos que controlar el robot mediante palmadas (ClapControl), comenzando con el robot parado, si damos un palmada deberá avanzar hasta que volvamos a dar de nuevo otra palmada y detenerse.

ClapControl

Los dos siguientes ejercicios serán un Bump & Go, es decir, el robot avanzará hasta que, en el primer caso, choque contra un obstáculo, o en el segundo caso, detecte un obstáculo a una determinada distancia, lo que hará que el robot retroceda, gire aleatoriamente y comience de nuevo a avanzar hacia adelante. 


Bump & Go (contacto)

Bump & Go (ultrasonido)

viernes, 4 de febrero de 2011

Practica 1 (Soporte para el bolígrafo)


Los pasos que seguimos para realizar el soporte para el bolígrafo.


Para realizar el soporte para el bolígrafo, partimos del diseño que nos viene con la caja del robot, tan solo tenemos que quitar la pieza de delante como podemos ver en la imagen.


Para hacer nuestro soporte necesitaremos las piezas siguientes:
3x4210753
2x655826
2x370626
2x4121715
2x4121667


1º Empezaremos colocando la pieza 655826 entre las ruedas, se puede ver en la imagen en pequeño por la parte de dentro del robot entre los 2 motores. Esto impedirá que el lápiz pueda resbalar cuando el robot se mueva.


2º A continuación colocaremos las siguientes piezas como vemos en la imagen: 
1x4210753
 2x370626
 2x4121667
 1x655826


3º Una vez realizado el paso 2º colocaremos el soporte en la parte delantera entre las 2 piezas que sobresalen del diseño original del robot.


4º Continuaremos formando las 2 piezas que vemos en la siguiente imagen utilizando las piezas:
2x4210753
2x4121715


5º Las juntaremos como vemos en la imagen, con la parte del soporte que teníamos ya colocado anteriormente y tendremos terminado el soporte para el bolígrafo o el lápiz.


Podemos ver en la siguiente foto el soporte ya terminado con un bolígrafo pintando en un papel.

jueves, 3 de febrero de 2011

Práctica 1 (2ª Sesión)

Hoy hemos seguido avanzando en la realización de la 1ª práctica, en lo referente al último problema que tuvimos en la parte de la odometría del motor parece que hemos conseguido mostrar bien por la pantalla del robot los grados que vamos girando el motor  aunque con un ligero parpadeo que no conseguimos hacer que desaparezca (ya que estamos continuamente limpiando la pantalla y escribiendo los grados).
Después hemos seguido con el ejercicio del cuadrado, para el cual hemos modificado ligeramente el diseño inicial del robot creando un soporte para el boli que pintará la traza del cuadrado en un folio, que consiste en apoyar en diagonal el bolígrafo para que la punta del mismo se sitúe en medio del eje de giro del ladrillo y con su propio peso apoyará en la superficie para marcar la traza.

1ª ejecución traza

Al principio era demasiado poco preciso y se desviaba bastante en cada ejecución del cuadrado, pero al modificar la velocidad de movimiento y de giro del robot parece que se gana algo más de precisión.

Velocidad de movimiento y giro ralentizadas

Finalmente estas son unas capturas de las trazas realizadas por nuestro robot, como vemos cada ejecución ha terminado en distintas posiciones pero muy cercanas entre sí.

Trazas cuadrado

A continuación hemos realizado 10 repeticiones en línea recta para medir los desvíos que se producen y así poder calcular la matriz de covarianza, y por último hemos intentado ir mostrando por la pantalla del ladrillo la posición que ocupa al ir realizando el cuadrado, pero ya no había más tiempo para seguir, asique para terminar la práctica 1 únicamente nos quedaría hacer esta última parte de las coordenadas y el ángulo en la trayectoria del cuadrado y los cálculos teóricos para la matriz de covarianza...veremos a ver si somos capaces de terminar a tiempo...


Cálculo de la matriz de covarianza:

Realizamos 10 veces un recorrido en línea recta de 100 centímetros y medimos las distancias:
(-0.1 , 4.2);
(0.1 , 3.2);
(0.2 , 2.4);
(-0.1 , 1.6);
(-0.1 , 1.2);
(0 , 0);
(-0.1 , -0.4);
(0.1 , -0.4);
(-0.2 , -0.6);
(-0.1 , -1);

La matriz resultante es:

[0.01  0.06]
[0.06  2.89]



Trayectoria del robot:

En esta parte de la práctica, tenemos que hacer que el robot realice el cuadrado de la práctica anterior y además muestre por pantalla donde esta situado en cada momento.
Mostramos en el siguiente vídeo, que lo consigue:


jueves, 27 de enero de 2011

Práctica 1 (1ª Sesión)

En esta primera sesión hemos realizado el montaje del robot, para poder empezar a juguetear un poco con las funciones que nos ofrece LejOS.


Primeramente hemos configurado Eclipse para poder trabajar con LejOS, creando los accesos directos para la correcta compilación y enlace de los programas que realicemos desde este IDE.
Después hemos comenzado realizando los primeros ejercicios propuestos, el primero de ellos sin ninguna complicación, debe esperar a que sea pulsado cualquier botón del ladrillo para comenzar a mover un motor (en nuestro caso el motor A) y cuando pulsemos de nuevo debe detenerse finalizando así el programa.
En los dos siguientes ejercicios observamos la diferencia entre las funciones rotate( ) y rotateTo( ), en el primer caso tenemos un programa en el que el motor girará 45º cada vez que pulsemos cualquier botón, sin embargo en el segundo caso, el motor solo se moverá la primera vez que pulsemos un botón, ya que el robot se guarda la posición en la que ha quedado y por tanto si le decimos que vuelva a girar 45º (pulsando un botón) no nos hará caso, ya que ya está en la posición de 45º; sin embargo si movemos manualmente el motor y pulsamos de nuevo sí se moverá para colocarse de nuevo en la posición correcta.
El último ejercicio que nos ha dado tiempo a echar un ojo en esta sesión ha sido el de la visualización de la odometría del robot, consistiendo en mostrar por la pantalla los grados que vamos girando un brazo conectado al motor B, pero no hemos llegado completarlo, ya que nos surge un problema a la hora refrescar (limpiar) la pantalla, ya que, cuando damos un vuelta entera y tiene que empezar desde 0º nos queda a la derecha un dígito de la muestra anterior, asique vamos a intentar solucionarlo...

martes, 25 de enero de 2011

Instalación de LejOS en MacOS X

Debido a que soy usuario de Mac y a que en las instrucciones de clase no viene nada referente a la instalación de LejOS en dicho SO, dejo estos sencillos pasos por si otros compañeros lo necesitan.

Lo primero que debemos hacer será descargar de la web de LEGO el parche que tienen para Mac.



La instalación es sencilla, con un doble click sobre el .pkg descargado se abrirá la ventana de instalación y tendremos que ir pinchando en siguiente hasta que esta se complete.

Después descargamos LejOS de la web oficial, seleccionando la version que hay para Linux o Mac.



Descomprimimos el fichero descargado con el comando tar y pegamos la carpeta en la ruta:


/Users/nombre_usuario/Library


Una vez que tenemos situado lo necesario, deberemos agregar algunas variables de entorno. Para ello editaremos (o crearemos si no lo tenemos aún) el fichero ~./profile:


sudo nano ~/.profile


Ingresamos nuestra contraseña y ponemos las siguientes lineas:


export JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Home
export NXJ_HOME=/Users/nombre_usuario/Library/lejos_nxj
export DYLD_LIBRARY_PATH=$NXJ_HOME/bin
export PATH=$PATH:$JAVA_HOME/bin:$NXJ_HOME/bin


La primera línea indica donde tenemos instalado nuestro JDK.
La segunda línea tendrá la ruta donde hemos puesto el directorio de LejOS.
La tercera se supone que se utiliza si usas el plug-in de Eclipse.

Después de editar el ~/.profile tenemos dos opciones, reiniciar sesión o ejecutar el siguiente comando para que tenga efecto lo que hemos hecho anteriormente:

source ~/.profile

Y ya está, según la guía de la web de LejOS no hace falta hacer nada para que funcione el USB, así que solo queda comprobar que todo funciona de la siguiente manera:

nxjbrowse -u

Esto nos dará un error si no tienes enchufado el USB, pero si lo que ocurre es que has hecho algo mal, lo mas probable es que te ponga un "command not found".

Después, con seguir los pasos de la primera práctica de Eclipse bastaría para poder trabajar con él.
No he podido probarlo aún con el ladrillo, cuando pueda hacerlo si falla algo lo actualizaré.

jueves, 13 de enero de 2011

Bienvenidos!

Los integrantes de este grupo somos:

Alberto Megías Adán.
Carlos Martín Sánchez-Muñoz.
Alain Vallejo Paredes.