Saltar a contenido

Control de la navegación por el LLM (Capa 3)

Análisis de todo lo que un LLM podría controlar en la navegación del robocar, agrupado en dos familias: cómo se mueve (velocidad y estilo) y dónde/por dónde va (la ruta y sus restricciones). Es el catálogo de "mandos" que expondremos al modelo en la Capa 3, sobre Nav2.

Estado (leyenda): ✅ ya implementado · ⚙️ activo o exponible (falta sacarlo al contrato) · 🔨 requiere montar algo · 🔬 avanzado.

El contrato base ya existe: /nav_config (get autodescrito) + /nav_config/set, con 8 parámetros hoy: velocidad, marcha_atras, radio_giro_min, tolerancia_objetivo, margen_seguridad, orientacion_final, distancia_paredes (tendencia al centro), suavidad. Ampliarlo es "más de lo mismo".


A) Velocidad — que NO sea constante

La idea: rápido en rectas, lento en curvas, prudente cerca de obstáculos, despacio en ciertas zonas.

Palanca Qué hace Nav2 Estado Control LLM
Velocidad base crucero en recto FollowPath.desired_linear_vel ✅ "ve más rápido/lento"
Frenar en curvas baja según lo cerrada que sea la curva (regulated scaling de RPP) regulated_linear_scaling_min_radius / _min_speed ✅ expuesto (frenar_en_curvas, velocidad_min_curva) "frena más en las curvas"
Frenar cerca de obstáculos reduce al aproximarse a algo RPP cost-regulated (use_cost_regulated…, cost_scaling_dist) ✅ expuesto (frenar_obstaculos, dist_frenado_obstaculo) "sé prudente cerca de cosas"
Aceleración / suavidad cómo de brusco acelera/frena nav2_velocity_smoother 🔨 (añadir nodo) — siguiente "arranca/para suave"
Frenar al llegar reduce al aproximarse al destino approach_velocity_scaling_dist ⚙️ ya —
Suavidad de trazado ceñido vs cómodo lookahead_dist ✅ (suavidad) "conduce más suave"
Límite de velocidad por ZONA / global "en la cocina, despacio" SpeedFilter + topic /speed_limit 🔨 mecanismo nuevo muy potente: "en el pasillo al 30%"

Nota clave: "más rápido en rectas, lento en curvas" ya ocurre — RPP regula la velocidad con la curvatura del camino, y ahora el LLM ajusta cuánto frena en curva (frenar_en_curvas + velocidad_min_curva) y cuánto cerca de obstáculos (frenar_obstaculos + dist_frenado_obstaculo), todo en caliente. Verificado en banco (20-ago): mismo arco, frenado fuerte da vx media 0.31 m/s vs suave 0.44 m/s (Δ 0.12), llegando al destino en ambos. Falta la aceleración/suavidad (velocity_smoother, nodo nuevo) y los límites por zona (SpeedFilter, máscaras).


B) Condicionar la ruta — dónde y por dónde

Palanca Qué hace Nav2 Estado Control LLM
Pasar por puntos intermedios lista ordenada de poses NavigateThroughPoses (navigator ya configurado) 🔨 "ve a la cocina pasando por el salón"
Zonas prohibidas (keepout) máscara de "no entres aquí" KeepoutFilter (costmap filter + mask) 🔨 "no entres al dormitorio"
Zonas de velocidad máscara de límite por área SpeedFilter (= arriba) 🔨 "en el baño ve despacio"
Pegado a pared vs centro ceñirse a paredes o buscar el centro cost_penalty (Smac) + inflation cost_scaling_factor ⚙️ ya parcial (distancia_paredes) "ve pegado a la pared / por el centro"
Orientación de llegada llegar mirando a una dirección xy/yaw_goal_tolerance ✅ (orientacion_final) "aparca mirando a la puerta"
Estilo de ruta suave/directa, evitar reversa Smac reverse_penalty / change_penalty / non_straight_penalty ⚙️ exponible "ruta más directa", "evita marcha atrás"
Carriles / rutas preferidas seguir un grafo de rutas definido nav2_route (ya instalado) 🔬 avanzado "ve por el pasillo central"
Modo de comportamiento cauto vs rápido, con/sin recuperación árbol de comportamiento (BT) ⚙️ exponible (elegir BT) "sé cauteloso aquí"

Arquitectura de control para el LLM

Conviene distinguir dos vías, porque son mecanismos distintos:

  1. Parámetros de comportamiento ("cómo se mueve") → el contrato /nav_config (el que ya existe). El LLM lee las opciones (autodescritas) y escribe valores. Aquí entran: velocidad, frenos, aceleración, estilo de ruta, pegado/centro, orientación… Ampliarlo es barato.

  2. Especificación de tarea ("a dónde y con qué condiciones") → mensajes de objetivo más ricos:

  3. Un punto: /goal_pose (ya).
  4. Varios puntos en orden: NavigateThroughPoses → "pasa por X".
  5. Restricciones espaciales = "máscaras" que el LLM define: keepout (prohibido) y speed (lento). Es como los obstáculos que ya se pintan en la web, pero con semántica de zona.
LLM ──▶ /nav_config/set              (comportamiento: velocidad, frenos, estilo…)
LLM ──▶ /goal_pose | ThroughPoses    (a dónde, por dónde)
LLM ──▶ máscaras keepout / speed     (zonas prohibidas / lentas)

Cuando se monte el MCP (Capa 3), cada bloque se envuelve en una tool: set_nav_config(...), navigate_to(place), navigate_through(places), set_zone(area, keepout|slow). La resolución semántica ("la cocina" → coordenada) es la pieza de la Capa 2 (SQLite lugar→pose).


Hoja de ruta propuesta (de más valor / menos esfuerzo a más avanzado)

  1. Ampliar /nav_config con velocidad adaptativa. ✅ HECHO (20-ago): frenar_en_curvas, velocidad_min_curva, frenar_obstaculos, dist_frenado_obstaculo (todo en caliente, verificado). Pendiente del mismo bloque: aceleracion (velocity_smoother, nodo nuevo) y estilo_ruta (penalties de Smac, requiere reinicio). Siguiente: velocity_smoother.
  2. NavigateThroughPoses ("pasa por…") + exponerlo en la web y como tool.
  3. Zonas keepout + speed (máscaras): "no entres aquí" / "aquí despacio". Muy visual en la web (como los obstáculos) y muy potente para el LLM.
  4. Estilo pegado/centro fino y carriles (nav2_route) — avanzado, para el final.

Avisos

  • Muchas palancas de Smac (planner) NO son seguras en caliente (cuelgan el planner) → van por reescribir yaml + reinicio (ya resuelto en nav_config para marcha_atras/radio_giro).
  • La Pi4 va justa con todo el stack; añadir nodos (velocity_smoother, filtros) hay que vigilarlo.
  • Ver también: Roadmap (Capa 2/3) y De cero: nodos, topics, TF y Nav2.