jueves, 17 de marzo de 2011

Práctica 4 - Controlador PID

Antes de utilizar los tres controladores juntos,  hemos probado el controlador P e I juntos para ver cómo se iba a comportar nuestro robot.

Hemos empezado con las dos constantes con valores parecidos:
kp=10 ki=10


Como se puede ver la reacción es bastante "brusca" y oscila demasiado. Tras ver que el valor de la constante de I es muy "grande" hemos decidido ponerle en 1:
kp=10 ki=1


Y por último hemos utilizado los tres controladores juntos. En resumen habíamos visto que el proporcional tenía que tener un valor medio-alto (respecto a los valores que habíamos probado) y que si le añadíamos el controlador D, este iba a suavizar las oscilaciones del P por tanto tenían que estar relacionados sus valores. El controlador I es el que menos habíamos probado por tanto no sabíamos cómo se iba a comportar junto al controlador D.

Al igual que cuando probamos el controlador PI, hemos dejado la constante kI con un valor de 10 para ver cómo se iba a comportar.

kp=20, d=20, i=10


Nos hemos encontrado en el mismo caso que anteriormente con el controlador I, así que le hemos dejado con el menor valor que podíamos darle y con el que mejor se comportaba en conjunto, 1.

Tras ajustar el valor de la constante kI, hemos aumentando ligeramente la constante kD para que no fuese demasiado brusco ya que no nos gustaba cómo había quedado. Finalmente el controlador PID si que es capaz de mantener el robot en equilibrio sin desplazarse demasiado por culpa del peso siendo capaz de recuperarse solo. El resultado final es el siguiente:






FINAL


Práctica 4 - Controlador PD

En este caso el controlador D ayuda a que el controlador P haga que el robot oscile demasiado, es decir, suaviza el movimiento del robot. Aun así, no nos ha sido suficiente cuando hay mucho peso hacia un lado, de tal forma que no se puede recuperar al igual que nos pasaba con el controlador P.

Resultados del controlador PD:

kP = 10 kD = 10
Suave

kP = 10 kD = 20
Mucho más suave

kP = 20 kD = 10
Se acerca más al comportamiento del controlador P en solitario, pero menos brusco.

Práctica 4 - Controlador P

Hemos decidido ir probando poco a poco y por separado los controladores e ir añadiendo uno a uno para ir ajustándolos y ver los cambios en el comportamiento del robot.

Para empezar hemos utilizado solo el controlador proporcional, con una kp = 1. Como era de esperar el resultado no ha sido demasiado bueno.

kp=1;

kp=10;

kp=20;


En resumen, cuando utilizamos solo el controlador P, para valores de la constante altas oscila mucho, sin embargo cuanto más baja es esta constante menos oscila. El problema de utilizar solo este controlador es que cuando el peso se va mucho hacia un lado (o la luz se separa mucho del suelo) no es capaz de recuperarse.

Práctica 4 - Inicio con el SegWay

Hemos empezado buscando un diseño adecuado para nuestra práctica. Tras mirar algunos videos en youtube, hemos encontrado uno que hos ha gustado:


Desde el vídeo nos redirigen a un pequeño manual de cómo construirlo (link).

Tras tener el montaje hecho, hemos empezado a pensar cómo hacer nuestro SegWay. Finalmente, hemos hecho un bucle de la siguiente forma:

Calibrar();
loop
      Leer valor del sensor de luz ();
      Calcular PID ();
      Mover el robot ();
end loop;
Calibrar():
       Para calibrar lo que haremos es situar el robot en la posición 0 (a la que volverá
       siempre) y tras unos segundos leyendo valores, pulsamos "ENTER" para que
       haga la media de esos valores leídos, teniendo el valor medio del sensor de luz
       en esa posición.

Leer valor del sensor de luz ():
       Leerá el valor actual del sensor de luz

Calcular PID ():
       Llamará a tres funciones, calcularProporcional(), calcularDerivada() y calcularIntegral().
       La función calcular PID () nos devolverá el valor del pid, que será el siguiente:

              pid = Kp * proporcional + Kd * derivada + Ki * integral

       De tal forma que cuando queramos probar el segway con uno o varios controladores,
       el valor de las constante del controlador que no queramos utilizar tendrá el valor 0.

Mover el robot():
       Ajustaremos la velocidad del motor con el valor del PID, de tal forma que cuanto más
       alto sea el PID, más velocidad tendrán los motores. Para ello utilizamos el valor
       absoluto del PID y lo metemos en "setSpeed".
       Por último, para si el pid es positivo o negativo los motores irán hacia delante o atrás.

En las siguientes entradas comentaremos las pruebas que hemos ido haciendo con las distintas combinaciones de los controladores y sus constantes.

miércoles, 9 de marzo de 2011

Práctica 3 - Comportamiento ir hacia la luz


En este ejercicio vamos a utilizar dos sensores de luz, situados cada uno en un lateral a unos 45 grados aproximadamente.

