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:
- El lidar (/scan): mide distancias a las paredes 360° a su alrededor.
- La odometría (odom→base_link): dice cuánto se ha movido el robot entre escaneo y escaneo, para saber desde dónde mira cada barrido.
- Cartographer: junta ambos, encaja los escaneos (scan-matching) y va cosiendo submapas en un mapa global.
La sesión de mapeo, paso a paso
- Arrancar la pila mínima: odometría (TF), lidar (/scan) y Cartographer en modo mapeo.
- Conducir el robot despacio (teleop) recorriendo todo el espacio: pasillos, esquinas, cada habitación.
- Cartographer mantiene la pose en tiempo real (scan-matching local) y acumula los barridos en submapas.
- Cerrar bucles: volver a sitios ya vistos. Al reconocerlos, Cartographer corrige de golpe la deriva acumulada y cuadra el mapa.
- Comprobar la cobertura: que no queden huecos desconocidos donde luego haya que navegar.
- Guardar el mapa con map_saver → mapa.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
- Odometría sólida primero (Capa 0): cuanto mejor sea, menos trabajo de corrección y mejor mapa.
- Velocidad baja y giros suaves: los movimientos bruscos emborronan el scan-matching.
- Resolución moderada (~5 cm) y optimización global contenida: en una Pi, agresividad = pérdida de tiempo real.
- Cubrir de verdad: lo que no se ve queda desconocido, y ahí Nav2 no planificará.
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
- El /scan detecta algo que no está en el mapa; la capa de obstáculos marca esas celdas como ocupadas en el costmap local.
- El inflado añade un colchón alrededor: el robot tratará esa zona (y su margen) como intransitable.
- El controlador local (TEB) recalcula una trayectoria que sigue la ruta global pero rodea las celdas ocupadas del costmap local.
- Si el obstáculo bloquea del todo la ruta, el planificador global replanifica un desvío por otro camino del mapa.
- Cuando el obstáculo se va, el ray-casting limpia las celdas que el láser vuelve a atravesar: el costmap se despeja solo.
- 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
- Lidar (/scan): fuente principal. Ve 360° en un plano; alimenta la capa de obstáculos.
- Ultrasonidos (/ultrasound_data, del distance_node): corto alcance, cubren lo que el plano del lidar no ve (objetos bajos/altos) y disparan parada de emergencia.
- Mapa + costmaps + TEB: la parte de Capa 2 (Navegación), que convierte todo eso en un /cmd_vel seguro.
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.