Robocar · TFM · Fundamentos

Construir el mapa, y esquivar lo que no está en él

Dos caras del mismo entorno: primero se levanta un plano estático del sitio; luego, en marcha, el robot reacciona a lo que aparece y que ningún plano previó — una persona, una caja, una silla que alguien movió.

CAP · I

Cómo construir un mapa

Mapear es recorrer el espacio una vez, con calma, para que el robot se fabrique un plano que después reutilizará mil veces para localizarse y navegar. El resultado es un fichero estático; el proceso es una sesión de conducción guiada.

¿Qué es "el mapa"? nav_msgs/OccupancyGrid

Una rejilla de ocupación: el suelo se divide en celdas de tamaño fijo (p. ej. 5 cm) y cada una guarda una probabilidad de estar ocupada. En la práctica, tres estados:

Libre  el láser lo atravesó: se puede circular
Ocupado  el láser chocó: pared u objeto
Desconocido  nunca se vio: sin explorar

Se guarda como una imagen (.pgm) más un .yaml con los metadatos: resolución, origen y umbrales. Eso es todo el "mapa".

Los ingredientes

El SLAM no inventa el mapa de la nada; necesita dos entradas sincronizadas por el árbol TF:

La sesión de mapeo, paso a paso

  1. Arrancar la pila mínima: odometría (TF), lidar (/scan) y Cartographer en modo mapeo.
  2. Conducir el robot despacio (teleop) recorriendo todo el espacio: pasillos, esquinas, cada habitación.
  3. Cartographer mantiene la pose en tiempo real (scan-matching local) y acumula los barridos en submapas.
  4. Cerrar bucles: volver a sitios ya vistos. Al reconocerlos, Cartographer corrige de golpe la deriva acumulada y cuadra el mapa.
  5. Comprobar la cobertura: que no queden huecos desconocidos donde luego haya que navegar.
  6. Guardar el mapa con map_savermapa.pgm + mapa.yaml. Listo para navegación.
La clave: cierre de bucleLa deriva es inevitable mientras mapeas: pequeños errores de odometría y de encaje se van sumando, y un pasillo largo acaba "torcido". El loop closure es el antídoto: cuando el robot detecta que ha vuelto a un lugar conocido, reoptimiza toda la trayectoria y reparte el error. Por eso una buena sesión de mapeo traza lazos y regresa al punto de partida, en vez de ir y volver en línea recta.

Buenas prácticas en la Raspberry Pi

CAP · II

Evitar obstáculos no incluidos en el mapa

El mapa estático congela el mundo tal como estaba el día del mapeo: paredes, muebles fijos. Pero el mundo real se mueve — aparecen personas, cajas, una puerta que se cierra. El robot no puede fiarse solo del plano: tiene que ver y reaccionar en vivo.

La herramienta: los costmaps

Nav2 no navega sobre el mapa "crudo", sino sobre mapas de coste que mezclan lo conocido con lo que los sensores detectan ahora. Hay dos:

Costmap global
Cubre todo el mapa. Base para planificar la ruta larga hasta el destino. Se apoya sobre todo en el mapa estático.
Costmap local
Una ventana pequeña que rueda con el robot, refrescada a cada instante con el /scan. Aquí es donde aparecen los obstáculos nuevos.

Cómo se apila la información capas del costmap

STATICCapa estática — el mapaLas paredes y muebles fijos que se mapearon en el Cap. I.
OBSTACLECapa de obstáculos — sensores en vivoEl /scan (y los ultrasonidos) marcan como ocupadas celdas que NO están en el mapa: lo nuevo y lo que se mueve.
INFLATIONCapa de inflado — margen de seguridadEngorda cada obstáculo con un halo de coste, para que el robot mantenga distancia y no roce.

Cómo se produce la evitación, paso a paso

  1. El /scan detecta algo que no está en el mapa; la capa de obstáculos marca esas celdas como ocupadas en el costmap local.
  2. El inflado añade un colchón alrededor: el robot tratará esa zona (y su margen) como intransitable.
  3. El controlador local (TEB) recalcula una trayectoria que sigue la ruta global pero rodea las celdas ocupadas del costmap local.
  4. Si el obstáculo bloquea del todo la ruta, el planificador global replanifica un desvío por otro camino del mapa.
  5. Cuando el obstáculo se va, el ray-casting limpia las celdas que el láser vuelve a atravesar: el costmap se despeja solo.
  6. Si el robot se queda atascado, entran los comportamientos de recuperación: limpiar el costmap, retroceder, esperar.
Matiz AckermannRobocar es un coche, no un robot que gira sobre sí mismo. No puede esquivar rotando en el sitio: el controlador TEB respeta el radio de giro mínimo y traza una curva de evitación suave. Ante un obstáculo muy cercano por delante, muchas veces la respuesta correcta no es esquivar sino frenar — y aquí ayudan sensores de corto alcance como los ultrasonidos.

Los sensores que lo hacen posible en robocar

La idea en una fraseEl mapa dice por dónde se puede ir en general; los sensores en vivo dicen qué ha cambiado ahora mismo. La navegación fusiona ambos en el costmap y decide cada instante la trayectoria que respeta las dos cosas.