Este comportamiento de choca-gira es bastante sencillo y consiste en hacer que el robot navegue por el entorno de forma "aleatoria" y si detecta algún obstáculo cambiar el rumbo para evitar chocar con él.
Para llevar a cabo este comportamiento se ha optado por hacer un diseño basado en autómatas de estado finito siguiendo el siguiente modelo:
Este autómata está constituido por tres estados y la transición de uno a otro se produce si se cumplen una serie de condiciones:
- GO_AHEAD: en este estado el robot se moverá hacia delante con una velocidad lineal determinada. En cada iteración se comprobarán las medidas obtenidas con el láser (en concreto las correspondientes a las medidas de los ángulos 45, 90 y 135) y si se observa que hay un obstáculo demasiado cerca el robot se detendrá y se pasará al estado GO_BACK.
- GO_BACK: el robot retrocerá hasta que determine que la distancia al obstáculo u obstáculos es la suficiente para pasar al estado ROTATE.
- ROTATE: en este estado el robot esperará a estar parado antes de iniciar un giro sobre sí mismo en un sentido elegido al azar utilizando una función psudoaleatoria. Esto nos asegurará que el robot no gira a la vez que está retrocediendo debido a la inercia del estado GO_BACK y evitar de este modo un posible choque. Una vez parado, girará hasta determinar que no hay obstáculos en un cierto perímetro (utilizando para ello las medidas de los ángulos 45, 90 y 135 del láser) y pasará al estado GO_AHEAD.
Parametrización
Todo lo comentado anteriormente está debidamente parametrizado para poder ajustar los parámetros afinando el comportamiento del robot. Los parámetros más importantes y los valores que toman son los siguientes:
- Velocidad lineal en GO_AHEAD: v=200 mm/s.
- Velocidad lineal en GO_BACK: v=100 mm/s.
- Velocidad angular en ROTATE: w=15 deg/s.
- Distancia al obstáculo en la que el robot pasa del estado GO_AHEAD a GO_BACK: <1000 mm (medida en 45, 90 ó 135 grados).
- Distancia al obstáculo en la que el robot pasa del etado GO_BACK a ROTATE: >1000mm (medida en 45, 90 ó 135 grados).
- Distancia al obstáculo en al que el robot pasa del estado ROTATE a GO_AHEAD: >1300 mm (medida en 45, 90 y 135 grados)
A tener en cuenta...
- Inercia: el robot no responde de forma instantánea cuando comandamos los motores de las ruedas. Por ejemplo si el robot lleva una velocidad lineal de 200 mm/s y le decimos que se detenga (v=0), el robot no se detendrá hasta pasado un tiempo, ya que tiene que iniciar un proceso de frenado en el que irá disminuyendo la velocidad hasta detenerse. Es importante tener en cuenta que el tiempo de frenado depende de muchos factores y no es predecible, con lo que tendremos que parametrizar debidamente los comportamientos para evitar situaciones problemáticas como chocarse.