Dia 7 - Sigue linea con Gazebo

miércoles, 30 de marzo de 2011
Españoles... Bracitos... ha muerto... =(

Tras la muerte de bracitos, para continuar con las prácticas utilizamos dos herramientas nuevas: Gazebo y JDE.

El primero es un simulador en 3D que permite cargar diferentes tipos de robots, sensores y actuadores en un mundo artificial, mientras que el segundo es una herramienta que nos permite desarrollar comportamientos para nuestro robot.



La práctica consiste en intentar que el robot consiga avanzar por el mundo siguiendo la linea roja que hay pintada sobre el suelo.



Ante los problemas encontrados en el aula de prácticas (no funcionaba el entorno, la corrección del entorno fue demasiado tarde para nosotros), nos ha sido imposible terminar la práctica. Aunque no la hemos finalizado, si que hemos intentado hacerla asique vamos a comentar el trabajo que hemos desarrollado.

Para conseguir el objetivo, debemos desarrollar un controlador PD. El algoritmo a ejecutar sería el siguiente:

  1. Obtener una imagen con el sensor de imágenes.
  2. Analizamos la imagen y con ello obtenemos una matriz. Esta matriz va a estar formada por píxeles (Red, Green, Blue). Para el funcionamiento óptimo, debemos estudiar 2 líneas de la matriz. Una de ellas se corresponde con la posición actual y la otra se corresponde con una posición mas avanzada de la actual.
  3. Analizamos las dos líneas. Si en la región central de la línea de posición encontramos un rojo y en la línea de la posición avanzada también, podemos suponer que avanzamos en línea recta y el robot puede acelerar. Si por el contrario, en la línea de la posición avanzada hay un blanco, debemos frenar y buscar el rojo para que el robot pueda girar y no perder la línea roja.

Hasta aquí ha llegado nuestra aventura en el mundo de la robótica.

Así han sido las cosas, y así se las hemos contado.

Día 6 - Practica 4

miércoles, 23 de marzo de 2011
Hola,

hoy toca realizar la práctica 4. En esta práctica debemos conseguir que bracitos se mantenga de pie sobre dos ruedas. Para ello hemos tenido que cambiar el diseño de bracitos:








Para conseguir que bracitos mantuviese el equilibrio, hemos implementando un controlador PID, el cual consiste en un mecanismo de control por realimentación que calcula la desviación o error entre un valor medido y el valor que se quiere obtener, para aplicar una acción correctora que ajuste el proceso.
El algoritmo de cálculo del control PID se da en tres parámetros distintos: el proporcional, el integral, y el derivativo.

Controlador P


El controlador P o proporcional determina la reacción del error actual. Su fórmula es:



La salida obtenida de este controlador, nos ofrece información del error actual. Con este controlador no conseguimos controlar el balanceo de bracitos. Con una Kp alta, bracitos oscila demasiado y cuando el error es muy grande no recupera la posición de equilibrio y siempre se cae.


Controlador I

El controlador I o integral tiene como propósito disminuir y eliminar el error en estado estacionario, provocado por el modo proporcional. El control integral actúa cuando hay una desviación entre la variable y el punto de consigna, integrando esta desviación en el tiempo y sumándola a la acción proporcional. Su fórmula es:



En conclusión, con este controlador, podemos comprobar si el error va aumentando o disminuyendo, por lo que la salida será mayor o menor en relación a la integral del error. Se reduce el oscilamiento del robot, por lo que Ki, debe tener un valor pequeño.


Controlador D


El controlador D o derivativo determina la reacción del tiempo en el que el error se produce.
Su fórmula es:


La función del componente derivativo es mantener el error al mínimo corrigiéndolo proporcionalmente con la misma velocidad que se produce; de esta manera evita que el error se incremente. Por lo que Kd, tiene que tener un valor mayor en relación al valor de Kp.

El calculo global para obtener una salida del controlador PID es:


Calculo del valor de las constantes


Las constantes Kp, Ki y Kd son constantes experimentales, es decir, para conocer sus valores, no queda otra que hacer miles de pruebas.

Sin duda, esta ha sido la parte mas costosa, por las numerosas pruebas y tiempo que hemos empleado para dar con los valores correctos para que bracitos mantuviera el equilibrio, cosa que finalmente conseguimos con los siguientes valores:

*Kp = 15
*Ki = 1
*Kd = 30

A parte de estas tres constantes, para el correcto funcionamiento del controlador, debemos acotar el error a un valor máximo, al que nosotros hemos situado en 200.

Una vez claro cómo conseguir el controlador, detallamos los pasos seguidos para conseguir el objetivo:
  1. Obtener el valor de equilibrio. Para ello obtenemos la media de 10000 mediciones en posición vertical. Al obtener este valor, es muy importante tener en cuenta, que el robot tiene tendencia a caer hacia adelante, por lo que hay que considerar cierto error. Para compensarlo, al valor obtenido le restamos la constante ERRORPESO con valor 10.
  2. Entramos en un bucle infinito, en el que constantemente vamos a calcular el valor del controlador PID.
  3. Analizamos el resultado obtenido, si la salida sobrepasa el error máximo permitido, el error toma el valor de error máximo.
  4. Si el valor final es negativo, significa que bracitos se cae para alante, por lo que deberá girar hacia atrás a la velocidad que marque la salida del controlador. Si por el contrario es mayor que 0, bracitos se cae de espaldas, por lo que deberá avanzar. El valor del error a la hora de configurar la velocidad en cada caso es en valor absoluto.

Después de tanto rollo y teoría, podemos ver como hemos cumplido el objetivo y bracitos mantiene el equilibrio durante un buen rato:





Sin mas dilatación, así son las cosas y así se las hemos contado.

Dia 5 - Practica 3

jueves, 10 de marzo de 2011
¿Qué hay de nuevo?

     Hoy es turno de la realización de la practica 3. En este caso vamos a usar programación de comportamientos (behavior). Se trata de definir un mecanismo para ver que comportamiento ha de ser ejecutado en cada momento. Destacar que no es obligatorio su uso, pero nosotros para una mayor comodidad y simplicidad nos decantamos por usarlos. Para organizar los distintos comportamientos usamos una instancia de la clase Arbitrator. Dicha clase se trata de un array de comportamientos cuyo orden es importante ya que el mas prioritario es el que tiene el indice mas elevado del array, es decir, el de la derecha.

Cada clase behavior implementa tres método:
  1. takeControl, devuelve un boolean. True si se cumple la condición para el comportamiento entre en acción.
  2. suppress, es lo último que ejecutará el comportamiento.
  3. action, se desarrollará la actividad del comportamiento.
Una vez entendido el manejo de la clase behavior pasamos a montar los distintos montajes que tenia bracitos para solucionar los apartados propuestos en el guión de la práctica. Mostramos unas imagenes de los diferentes montajes.


Bracitos + 2 sensores de contacto                 Bracitos + sensor de ultrasonidos


Bracitos + 2 sensores de luz                          Bracitos + luz + contacto



Bracitos + 2 sensores de luz + sensor ultrasonidos





- Comportamiento de evitación de obstáculos usando sensores de contacto

    Equipamos a nuestro robot de dos sensores de contacto. Cuando uno de estos sensores sea presionado, se activará el comportamiento Esquivar, por lo que el robot deberá esquivar el obstáculo (una lata de cocacola) rodeándolo. La forma de rodearlo sera retrocediendo unos centímetros y realizar un arco adecuado, terminando exactamente en la posición inicial. Para efectuar el arco usamos "steer". Tras distintas pruebas con determinados números de grados diferentes logramos conseguir el ángulo exacto para que Bracitos bordee el obstáculo de forma correcta. Adjuntamos un video demostración para comprobar el correcto funcionamiento.



- Comportamiento de evitación de obstáculos usando el sensor de ultrasonidos.

     En este caso equipamos a Bracitos de un sensor de ultrasonidos orientado hacia delante y montado encima de un motor. Para montar esta parte nos las tuvimos que ingeniar con las piezas dadas y tras varias horas el resultado fué el siguiente:




El sensor girará gracias al motor donde esta situado en un intervalo comprendido entre -60º y 60º. Cuando detecte el obstáculo, a una distancia de 30 cm, se activará el comportamiento. Tomará 6 medidas distintas (una medida por cada 10 º) y tomará el camino adecuado para bordear el obstáculo, terminado orientado en el mismo sentido que la posición inicial.

Sin duda, esta es la parte que mas nos ha costado realizar de todas las que llevamos ya que para su solución se requiere el cálculo de una seria de fuerzas virtuales que han de ser resueltas mediante reglas trigonométricas.
Para su explicación adjuntamos la foto que se encuentra en el guión de la practica:




En la imagen podemos apreciar 3 fuerzas. La flecha azul se corresponde con la flecha de atracción, la flecha roja es la de repulsión y la verde la fuerza resultante de las dos anteriores, siendo esta la que se desea calcular.
Conocemos la distancia al obstáculo (a la que llamamos min) y el grado generado con el eje y, llamado gradoRepulsión, por lo que conocemos la coordenada polar del obstáculo. Del objetivo, conocemos las coordenadas cartesianas, por lo que para hallar el punto destino:

  1. Pasamos la coordenada polar del obstáculo a cartesiana
  2. Sumamos la coordenada cartesiana del obstáculo con la del punto destino
  3. Pasamos la coordenada resultante a polar.
De la coordenada polar resultante, alpha será los grados que debe girar el robot para evitar el obstáculo y el modulo será la distancia que recorrerá antes de retomar la orientación original. Corroboramos el funcionamiento con el siguiente vídeo.



- Comportamiento ir hacia la luz.

     Para esta actividad los profesores nos facilitaron dos sensores extras encargados de detectar la luz. Ambos sensores estarán orientados a -45º y 45º con respecto a la parte delantera del robot. Si uno de los sensores recibe una intensidad mayor que el otro,se activa el comportamiento que permite al robot girar hacia el lado donde mas intensidad de luz hay. No es necesario calibrar nada cuando ejecutamos este apartado ya que usamos el método getNormalizedLightValue().



- Comportamiento ir hacia la luz evitando obstáculos.

     Este apartado es una combinación de los anteriores ya que debe ir hacia la luz evitando  los obstáculos que haya en su camino. Para la evitación de obstáculos se nos da a elegir entre usar el sensor de contacto o el de ultrasonido, pero nosotros hemos realizado una prueba con cada uno de los sensores.
Como dijimos al inicio del blog, en este práctica, aunque no sea obligatorio, se nos recomendaba usar comportamientos. Y ahora, este apartado destaca por su sencillez y gran simplificación ya que es únicamente una combinación del comportamiento SeguirLuz del apartado anterior, Esquivar con el sensor de ultrasonido del segundo apartado y Esquivar con el sensor de contacto. Si no hubiéramos usado la programación de comportamientos nos hubiera llevado el doble de tiempo y esfuerzo.


Luz + sensor de contacto         


       
Luz + sensor de ultrasonidos

 


Así son las cosas y así se las hemos contado.