# gaaldod/ros2_hybrid_astar_nav2 architecture

> Architecture diagram of the GitHub repository gaaldod/ros2_hybrid_astar_nav2, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-06-24). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/gaaldod/ros2_hybrid_astar_nav2
- Repository: https://github.com/gaaldod/ros2_hybrid_astar_nav2

## Overview

1. **What this repository is**
   - `hybrid_astar_planner` is a ROS 2 Humble package that integrates a Python Hybrid A* global planner with Nav2, a delivery/safety layer, and Gazebo Fortress simulation for an Ackermann-style robot.
   - The repo is organized around one end-to-end runtime pipeline: simulated sensors and localization in, planning and recovery logic in the middle, and a gated velocity command stream out to Gazebo.

2. **Core runtime boundary**
   - The architecture is ROS-centric: nodes communicate through topics, actions, TF, and a few service-style compatibility hooks.
   - Nav2 remains the high-level navigation framework, while this repo supplies custom planning, safety arbitration, obstacle tracking, and relocalization behavior around it.

3. **Global planning subsystem**
   - `hybrid_astar.py` contains the planning algorithm itself.
   - `planner_node.py` and `nav2_hybrid_astar_server.py` expose that planner to the Nav2 action flow and manage planner-specific runtime behavior such as live overlays, localization-jump guarding, and local takeover logic.
   - This subsystem is the main “brains” for route generation in map coordinates.

4. **Perception and obstacle abstraction**
   - `sensor_processor_node.py` filters raw lidar input from `/scan` into `/scan_filtered`.
   - `obstacle_tracker_node.py` turns sensed obstacles into tracked obstacles in the map frame, publishing both a structured obstacle stream and `tracked_obstacles_cloud`.
   - `grid_map.py` and `types.py` support the internal representation of occupancy, obstacle geometry, and planner-facing state.

5. **Local supervision and command shaping**
   - `local_planner_node.py` sits between perception and safety, using obstacle information and speed scaling to determine when navigation should slow down or stop.
   - It also asserts `nav_emergency_stop`, which is one of the upstream stop conditions for the final command gate.
   - This is the layer that translates “the path is becoming unsafe” into immediate operational constraints.

6. **Final safety gate**
   - `ackermann_safety_controller_node.py` is the last authority before motion commands reach the robot/simulator.
   - It takes `cmd_vel_nav` from Nav2/controller outputs and publishes `cmd_vel_safe` after applying emergency-stop arbitration, reverse/recovery handling, and front-collision protection.
   - In this repo, this node is the critical boundary between navigation intent and actual vehicle motion.

7. **Recovery and replanning support**
   - `reverse_recovery_node.py` handles reverse, stall, and collision-hint recovery behaviors.
   - `replan_watchdog_node.py` provides optional periodic or stall-triggered replanning hooks.
   - `motion_reason_listener.py` appears to be a diagnostic/observer node for understanding why motion decisions were made, which helps explain planner-to-recovery transitions during runtime.

8. **Localization and relocalization controls**
   - `anchor_frame_guard_node.py` watches for localization drift, can trigger `/initialpose` reseeding, and may republish the cached goal after reseed.
   - `initial_pose_seed_node.py` provides initial pose bootstrapping.
   - `odom_tf_bridge_node.py` helps bridge odometry into TF, while `tf_event_logger_node.py` records TF/clock/AMCL discontinuities for debugging localization jumps.
   - These nodes form the repo’s “keep localization sane” subsystem.

9. **Simulation and environment integration**
   - The primary simulation path is Gazebo Fortress, with world and model assets under `hybrid_astar_planner/sim`.
   - `sim/worlds/warehouse_lightweight_gz.sdf` and related models define the robot, warehouse, and moving obstacle environment.
   - `sim/bridge_minimal.yaml` bridges ROS topics to Gazebo transport, especially for the moving obstacle’s velocity and odometry.
   - `moving_obstacle_driver_node.py` drives the simulated box obstacle by publishing velocity commands and reversing direction based on its odometry.