En resumen nuestro robot, cuando no encuentra diferencia de luz entre los dos sensores, irá hacia delante. Para que la clase "BuscaLuz" tome el control, hemos hecho una resta de los valores que toman los dos sensores y tomando el valor absoluto de la resta, si es mayor de un rango, devolverá un valor verdadero, en caso contrario continuará andando hacia delante.





Nada más arrancar el programa calibramos los sensores mirando hacia la luz con calibrateHigh( ), esperando a que pulsemos un botón. Tras ser pulsado el botón, se quedará esperando a que pulsemos de nuevo para hacer el calibrateLow( ) esta vez con la luz ambiente. Una vez terminada la calibración hará lo explicado anteriormente.

Hemos tenido algún que otro problema al calibrarlos ya que muchas veces no conseguíamos que tuviese los valores deseados, pero sobre todo hemos tenido problemas con la diferencia de medición de los dos sensores, que no nos han facilitado para nada el trabajo.

Y hasta aquí ha llegado nuestra práctica tres, ya que debido a los problemas que hemos tenido en el ejercicio de campo de fuerzas virtuales no nos ha dado tiempo ni a hacer un sigue luz evitando obstáculos con el sensor de contacto.

Hoy hemos empezado con la práctica cuatro, segway, peleándonos con el diseño del robot. Esperemos (no tenemos fé) que esta no nos de tanto trabajo!

Práctica 3 - Evitando obstáculos utilizando el sensor de sonido

Para este ejercicio hemos tomado como referencia el horizonte, es decir, nuestra coordenada "X" actual, será también la de la meta. La coordenada "Y" de la meta está a una distancia lejana. Por tanto cada vez que nuestro robot se encuentre un obstáculo cercano lo evitará, orientándose de nuevo en la posición que empezó para seguir a su objetivo.

Este ejercicio sin duda es el que más "guerra" nos ha dado, llevándose las dos semanas de la práctica casi en su totalidad. Entre los problemas de calcular los puntos "x" e "y" actuales, calcular los puntos y ángulos de los vectores de repulsión y corregir las divisiones entre 0.

En resumen, el programa hace lo siguiente:

Bucle
Toma 5 medidas (a -60, -30, 0, 30 y 60 grados respecto a la situación inicial del ultrasonido)
Si hay algún obstáculo, calcula la fuerza resultante (suma de la fuerza de atracción y la fuerza de repulsión) y gira hacia el vector resultante.
Recorre unos centímetros.
Fin del Bucle

Al final con los problemas que hemos tenido el día de hoy, no hemos podido grabar ningún vídeo. Esperamos que la siguiente práctica no nos la juegue como nos lo ha hecho este ejercicio.

Prácitica 3 - Rodeando obstáculos usando sensores de contacto

Este ejercicio consiste en utilizar el sensor de contacto, para que este nos indique cuando hemos dado con un obstáculo. Hemos utilizado dos sensores de contacto, uno lo situamos en el frontal izquierdo y otro en el derecho, así si se activa el sensor frontal izquierdo, evitaremos el obstáculo por el lado derecho y al contrario para el sensor derecho.

Hemos uilizado la definición de comportamientos que nos han facilitado en la práctica. A continuación vamos a describir las tres clases que hemos utilizado y los métodos que estas contienen:


> DriveForward: La finalidad de esta clase es que el robot ande hacia delante mientras no se encuentre un obstáculo
 -takecontrol: Devolverá siempre verdadero, es decir siempre que no haya un obstáculo, tomará el control.
 -action: Cuando este método sea llamado, indicará a los dos motores que avancen.
 -supress: Parará los motores cuando llegue la clase "pierda" el control.

> HitObstacle: Esta clase evitará el obstáculo rodeándolo
 -takecontrol: Comprueba si se ha activado alguno de los dos sensores, para tomar el control.
 -action: Cuando tome el control, retrocederá una distancia, y rodeará el obstáculo por la izquierda o por la derecha dependiendo de cuál de los dos sensores se haya activado.
 -supress: Las variables booleanas que nos ayudan a saber si se ha detectado un obstáculo pasarán a tener el valor falso.


> BumperCar: En esta clase tendremos el programa principal. Consta de la siguiente declaración
Behavior b1 = new DriveForward();
Behavior b2 = new HitObstacle();
Behavior [] bArray = {b1, b2};
Arbitrator arby = new Arbitrator(bArray);
arby.start(); 
Instanciamos nuestras clases DriveForward y HitObstacle e indicamos que HitObstacle tendrá preferencia sobre DriveForward, dandole el índice más alto en el array bArray.

La forma de evitar el obstáculo ha sido bastante sencilla, hemos retrocedido una distancia, girado 60º y utilizando la función steer, hemos hecho una curva al rededor del objeto. Cuando ha sido ya superado, hemos vuelto a girar 60º para dejarle en la misma orientación antes de encontrarse el obstáculo: