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.