Integración en Robotics Infraestructure y nodo BFS con Nav2
Durante estas semanas he trabajado en dos líneas principales dentro del proyecto:
- Integración del mundo del almacén y el modelo del rover en el repositorio de Robotics Infrastructure.
- Desarrollo de un nodo de exploración basado en BFS utilizando Nav2 como sistema de navegación.
Integración en Robotics Infrastructure
La primera tarea consistió en integrar correctamente el mundo del almacén junto con el modelo del rover en el repositorio principal de Robotics Infrastructure.
Para ello fue necesario:
- Adaptar las rutas de los recursos del URDF del robot (mallas, sensores y plugins).
- Ajustar las rutas del mundo del almacén (estanterías, pallets y demás elementos).
- Unificar correctamente los paths de recursos para que Gazebo resolviera todo sin errores.
- Modificar el archivo launch encargado de lanzar simultáneamente el robot y el mundo.
Nodo de exploración BFS con Nav2
La segunda parte del trabajo consistió en desarrollar un nodo de exploración basado en BFS (Breadth-First Search) utilizando Nav2 como sistema de navegación.
El objetivo del nodo es explorar completamente el almacén para generar un mapa de segmentos consistente.
El nodo implementa internamente un mapa tipo occupancy grid que se actualiza a partir de los datos del sensor láser.
Cada celda del mapa puede encontrarse en uno de los siguientes estados:
- Celda libre: cuando un rayo del láser atraviesa esa posición sin detectar obstáculo.
- Celda ocupada: cuando el láser detecta un impacto en esa posición.
- Celda desconocida: aquellas posiciones que aún no han sido observadas.
- Celda frontera: celda libre que tiene al menos una celda vecina en estado desconocido.
El flujo general del algoritmo es el siguiente:
- Construcción y actualización del occupancy grid.
- Clasificación de celdas en libres, ocupadas o desconocidas.
- Detección de celdas frontera.
- Aplicación de BFS sobre las celdas libres alcanzables desde la posición actual del robot.
- Selección de una frontera válida como objetivo.
- Envío del objetivo a Nav2 mediante NavigateToPose.
Aunque el nodo generaba correctamente los objetivos frontera, la parte de navegación no resultó estable.
El comportamiento observado fue:
- El robot recibía el goal correctamente.
- Comenzaba a rotar sobre sí mismo.
- No avanzaba hacia el objetivo.
- Finalmente, Nav2 abortaba la navegación.
Esto indica que el problema no estaba en la generación del objetivo mediante BFS, sino en la ejecución del movimiento dentro del stack de navegación.
Próximo paso: navegación propia basada en BFS
Dado que la generación de objetivos funciona correctamente, el siguiente objetivo es desarrollar un algoritmo de navegación propio y sencillo para completar el nodo de exploración.
La idea es desacoplar la generación de la ruta del sistema Nav2 y simplificar el control del movimiento.
La idea sería:
- Mantener el occupancy grid propio.
- Aplicar BFS no solo para encontrar la frontera, sino para generar la secuencia completa de celdas desde la posición actual hasta el objetivo.
- Convertir esas celdas en una lista ordenada de puntos en coordenadas del mundo.
- Implementar un controlador básico que:
- Seleccione el siguiente punto visible.
- Gire el robot hasta alinearlo con ese punto.
- Avance linealmente.
- Repita el proceso hasta completar la ruta.
Este enfoque permitirá tener control total del proceso de navegación y simplificar la arquitectura.