La práctica la entregué el lunes pasado, pero hasta hoy no me había dado cuenta que no tengo nada en el blog acerca de los detalles de la lógica de decisión que actúa sobre el algoritmo de navegación de nuestro Fernando Robonso y su fórmula R.
Toda la lógica de navegación gira en torno a dos cálculos:
- Campo de fuerzas virtuales (VFF - virtual force field): todo objeto alrededor del robot ejercerá una fuerza contra él que lo repelerá, evitando el obstáculo.
- Pasillo de seguridad: el robot sólo avanzará si frente a él hay un pasillo lo suficientemente ancho para pasar.
La unión de ambos cálculos conformará la lógica de decisión que decidirá en qué dirección debe girar el robot basándose en las fuerzas repulsivas que recibe y a qué velocidad avanza teniendo en cuenta la longitud del pasillo que tiene frente a él.
La lógica de decisión está implementada en una máquina de estados finita que está compuesta de tres estados:
- Estado "normal": Es aquél en el que el robot gira dependiendo de hacia dónde apunta el vector que forman las fuerzas de repulsión y la fuerza de atracción que siente del siguiente punto de control.
- Estado "rechazo": Es el estado en el que entra el robot al encontrarse con fuerzas frontales que le impiden avanzar normalmente hacia el objetivo. El robot procurará "rodear" el obstáculo dejando las fuerzas de repulsión a un lado en vez de detrás ignorando completamente el vector de atracción del punto de control.
- Estado de "estrechez": Es un estado especial en el que el robot reduce al mínimo su umbral del campo de fuerzas virtual de repulsión para que no oscile dentro de pasillos estrechos ni salte la repulsión dentro de él.
Quizá lo más complicado es ajustar los valores de los parámetros internos para "afinar" la navegación y ajustar los umbrales a los que el robot pasa de un estado a otro.
Durante todas las pruebas que he estado realizando he probado múltiples combinaciones (no todas de ellas se reflejan en el código final) y al final he implementado algunas mejoras secundarias para mejorar la navegación del robot.
Defensa de la calidad de la práctica:
- No se chocará nunca con un objeto frente al robot: Aunque el robot se dirija a gran velocidad hacia una esquina pequeña, cualquier objeto dentro del pasillo de seguridad hará que el robot reduzca la velocidad, evitando choques accidentales.
- No se chocará con un objeto lateral: debido al umbral crítico no se permitirá permanecer ningún objeto dentro del área que necesita el robot para maniobrar de modo que si el obstáculo no se mueve el robot no chocará contra él cuando gire en su sentido. En caso de que un objeto penetre el margen de crítico el robot dejará de moverse y entrará en estado de rechazo, evitando acercarse más al objeto debido a que el robot no se moverá hasta que pierda de vista el obstáculo que ha violado el espacio crítico.
- No chocará contra el fondo de un pasillo sin salida: debido al margen crítico y de seguridad, el robot no avanzará hacia el fondo de un pasillo sin salida e intentará salir de él a través del estado de repulsión a no ser que el camino de salida sea largo.
- Pasillos estrechos: el estado "estrechez" permite al robot pasar entre dos objetos que le dejen poco espacio para maniobrar, sin embargo como efecto secundario de los márgenes de seguridad y críticos el tamaño del pasillo mínimo es más elevado que en otras implementaciones precisamente por seguridad en la maniobra. Es decir, como el robot necesita un margen lateral más elevado para permitir que el "culo" no choque contra objetos mientras gira ésto limita el ancho del pasillo que considera el robot seguro para pasar.