10. **Nav2 compatibility and launch composition**
   - `global_costmap_compat_node.py` exists as a no-op compatibility service for Nav2 behavior-tree expectations.
   - The launch files in `launch/` are the real composition layer: they assemble Gazebo, Nav2, the Hybrid A* server, the safety stack, obstacle driver, RViz, and delivery-specific nodes.
   - The current “source of truth” runtime is the Fortress + RPP path, especially `gz_modern_nav2_corner_test_withRPP.launch.py` and `delivery_stack.launch.py`.

11. **Maps, visualization, and operational tooling**
   - `maps/` contains the static warehouse map assets used by Nav2 and the planner.
   - `rviz/` provides preconfigured visualization layouts for planner and delivery debugging.
   - `scripts/` contains operator-facing helpers for goal sending, debug capture, self-tests, timing inspection, and start/stop orchestration.
   - These assets don’t change the architecture, but they define how the system is exercised and observed.

12. **Architectural data flow summary**
   - The main flow is: simulated lidar/odometry → scan filtering → obstacle tracking → planner/global route generation → controller output → safety gating → Gazebo motion.
   - A parallel control loop monitors TF/AMCL stability; if localization drifts, the anchor guard can stop motion, reseed pose, and restore the goal context.
   - The result is a layered navigation stack where planning, safety, recovery, and simulation transport are intentionally separated.

Main entry points: [`hybrid_astar_planner/hybrid_astar_planner/planner_node.py`](https://github.com/gaaldod/ros2_hybrid_astar_nav2/blob/main/hybrid_astar_planner/hybrid_astar_planner/planner_node.py) (Planner Node), [`hybrid_astar_planner/hybrid_astar_planner/obstacle_tracker_node.py`](https://github.com/gaaldod/ros2_hybrid_astar_nav2/blob/main/hybrid_astar_planner/hybrid_astar_planner/obstacle_tracker_node.py) (Obstacle Tracker), [`hybrid_astar_planner/launch/nav2_hybrid_astar_bringup.launch.py`](https://github.com/gaaldod/ros2_hybrid_astar_nav2/blob/main/hybrid_astar_planner/launch/nav2_hybrid_astar_bringup.launch.py) (Nav2 Bringup), [`hybrid_astar_planner/hybrid_astar_planner/hybrid_astar.py`](https://github.com/gaaldod/ros2_hybrid_astar_nav2/blob/main/hybrid_astar_planner/hybrid_astar_planner/hybrid_astar.py) (Hybrid A*)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_group_planning["Planning"]
  node_hybrid_astar{{"Hybrid A*<br/>planner core<br/>[hybrid_astar.py]"}}
  node_planner_node(("Planner Node<br/>ROS node<br/>[planner_node.py]"))
  node_nav2_hybrid_astar_server(("Nav2 Server<br/>ROS node"))
  node_global_costmap_compat_node(("Compat Hook<br/>ROS node"))
end

subgraph group_group_perception["Perception"]
  node_sensor_processor_node(("Scan Filter<br/>ROS node"))
  node_obstacle_tracker_node(("Obstacle Tracker<br/>ROS node"))
  node_grid_map["Grid Map<br/>map state<br/>[grid_map.py]"]
  node_types["Planner Types<br/>data model<br/>[types.py]"]
end

subgraph group_group_supervision["Supervision"]
  node_local_planner_node(("Local Planner<br/>ROS node"))
  node_ackermann_safety_controller_node(("Safety Gate<br/>ROS node"))
  node_reverse_recovery_node(("Reverse Recovery<br/>ROS node"))
  node_replan_watchdog_node(("Replan Watchdog<br/>ROS node"))
  node_motion_reason_listener(("Motion Observer<br/>ROS node"))
end

subgraph group_group_localization["Localization"]
  node_anchor_frame_guard_node(("Anchor Guard<br/>ROS node"))
  node_initial_pose_seed_node(("Pose Seed<br/>ROS node"))
  node_odom_tf_bridge_node(("Odom TF Bridge<br/>ROS node"))
  node_tf_event_logger_node(("TF Logger<br/>ROS node"))
end

subgraph group_group_simulation["Simulation"]
  node_moving_obstacle_driver_node(("Moving Obstacle<br/>ROS node"))
  node_warehouse_world["Warehouse World<br/>simulation asset"]
  node_bridge_minimal_yaml["ROS Bridge<br/>bridge config"]
end

subgraph group_group_launch["Launch"]
  node_delivery_stack_launch["Delivery Stack<br/>launch file"]
  node_gz_modern_nav2_corner_test_withrpp_launch["Fortress RPP<br/>launch file"]
  node_nav2_hybrid_astar_bringup_launch["Nav2 Bringup<br/>launch file"]
end

node_sensor_processor_node -->|"filtered scans"| node_obstacle_tracker_node
node_obstacle_tracker_node -->|"tracks into map"| node_grid_map
node_grid_map -->|"search space"| node_hybrid_astar
node_types -->|"state model"| node_hybrid_astar
node_hybrid_astar -->|"planned path"| node_planner_node
node_planner_node -->|"Nav2 action"| node_nav2_hybrid_astar_server
node_global_costmap_compat_node -->|"compat hook"| node_nav2_hybrid_astar_server
node_obstacle_tracker_node -->|"obstacles"| node_local_planner_node
node_local_planner_node -->|"stop hints"| node_ackermann_safety_controller_node
node_reverse_recovery_node -->|"recovery state"| node_ackermann_safety_controller_node
node_replan_watchdog_node -->|"replan trigger"| node_planner_node
node_motion_reason_listener -.->|"observes"| node_planner_node
node_anchor_frame_guard_node -->|"reseed"| node_initial_pose_seed_node
node_initial_pose_seed_node -->|"pose boot"| node_odom_tf_bridge_node
node_odom_tf_bridge_node -.->|"tf events"| node_tf_event_logger_node
node_tf_event_logger_node -.->|"drift signal"| node_anchor_frame_guard_node
node_warehouse_world -->|"sim obstacle"| node_moving_obstacle_driver_node
node_bridge_minimal_yaml -->|"transport"| node_moving_obstacle_driver_node
node_delivery_stack_launch -->|"includes"| node_warehouse_world
node_delivery_stack_launch -->|"includes"| node_nav2_hybrid_astar_bringup_launch
node_gz_modern_nav2_corner_test_withrpp_launch -->|"starts"| node_ackermann_safety_controller_node
node_gz_modern_nav2_corner_test_withrpp_launch -->|"starts"| node_planner_node
node_nav2_hybrid_astar_bringup_launch -->|"starts"| node_nav2_hybrid_astar_server
node_nav2_hybrid_astar_bringup_launch -->|"starts"| node_global_costmap_compat_node

click node_sensor_processor_node "https://github.com/gaaldod/ros2_hybrid_astar_nav2/blob/main/hybrid_astar_planner/hybrid_astar_planner/sensor_processor_node.py"
click node_obstacle_tracker_node "https://github.com/gaaldod/ros2_hybrid_astar_nav2/blob/main/hybrid_astar_planner/hybrid_astar_planner/obstacle_tracker_node.py"
click node_grid_map "https://github.com/gaaldod/ros2_hybrid_astar_nav2/blob/main/hybrid_astar_planner/hybrid_astar_planner/grid_map.py"
click node_types "https://github.com/gaaldod/ros2_hybrid_astar_nav2/blob/main/hybrid_astar_planner/hybrid_astar_planner/types.py"
click node_hybrid_astar "https://github.com/gaaldod/ros2_hybrid_astar_nav2/blob/main/hybrid_astar_planner/hybrid_astar_planner/hybrid_astar.py"
click node_planner_node "https://github.com/gaaldod/ros2_hybrid_astar_nav2/blob/main/hybrid_astar_planner/hybrid_astar_planner/planner_node.py"
click node_nav2_hybrid_astar_server "https://github.com/gaaldod/ros2_hybrid_astar_nav2/blob/main/hybrid_astar_planner/hybrid_astar_planner/nav2_hybrid_astar_server.py"
click node_local_planner_node "https://github.com/gaaldod/ros2_hybrid_astar_nav2/blob/main/hybrid_astar_planner/hybrid_astar_planner/local_planner_node.py"
click node_ackermann_safety_controller_node "https://github.com/gaaldod/ros2_hybrid_astar_nav2/blob/main/hybrid_astar_planner/hybrid_astar_planner/ackermann_safety_controller_node.py"
click node_reverse_recovery_node "https://github.com/gaaldod/ros2_hybrid_astar_nav2/blob/main/hybrid_astar_planner/hybrid_astar_planner/reverse_recovery_node.py"
click node_replan_watchdog_node "https://github.com/gaaldod/ros2_hybrid_astar_nav2/blob/main/hybrid_astar_planner/hybrid_astar_planner/replan_watchdog_node.py"
click node_motion_reason_listener "https://github.com/gaaldod/ros2_hybrid_astar_nav2/blob/main/hybrid_astar_planner/hybrid_astar_planner/motion_reason_listener.py"
click node_anchor_frame_guard_node "https://github.com/gaaldod/ros2_hybrid_astar_nav2/blob/main/hybrid_astar_planner/hybrid_astar_planner/anchor_frame_guard_node.py"
click node_initial_pose_seed_node "https://github.com/gaaldod/ros2_hybrid_astar_nav2/blob/main/hybrid_astar_planner/hybrid_astar_planner/initial_pose_seed_node.py"
click node_odom_tf_bridge_node "https://github.com/gaaldod/ros2_hybrid_astar_nav2/blob/main/hybrid_astar_planner/hybrid_astar_planner/odom_tf_bridge_node.py"
click node_tf_event_logger_node "https://github.com/gaaldod/ros2_hybrid_astar_nav2/blob/main/hybrid_astar_planner/hybrid_astar_planner/tf_event_logger_node.py"
click node_global_costmap_compat_node "https://github.com/gaaldod/ros2_hybrid_astar_nav2/blob/main/hybrid_astar_planner/hybrid_astar_planner/global_costmap_compat_node.py"
click node_moving_obstacle_driver_node "https://github.com/gaaldod/ros2_hybrid_astar_nav2/blob/main/hybrid_astar_planner/hybrid_astar_planner/moving_obstacle_driver_node.py"
click node_delivery_stack_launch "https://github.com/gaaldod/ros2_hybrid_astar_nav2/blob/main/hybrid_astar_planner/launch/delivery_stack.launch.py"
click node_gz_modern_nav2_corner_test_withrpp_launch "https://github.com/gaaldod/ros2_hybrid_astar_nav2/blob/main/hybrid_astar_planner/launch/gz_modern_nav2_corner_test_withRPP.launch.py"
click node_nav2_hybrid_astar_bringup_launch "https://github.com/gaaldod/ros2_hybrid_astar_nav2/blob/main/hybrid_astar_planner/launch/nav2_hybrid_astar_bringup.launch.py"
click node_warehouse_world "https://github.com/gaaldod/ros2_hybrid_astar_nav2/blob/main/hybrid_astar_planner/sim/worlds/warehouse_lightweight_gz.sdf"
click node_bridge_minimal_yaml "https://github.com/gaaldod/ros2_hybrid_astar_nav2/blob/main/hybrid_astar_planner/sim/bridge_minimal.yaml"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_hybrid_astar,node_planner_node,node_nav2_hybrid_astar_server,node_global_costmap_compat_node toneBlue
class node_sensor_processor_node,node_obstacle_tracker_node,node_grid_map,node_types toneAmber
class node_local_planner_node,node_ackermann_safety_controller_node,node_reverse_recovery_node,node_replan_watchdog_node,node_motion_reason_listener toneMint
class node_anchor_frame_guard_node,node_initial_pose_seed_node,node_odom_tf_bridge_node,node_tf_event_logger_node toneRose
class node_moving_obstacle_driver_node,node_warehouse_world,node_bridge_minimal_yaml toneIndigo
class node_delivery_stack_launch,node_gz_modern_nav2_corner_test_withrpp_launch,node_nav2_hybrid_astar_bringup_launch toneTeal
```

## Components

### Planning

Global route generation and Nav2 planner integration.

- [Hybrid A*](https://github.com/gaaldod/ros2_hybrid_astar_nav2/blob/main/hybrid_astar_planner/hybrid_astar_planner/hybrid_astar.py): planner core · Search and trajectory generation in map coordinates. · `hybrid_astar_planner/hybrid_astar_planner/hybrid_astar.py`
- [Planner Node](https://github.com/gaaldod/ros2_hybrid_astar_nav2/blob/main/hybrid_astar_planner/hybrid_astar_planner/planner_node.py): ROS node · Wraps the planner for runtime use and overlays/localization-jump handling. · `hybrid_astar_planner/hybrid_astar_planner/planner_node.py`
- [Nav2 Server](https://github.com/gaaldod/ros2_hybrid_astar_nav2/blob/main/hybrid_astar_planner/hybrid_astar_planner/nav2_hybrid_astar_server.py): ROS node · Exposes Hybrid A* through the Nav2 action/server flow. · `hybrid_astar_planner/hybrid_astar_planner/nav2_hybrid_astar_server.py`
- [Compat Hook](https://github.com/gaaldod/ros2_hybrid_astar_nav2/blob/main/hybrid_astar_planner/hybrid_astar_planner/global_costmap_compat_node.py): ROS node · No-op compatibility service for Nav2 behavior-tree expectations. · `hybrid_astar_planner/hybrid_astar_planner/global_costmap_compat_node.py`

### Perception

Scan filtering, obstacle tracking, and internal map state.

- [Scan Filter](https://github.com/gaaldod/ros2_hybrid_astar_nav2/blob/main/hybrid_astar_planner/hybrid_astar_planner/sensor_processor_node.py): ROS node · Filters raw lidar scans into a cleaner scan stream. · `hybrid_astar_planner/hybrid_astar_planner/sensor_processor_node.py`
- [Obstacle Tracker](https://github.com/gaaldod/ros2_hybrid_astar_nav2/blob/main/hybrid_astar_planner/hybrid_astar_planner/obstacle_tracker_node.py): ROS node · Tracks obstacles in map coordinates and publishes obstacle outputs. · `hybrid_astar_planner/hybrid_astar_planner/obstacle_tracker_node.py`
- [Grid Map](https://github.com/gaaldod/ros2_hybrid_astar_nav2/blob/main/hybrid_astar_planner/hybrid_astar_planner/grid_map.py): map state · Internal occupancy and obstacle-space representation used by the planner stack. · `hybrid_astar_planner/hybrid_astar_planner/grid_map.py`
- [Planner Types](https://github.com/gaaldod/ros2_hybrid_astar_nav2/blob/main/hybrid_astar_planner/hybrid_astar_planner/types.py): data model · Shared planner-facing types and geometry/state definitions. · `hybrid_astar_planner/hybrid_astar_planner/types.py`

### Supervision

Local slowing, recovery, replanning, and command gating.

- [Local Planner](https://github.com/gaaldod/ros2_hybrid_astar_nav2/blob/main/hybrid_astar_planner/hybrid_astar_planner/local_planner_node.py): ROS node · Turns obstacle and speed context into slow/stop constraints and emergency-stop requests. · `hybrid_astar_planner/hybrid_astar_planner/local_planner_node.py`
- [Safety Gate](https://github.com/gaaldod/ros2_hybrid_astar_nav2/blob/main/hybrid_astar_planner/hybrid_astar_planner/ackermann_safety_controller_node.py): ROS node · Last authority before motion commands; applies emergency-stop and collision protection. · `hybrid_astar_planner/hybrid_astar_planner/ackermann_safety_controller_node.py`
- [Reverse Recovery](https://github.com/gaaldod/ros2_hybrid_astar_nav2/blob/main/hybrid_astar_planner/hybrid_astar_planner/reverse_recovery_node.py): ROS node · Handles reverse, stall, and collision-hint recovery behavior. · `hybrid_astar_planner/hybrid_astar_planner/reverse_recovery_node.py`
- [Replan Watchdog](https://github.com/gaaldod/ros2_hybrid_astar_nav2/blob/main/hybrid_astar_planner/hybrid_astar_planner/replan_watchdog_node.py): ROS node · Triggers periodic or stall-based replanning hooks. · `hybrid_astar_planner/hybrid_astar_planner/replan_watchdog_node.py`
- [Motion Observer](https://github.com/gaaldod/ros2_hybrid_astar_nav2/blob/main/hybrid_astar_planner/hybrid_astar_planner/motion_reason_listener.py): ROS node · Observes and reports reasons behind motion decisions. · `hybrid_astar_planner/hybrid_astar_planner/motion_reason_listener.py`

### Localization

Pose, TF, and relocalization safeguards.

- [Anchor Guard](https://github.com/gaaldod/ros2_hybrid_astar_nav2/blob/main/hybrid_astar_planner/hybrid_astar_planner/anchor_frame_guard_node.py): ROS node · Detects localization drift and can reseed pose while preserving goal context. · `hybrid_astar_planner/hybrid_astar_planner/anchor_frame_guard_node.py`
- [Pose Seed](https://github.com/gaaldod/ros2_hybrid_astar_nav2/blob/main/hybrid_astar_planner/hybrid_astar_planner/initial_pose_seed_node.py): ROS node · Bootstraps the robot's initial pose. · `hybrid_astar_planner/hybrid_astar_planner/initial_pose_seed_node.py`
- [Odom TF Bridge](https://github.com/gaaldod/ros2_hybrid_astar_nav2/blob/main/hybrid_astar_planner/hybrid_astar_planner/odom_tf_bridge_node.py): ROS node · Bridges odometry into TF for the navigation stack. · `hybrid_astar_planner/hybrid_astar_planner/odom_tf_bridge_node.py`
- [TF Logger](https://github.com/gaaldod/ros2_hybrid_astar_nav2/blob/main/hybrid_astar_planner/hybrid_astar_planner/tf_event_logger_node.py): ROS node · Records TF, clock, and AMCL discontinuities for debugging. · `hybrid_astar_planner/hybrid_astar_planner/tf_event_logger_node.py`

### Simulation

Gazebo worlds, models, and bridge configuration.

- [Moving Obstacle](https://github.com/gaaldod/ros2_hybrid_astar_nav2/blob/main/hybrid_astar_planner/hybrid_astar_planner/moving_obstacle_driver_node.py): ROS node · Drives the simulated box obstacle with motion and reversal behavior. · `hybrid_astar_planner/hybrid_astar_planner/moving_obstacle_driver_node.py`
- [Warehouse World](https://github.com/gaaldod/ros2_hybrid_astar_nav2/blob/main/hybrid_astar_planner/sim/worlds/warehouse_lightweight_gz.sdf): simulation asset · Gazebo Fortress warehouse world and SDF environment. · `hybrid_astar_planner/sim/worlds/warehouse_lightweight_gz.sdf`
- [ROS Bridge](https://github.com/gaaldod/ros2_hybrid_astar_nav2/blob/main/hybrid_astar_planner/sim/bridge_minimal.yaml): bridge config · ROS-Gazebo topic bridge configuration for simulated transport. · `hybrid_astar_planner/sim/bridge_minimal.yaml`

### Launch

Composition entrypoints for different runtime setups.

- [Delivery Stack](https://github.com/gaaldod/ros2_hybrid_astar_nav2/blob/main/hybrid_astar_planner/launch/delivery_stack.launch.py): launch file · Composes Gazebo, Nav2, planner, safety, and delivery runtime nodes. · `hybrid_astar_planner/launch/delivery_stack.launch.py`
- [Fortress RPP](https://github.com/gaaldod/ros2_hybrid_astar_nav2/blob/main/hybrid_astar_planner/launch/gz_modern_nav2_corner_test_withRPP.launch.py): launch file · Primary modern Gazebo/Nav2 runtime composition for corner testing with RPP. · `hybrid_astar_planner/launch/gz_modern_nav2_corner_test_withRPP.launch.py`
- [Nav2 Bringup](https://github.com/gaaldod/ros2_hybrid_astar_nav2/blob/main/hybrid_astar_planner/launch/nav2_hybrid_astar_bringup.launch.py): launch file · Brings up Nav2 with the Hybrid A* planner integration. · `hybrid_astar_planner/launch/nav2_hybrid_astar_bringup.launch.py`

## Connections

- Scan Filter → Obstacle Tracker: filtered scans · Cleaner lidar data feeds obstacle extraction.
- Obstacle Tracker → Grid Map: tracks into map · Tracked obstacles are represented in planner space.
- Grid Map → Hybrid A*: search space · Occupancy and obstacle state constrain path generation.
- Planner Types → Hybrid A*: state model · Shared geometry and planner state definitions are consumed by the planner core.
- Hybrid A* → Planner Node: planned path · Planner core is wrapped by runtime orchestration.
- Planner Node → Nav2 Server: Nav2 action · Planner node is exposed through the Nav2 server interface.
- Compat Hook → Nav2 Server: compat hook · Provides Nav2 expectation compatibility.
- Obstacle Tracker → Local Planner: obstacles · Tracked obstacles inform local slowdown and stop decisions.
- Local Planner → Safety Gate: stop hints · Local supervision contributes emergency-stop conditions to the final gate.
- Reverse Recovery → Safety Gate: recovery state · Recovery behavior affects final command arbitration.
- Replan Watchdog → Planner Node: replan trigger · Watchdog can force replanning when progress stalls.
- Motion Observer → Planner Node: observes · Diagnostic observer watches planner and motion decisions.
- Anchor Guard → Pose Seed: reseed · Localization drift handling can trigger pose reseeding.
- Pose Seed → Odom TF Bridge: pose boot · Initial pose bootstraps the TF/odom navigation context.
- Odom TF Bridge → TF Logger: tf events · TF continuity and discontinuities are logged for diagnosis.
- TF Logger → Anchor Guard: drift signal · Logged TF/AMCL anomalies support guard decisions.
- Warehouse World → Moving Obstacle: sim obstacle · Warehouse world contains the moving obstacle runtime.
- ROS Bridge → Moving Obstacle: transport · Bridge connects the driver to Gazebo transport and ROS topics.
- Delivery Stack → Warehouse World: includes · Delivery stack composes the simulation environment.
- Delivery Stack → Nav2 Bringup: includes · Launch composition pulls in Nav2 and planner bringup.
- Fortress RPP → Safety Gate: starts · Modern test launch includes the final motion safety gate.
- Fortress RPP → Planner Node: starts · Modern test launch includes the Hybrid A* runtime.
- Nav2 Bringup → Nav2 Server: starts · Bringup launches the planner-facing Nav2 server.
- Nav2 Bringup → Compat Hook: starts · Bringup includes Nav2 compatibility glue.
