jueves, 24 de marzo de 2011

Práctica 4 - Control PID: el robot equilibrista

Para la realización de ésta práctica comenzamos rediseñando el robot, para eso tras unos primeros diseños erróneos, ya que el robot quedaba demasiado desequilibrado, buscando un poco por internet y comparando algunos modelos segway utilizamos el mostrado en la imagen, que conseguía cierta estabilidad.


A continuación nos informamos un poco más sobre la estabilización mediante PID, para ello utilizamos el siguiente enlace de la wikipedia: http://es.wikipedia.org/wiki/Proporcional_integral_derivativo. Un vez comprendido el controlador PID pasamos a ponerlo en práctica en el código. Para ello utilizamos las siguientes formulas que definen cada componente PID:


   P=Medida_Actual-Posicion_Inicial;
I = I+P;
D = P-Error_Anterior;
PID = P*Kp+I*Ki+D*Kd;

El valor obtenido del PID, será el que definirá la velocidad de los motores, de forma que si el PID es positivo (el robot cae hacia adelante) el robot avanzará y si el PID es negativo (el robot cae hacia atrás) el    robot retrocederá. 
Según este comportamiento, realizamos pruebas para ajustar cada constante proporcional. Observando el comportamiento del robot al modificar estas constantes llegamos a la conclusión de que la constante proporcional debería tener una valor suficientemente relevante como para recoger el error actual, la proporcional integral debía tener valores muy pequeños ya que al ser el sumatorio de los errores aumentaba mucho la velocidad del motor, respecto a la constante proporcional derivativa decidimos ajustarla a valores muy altos, ya que al ser la diferencia entre el error actual y el error anterior si esta diferencia es mucha quiere decir que el robot estará muy desequilibrado por lo que necesitará una mayor velocidad y al contrario si la diferencia es pequeña significará que el robot esta relativamente equilibrado con lo que la velocidad no deberá aumentar en exceso. Así decidimos que la mejor configuración y la que mejor resultados nos dio es la siguiente: Kp=30, Ki=2,Kd=160.

A continuación mostramos el robot realizando el equilibrio:


y el siguiente muestra como vuelve a buscar el equilibrio tras desequilibrarle:


miércoles, 9 de marzo de 2011

Práctica 3 - Navegación local evitando obstáculos

Una nueva práctica, en la que en primer lugar tuvimos que modificar el diseño del robot ya que necesitábamos hacer uso de dos sensores de luz y acoplar un motor para que el sensor de ultrasonido pueda girar.




Para ésta práctica utilizamos los métodos para programar comportamientos que proporciona Lejos, gracias a estos métodos se simplifican bastante la realización de los enunciados, además de ser más legibles.


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

     Para éste ejercicio no tuvimos ningún problema, nos llevo algo de tiempo ajustar los giros que debíamos ejecutar para que el robot quedara en la misma posición con la que llegaba al objeto. Para ello primero realizamos un giro prácticamente sobre si mismo, hacemos que avance durante unos centímetros, realizamos otro giro,avanzamos hasta dejar atrás el obstáculo y realizamos los mismos giros anteriores pero a la inversa. De esta forma recuperamos la posición inicial.



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


Este ejercicio es el que más esfuerzo nos ha llevado, ya que previamente tuvimos que realizar algunos cálculo para definir las fórmulas por las que se regirá el movimiento del robot al encontrarse algún obstáculo. Una vez definidas estas fórmulas el código simplemente realiza estos cálculos y ejecuta el giro oportuno para evitar el obstáculo.
La fuerza atractiva la fijamos en la distancia que obtenemos del sensor de ultrasonido para la componente x. Esta fuerza la multiplicamos por una constante = 3 para que la fuerza atractiva sea lo suficientemente grande como para que la fuerza resultante posterior siga el sentido fijado, en este caso hacia delante del robot. La componente y la fijamos a cero para que la fuerza atractiva siga siempre la dirección del robot.
Para calcular la fuerza repulsiva multiplicamos tanto la componente x como la componente y por la inversa de la distancia, para que de esta forma para distancias cortas crezca rápidamente y para distancias largas esta sea muy pequeña. Luego las multiplicamos por una constante BETA = 2000, para que las componentes sean lo suficientemente grandes, y el movimiento del robot se vea afectado.


FrX=cos(degree)*(1/d)*BETA
FrY=sin(degree)*(1/d)*BETA


Una vez calculados estos datos, realizamos la suma vectorial, con la que obtenemos los grados a los que deberá girar el robot para evitar el obstáculo.


Comportamiento ir hacia la luz:


El problema de este ejercicio consistía en ajustar un rango entre ambas mediciones de los sensores de luz para que el robot pueda ir hacia delante cuando este dentro de este rango y en caso contrario girar hacia el sensor que tenga más intensidad de luz. En primer lugar calibramos los sensores para que tome la intensidad de luz ambiente como el 0%.


Comportamiento ir hacia la luz evitando obstáculos:


En este ejercicio decidimos usar el método de evitación de obstáculos utilizando sensores. El ejercicio no es más que la combinación de las clases del ejercicio 1 y el 3. En este caso, el comportamiento más prioritario es el de evitar obstáculo, de forma que en el momento que lo detecte lo evite y posteriormente continúe siguiendo a la luz.