Practica 4:

Segway:
La práctica 4 requería programar un "segway" con el NXT, esto es, hacer que el NXT se mantuviera en equilibro sobre dos ruedas a base de medir usando un sensor la distancia al suelo en cierto punto.
Para ello, había que implementar un funcionamiento PID (Proporcional, integral, derivativo).
Básicamente el funcionamiento PID se basa en la siguiente fórmula:
V = P*Kp + I*KI + D*KD
Que viene a decir que la variación a realizar sobre la medida (en este caso la medida de la distancia a la posición de equilibrio) es igual
a la componente proporcional multiplicada por una constante, mas la integral por otra, más la derivativa por una tercera constante.
En este caso, las tres componentes se calculan facilmente de la siguiente forma:
P es directamente la diferencia entre medida de la distancia tomada por el sensor y la distancia en posición de equilibrio.
I es la suma de dichas diferencias o errores a lo largo del tiempo. Se pone a 0 cuando el error varía de signo.
D es la diferencia entre cada error y el anterior.

Programar esto es facil. Así pues, la dificultad de esta práctica residía en el ajuste de las 3 constantes.
Para poder realizar este ajuste más rápidamente y no tener que estar conectando y desconectando continuamente el NXT lo que hicimos fue una función que, al pulsar el botón ENTER, hacía entrar al programa en modo "ajuste". En este modo la rueda de la derecha aumenta o reduce la variable en cuestión a grandes intervalos, y la rueda de la izquierda, a intervalos cortos. Pulsando de nuevo ENTER se cambia de ajustar la medida en posición de equilibrio a ajusrtar Kp, de Kp a a ajustar Ki y de Ki a Kd. Una última pulsación de ENTER vuelve a la función de segway.

Ajuste de las variables:
Despues de varias pruebas, vimos que los mejores resultados se daban siempre con las constantes proporcional y derivativa iguales, lo cual, a parte de tener cierta lógica, por que ambas variables tienen valores de magnitud parecida, era conveniente, pues nos permitió realizar el ajuste como si solo manejáramos dos variables.

La integral, por otro lado, acumula valores en una variable, con lo que aumenta muy rapidamente, lo que obliga a ponerle valores muy bajos, para evitar que fuera este valor el que dominara todo el movimiento.

Por último, también influía mucho la medida de la posición de equilibrio. Si se quedaba muy alta, el robot se iba hacia atras inevitablemente, si era baja, se iba hacia delante hasta caer.

Finalmente los valores más estables que conseguimos fueron:
  • Kp = 7
  • Kd = 7
  • Ki = 0.35
Video 1: Duración ~ 40 seg.



Video 2: Duración ~ 1:00

Practica 3:

Parte 1: Comportamiento de evitación de obstáculos usando sensores de contacto.

Este primer ejercicio es simple. Se trata de que al chocar contra un obstáculo (detectado por el sensor de contacto) el robot realize un movimiento de evasión. No se trataba de bordear el objeto de forma exacta, por lo que hicimos un movimiento prefijado, preparado para esquivar un objeto pequeño.

Parte 2:

Parte 3: Comportamiento ir hacia la luz.

Esta parte nos dio bastantes problemas. Se trataba de colocar dos sensores de luz mirando cada uno 45 grados a izquierda y derecha de la linea de mira del robot. Si uno de los detectores devolvía un valor mayor que el otro, el robot debía girar en el sentido del valor mayor.

El problema principal fue la calibración de los sensores. Cada uno devolvía valores diferentes. Uno empezaba más arriba, pero tenía un rango menor que el otro, que aunque en oscuridad absoluta daba un valor menor, llegaba a mayores valores de luz intensa.

Además los sensores se mostraban casi siempre mas sensibles con el LED encendido, pero esto traía el problema de que al acercarse a la pared, el robot detectaba el reflejo de su propia luz y se iba directo a la misma.

Después de muchas pruebas logramos calibrar los sensores en modo pasivo (con el LED apagado) midiendo la diferencia entre ellos en un valor mínimo de luz, y multiplicando uno de los dos por la relación entre ambos valores.

Usamos otro multiplicador que servía para acotar la diferencia entre los valores de los sensores (que en principio podía ser de hasta 1023) a valores entre 0 y 200, apropiados para ser pasados a la función steer().

Parte 4: Comportamiento ir hacia la luz evitando obstáculos.

Este ejercicio lo realizamos sin usar comportamientos.

Mediante un if/else hicimos al robot alternar entre los códigos de las partes 1 y 3 de la práctica. El resultado fue el deseado, el robot seguía la luz, pero realizaba un movimiento de evasión si se encontraba cualquier objeto por el camino.



Práctica 2:

Parte 1:Obteniendo información.
Consistía simplemente en mostrar por el monitor del NXT varios datos provenientes de los sensores. Ninguna dificultad.


Parte 2:Control del robot por sonido.
Esta práctica consistía en que el robot avanzase hasta que sonase una palmada, y volviese a ponerse en marcha al oír otra.
Tuvimos bastantes problemas con la calibración inicial del sensor de sonidos.
En un principio la calibración la realizábamos tomando una muestra de sonido de ambiente al inicio de la ejecución del programa. Esta muestra no era significativa.
Después tomamos una media de mil muestras para realizar la media.
Durante las pruebas pintamos por pantalla el resultado de la calibración, y al principio daba valores demasiado bajos, luego parecía subir junto con la variable que guardaba la "palmada" haciéndose imposible de alcanzar.
Probamos a tomar un número bajo de muestras, y a tomar la mayor de ellas, y en esta ocasión la palmada estaba constituida por cualquier sonido que superase esa toma máxima. Tampoco funcionó.
Finalmente volvimos a hacer una media, esta vez con 10000 muestras.
El problema real de la práctica no era la calibración, era que el sonido de la palmada duraba más de lo que tardaba el robot en detectar un ciclo de parada y uno de puesta en marcha, lo que se arreglo con sendos sleep() antes de cada fase.
El resultado final fue tan bueno que probamos en una habitación con música alta y robot distinguía perfectamente las palmadas.


Partes 3 y 4: Bump & Go!
El robot debía andar en linea recta hasta encontrar un obstáculo en cuyo caso se echaba hacia atrás y giraba un número aleatorio de grados. En la primera de las dos, el obstáculo se detectaba mediante el sensor de contacto, es decir, al chocar con el, y en la segunda mediante el de ultrasonidos, en cuyo caso debía detectar una distancia de 20 cm de cualquier obstáculo. Cambiamos esta distancia a 30 por que la configuración de nuestro robot hacía que los 20 cm quedaran casi a la misma distancia que el sensor de contacto.


Parte 5: Sigue paredes.
Debíamos programar al NXT para que siguiera una pared a cierta distancia prudencial.
En la clase de teoría anterior se nos había hablado de los controladores proporcionales, derivativos e integrales, y en un primer paso pensamos en implementar un sistema de este tipo para mantenernos cerca de la pared.
El robot se quedó dando vueltas.
Ajustar las variables para imitar el comportamiento PID parecía muy difícil, así que inhabilitamos las partes derivativa e integral y lo único que conseguimos fue que el robot continuase dando vueltas.
Finalmente optamos por controlar la rotación del robot en varios if en los que el índice de rotación tomaba solo tres valores diferentes dependiendo de si la distancia era menor a la deseada, mayor, o mucho mayor (a partir del doble).
En una primera prueba, el robot fue capaz de seguir paredes rectas y doblar precariamente en las esquinas aunque esto último no logró hacerlo en clase.
Eso fue a lo máximo que llegamos en esta parte de la práctica.

Parte 6: Calibración del sensor de ultrasonidos.
Esta parte consistía en tomar una serie de medidas sobre el sensor de ultrasonidos, para comprobar el error existente entre las distancias medidas por el sensor y las reales, las distancias laterales a las que el sensor comenzaba a captar un objeto, etc.
  • La distancia real máxima medida por el sensor es de 180 cm.
  • La mínima es de 8.
  • Al colocar el robot a 40 cm de la pared e ir rotándolo, éste daba medidas fiables hasta los +- 60º respecto a la perpendicular.
  • La media del error entre las medidas tomadas por el sensor y las reales es de 0,44 cm.
  • El error aumenta a medida que nos alejamos de la pared. A distancias cortas la medida dada por el sensor es casi exacta.
  • Los objetos son captados por los laterales en un cono de apertura que se cierra a larga distancia.
Cono de apertura de detección lateral de objetos:

Matriz de covarianza:

Practica 1

Practica 1:
Control Básico del motor:
Debíamos hacer rotar un motor por 3 métodos diferentes.
Primero debíamos hacer girar un motor hasta que se pulsara un botón cualquiera. Despues debía girar 45 grados mediante el método rotate(), y por ultimo, lo mismo pero utilizando el método rotateTo()
Los 3 códigos sin problemas, aunque parecía que con 45 grados el motor se movería un poco más.

Visualización de la odometría del motor:
Aqui debíamos mostrar la odometría interna (el ángulo de giro) de un motor que movíamos de forma manual.
En las primeras pruebas mostraba cifras extrañas, por encima del millar, e intentamos arreglarlo con un "% 360" (módulo 360), pero segía mostrando números por encima de 360 grados. Al final resultó que pintaba unos números por encima de otros, y al pasar de uno de 3 cifras a uno de dos, la última cifra se quedaba intacta. Para solucionarlo hicimos que el LCD se limpiara en cada vuelta del bucle, lo que hace que los números se visualicen de forma vibrante y "a trozos".

Cuadrado de calibración de movimiento:
Sobre el papel, dibujamos un cuadrado de 40 por 40 cm. Para realizar las pruebas simplemente colocábamos a Trocolo sobre una de las esquinas.
El robot no se mueve de forma perpendicular al eje de las ruedas, con lo cual la primera fuente de desviación a la hora de dibujar el cuadrado era que la linea de salida ya estaba desviada de la trayectoria ideal.
Además los ángulos no son exactamente de 90, así que la posición final nunca es exáctamente igual a la inicial, aunque si bastante próxima.


Matriz de covarianza:
Para realizar la matriz de covarianza dibujamos una linea recta de un metro sobre cartulina.
Despues hicimos recorrer 10 veces dicha linea al robot, anotando la desviación lateral como variable Y y la longitudinal como X.





Visualización de la trayectoria. La última parte de la práctica consistía en mostrar por la pantalla del NXT los valores de X, de Y y de el ángulo total durante el recorrido del cuadrado.
Hemos tenido que crear dos variables auxiliares X0 e Y0 para que acumulasen los valores de x e y al cambiar de lado.


Práctica 0

En el laboratorio seguimos los pasos para descargar e instalar leJOS, para actualizar el firmware del NXT si fuese necesario, para configurar eclipse y para subir los ejecutables al robot.
Mas tarde, al intentarlo en el portátil, tuvimos algunos problemas compilando leJOS porque, primero, no estaba instalado correctamente JDK, después faltaba la biblioteca usb.h, y por último faltaba también bluetooth.h, de forma que cada vez que ejecutábamos "ant" nos respondía con un nuevo fichero .h faltante.
Una vez resuelto todo esto probamos con éxito la conexión con el robot con algunos de los ejemplos que vienen con el propio leJOS.

Introducción

Este es el blog del grupo de prácticas formado por Cristian Cavero Simarro y Rubén Bautista Reyes para la asignatura Robótica de tercero de ingeniería técnica de informática de sistemas en la URJC.
A lo largo de este y los próximos posts iremos describiendo el progreso de dichas prácticas con el robot lego NXT llamado "Trocolo".

Durante la primera sesión de prácticas se repartió a cada grupo un kit Lego NXT para la realización de las mismas. Había que comprobar la integridad de cada uno de los kits entregados y, si faltaban piezas, apuntarlas para reponerlas al principio de la sesión siguiente.
En nuestro caso faltaba cierta cantidad de piezas pequeñas, un cable y el libro de instrucciones.
El siguiente y último paso era crear este blog y empezar a darle contenido.