# wu427/ros2_quadrotor_sim architecture

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

- Interactive diagram: https://gitdiagram.com/wu427/ros2_quadrotor_sim
- Repository: https://github.com/wu427/ros2_quadrotor_sim

## Overview

This is a single-vehicle ROS 2 closed-loop quadrotor simulator with static-map planning and Qt/Web operator stations. The principal workflow is operator goal or waypoint input → safe 3D planning → position/attitude control → simulated vehicle dynamics and telemetry. Planning includes map collision checks and path preparation; missions can also sequence waypoints and patrols. The README documents additional UI and planning capabilities beyond the sampled excerpts; those branches are included where paths are supported, without assuming unsampled internal wiring.

Main entry points: [`src/drone_planner/drone_planner/planner_node.py`](https://github.com/wu427/ros2_quadrotor_sim/blob/main/src/drone_planner/drone_planner/planner_node.py) (Path planner), [`src/drone_web_ground_station/drone_web_ground_station/ros_bridge.py`](https://github.com/wu427/ros2_quadrotor_sim/blob/main/src/drone_web_ground_station/drone_web_ground_station/ros_bridge.py) (Web ROS bridge), [`src/drone_bringup/launch/planned_sim.launch.py`](https://github.com/wu427/ros2_quadrotor_sim/blob/main/src/drone_bringup/launch/planned_sim.launch.py) (Simulation launch), [`src/drone_dynamics/src/quadrotor_dynamics_node.cpp`](https://github.com/wu427/ros2_quadrotor_sim/blob/main/src/drone_dynamics/src/quadrotor_dynamics_node.cpp) (6DoF dynamics)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_sim["Flight simulation"]
  node_controller["Position controller"]
  node_dynamics["6DoF dynamics"]
end

subgraph group_planning["Map and planning"]
  node_mapnode["Static map node<br/>[static_map_node.py]"]
  node_geometry["Collision geometry"]
  node_planner["Path planner<br/>[planner_node.py]"]
  node_astar["3D A* search<br/>[astar_3d.py]"]
  node_pathproc["Path processing<br/>[path_processing.py]"]
  node_simplifier["Path simplifier<br/>[path_simplifier.py]"]
  node_missions["Mission manager"]
  node_trajectories["Patrol trajectories<br/>[trajectories.py]"]
end

subgraph group_stations["Operator stations"]
  node_qtui["Qt ground station<br/>[main_window.py]"]
  node_qtworker["Qt ROS worker<br/>[ros_worker.py]"]
  node_webui["Web interface<br/>[app.js]"]
  node_webserver["Web server<br/>[web_server_node.py]"]
  node_rosbridge["Web ROS bridge<br/>[ros_bridge.py]"]
  node_recorder["Task recorder<br/>[task_recorder.py]"]
end

subgraph group_bringup["Mission launch"]
  node_launch["Simulation launch"]
end

node_operator(("Operator"))
node_browser(("Web browser"))

node_operator -->|"operates"| node_qtui
node_operator -->|"operates"| node_browser
node_browser -->|"interacts"| node_webui
node_webui -->|"sends requests"| node_webserver
node_webserver -->|"handles requests"| node_rosbridge
node_rosbridge -->|"publishes goals"| node_planner
node_rosbridge -->|"publishes missions"| node_missions
node_rosbridge -->|"records tasks"| node_recorder
node_rosbridge -->|"streams state"| node_webui
node_qtui -->|"queues commands"| node_qtworker
node_qtworker -->|"publishes goals"| node_planner
node_qtworker -->|"publishes missions"| node_missions
node_mapnode -->|"uses geometry"| node_geometry
node_planner -->|"checks collisions"| node_geometry
node_planner -->|"searches paths"| node_astar
node_planner -->|"simplifies paths"| node_simplifier
node_planner -->|"processes paths"| node_pathproc
node_missions -->|"dispatches goals"| node_planner
node_missions -->|"generates patrols"| node_trajectories
node_planner -->|"publishes references"| node_controller
node_controller -->|"sends motor commands"| node_dynamics
node_dynamics -->|"publishes odometry"| node_controller
node_dynamics -->|"publishes telemetry"| node_qtworker
node_dynamics -->|"publishes telemetry"| node_rosbridge
node_launch -->|"starts"| node_mapnode
node_launch -->|"starts"| node_planner
node_launch -->|"starts"| node_missions
node_launch -->|"starts"| node_controller
node_launch -->|"starts"| node_dynamics

click node_launch "https://github.com/wu427/ros2_quadrotor_sim/blob/main/src/drone_bringup/launch/planned_sim.launch.py"
click node_mapnode "https://github.com/wu427/ros2_quadrotor_sim/blob/main/src/drone_map/drone_map/static_map_node.py"
click node_geometry "https://github.com/wu427/ros2_quadrotor_sim/blob/main/src/drone_map/drone_map/collision_geometry.py"
click node_planner "https://github.com/wu427/ros2_quadrotor_sim/blob/main/src/drone_planner/drone_planner/planner_node.py"
click node_astar "https://github.com/wu427/ros2_quadrotor_sim/blob/main/src/drone_planner/drone_planner/astar_3d.py"
click node_pathproc "https://github.com/wu427/ros2_quadrotor_sim/blob/main/src/drone_planner/drone_planner/path_processing.py"
click node_simplifier "https://github.com/wu427/ros2_quadrotor_sim/blob/main/src/drone_planner/drone_planner/path_simplifier.py"
click node_missions "https://github.com/wu427/ros2_quadrotor_sim/blob/main/src/drone_planner/drone_planner/mission_manager_node.py"
click node_trajectories "https://github.com/wu427/ros2_quadrotor_sim/blob/main/src/drone_planner/drone_planner/trajectories.py"
click node_controller "https://github.com/wu427/ros2_quadrotor_sim/blob/main/src/drone_controller/src/position_controller_node.cpp"
click node_dynamics "https://github.com/wu427/ros2_quadrotor_sim/blob/main/src/drone_dynamics/src/quadrotor_dynamics_node.cpp"
click node_qtui "https://github.com/wu427/ros2_quadrotor_sim/blob/main/src/drone_ground_station/drone_ground_station/main_window.py"
click node_qtworker "https://github.com/wu427/ros2_quadrotor_sim/blob/main/src/drone_ground_station/drone_ground_station/ros_worker.py"
click node_webui "https://github.com/wu427/ros2_quadrotor_sim/blob/main/src/drone_web_ground_station/static/app.js"
click node_webserver "https://github.com/wu427/ros2_quadrotor_sim/blob/main/src/drone_web_ground_station/drone_web_ground_station/web_server_node.py"
click node_rosbridge "https://github.com/wu427/ros2_quadrotor_sim/blob/main/src/drone_web_ground_station/drone_web_ground_station/ros_bridge.py"
click node_recorder "https://github.com/wu427/ros2_quadrotor_sim/blob/main/src/drone_web_ground_station/drone_web_ground_station/task_recorder.py"

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_controller,node_dynamics,node_browser toneBlue
class node_mapnode,node_geometry,node_planner,node_astar,node_pathproc,node_simplifier,node_missions,node_trajectories toneAmber
class node_qtui,node_qtworker,node_webui,node_webserver,node_rosbridge,node_recorder toneMint
class node_launch toneRose
class node_operator toneIndigo
```

## Components

### Flight simulation

- [Position controller](https://github.com/wu427/ros2_quadrotor_sim/blob/main/src/drone_controller/src/position_controller_node.cpp): `src/drone_controller/src/position_controller_node.cpp`
- [6DoF dynamics](https://github.com/wu427/ros2_quadrotor_sim/blob/main/src/drone_dynamics/src/quadrotor_dynamics_node.cpp): `src/drone_dynamics/src/quadrotor_dynamics_node.cpp`

### Map and planning

- [Static map node](https://github.com/wu427/ros2_quadrotor_sim/blob/main/src/drone_map/drone_map/static_map_node.py): `src/drone_map/drone_map/static_map_node.py`
- [Collision geometry](https://github.com/wu427/ros2_quadrotor_sim/blob/main/src/drone_map/drone_map/collision_geometry.py): `src/drone_map/drone_map/collision_geometry.py`
- [Path planner](https://github.com/wu427/ros2_quadrotor_sim/blob/main/src/drone_planner/drone_planner/planner_node.py): `src/drone_planner/drone_planner/planner_node.py`
- [3D A* search](https://github.com/wu427/ros2_quadrotor_sim/blob/main/src/drone_planner/drone_planner/astar_3d.py): `src/drone_planner/drone_planner/astar_3d.py`
- [Path processing](https://github.com/wu427/ros2_quadrotor_sim/blob/main/src/drone_planner/drone_planner/path_processing.py): `src/drone_planner/drone_planner/path_processing.py`
- [Path simplifier](https://github.com/wu427/ros2_quadrotor_sim/blob/main/src/drone_planner/drone_planner/path_simplifier.py): `src/drone_planner/drone_planner/path_simplifier.py`
- [Mission manager](https://github.com/wu427/ros2_quadrotor_sim/blob/main/src/drone_planner/drone_planner/mission_manager_node.py): `src/drone_planner/drone_planner/mission_manager_node.py`
- [Patrol trajectories](https://github.com/wu427/ros2_quadrotor_sim/blob/main/src/drone_planner/drone_planner/trajectories.py): `src/drone_planner/drone_planner/trajectories.py`

### Operator stations

- [Qt ground station](https://github.com/wu427/ros2_quadrotor_sim/blob/main/src/drone_ground_station/drone_ground_station/main_window.py): `src/drone_ground_station/drone_ground_station/main_window.py`
- [Qt ROS worker](https://github.com/wu427/ros2_quadrotor_sim/blob/main/src/drone_ground_station/drone_ground_station/ros_worker.py): `src/drone_ground_station/drone_ground_station/ros_worker.py`
- [Web interface](https://github.com/wu427/ros2_quadrotor_sim/blob/main/src/drone_web_ground_station/static/app.js): `src/drone_web_ground_station/static/app.js`
- [Web server](https://github.com/wu427/ros2_quadrotor_sim/blob/main/src/drone_web_ground_station/drone_web_ground_station/web_server_node.py): `src/drone_web_ground_station/drone_web_ground_station/web_server_node.py`
- [Web ROS bridge](https://github.com/wu427/ros2_quadrotor_sim/blob/main/src/drone_web_ground_station/drone_web_ground_station/ros_bridge.py): `src/drone_web_ground_station/drone_web_ground_station/ros_bridge.py`
- [Task recorder](https://github.com/wu427/ros2_quadrotor_sim/blob/main/src/drone_web_ground_station/drone_web_ground_station/task_recorder.py): `src/drone_web_ground_station/drone_web_ground_station/task_recorder.py`

### Mission launch

- [Simulation launch](https://github.com/wu427/ros2_quadrotor_sim/blob/main/src/drone_bringup/launch/planned_sim.launch.py): `src/drone_bringup/launch/planned_sim.launch.py`

### Other components

- **Operator**
- **Web browser**

## Connections

- Operator → Qt ground station: operates
- Operator → Web browser: operates
- Web browser → Web interface: interacts
- Web interface → Web server: sends requests
- Web server → Web ROS bridge: handles requests
- Web ROS bridge → Path planner: publishes goals
- Web ROS bridge → Mission manager: publishes missions
- Web ROS bridge → Task recorder: records tasks
- Web ROS bridge → Web interface: streams state
- Qt ground station → Qt ROS worker: queues commands
- Qt ROS worker → Path planner: publishes goals
- Qt ROS worker → Mission manager: publishes missions
- Static map node → Collision geometry: uses geometry
- Path planner → Collision geometry: checks collisions
- Path planner → 3D A* search: searches paths
- Path planner → Path simplifier: simplifies paths
- Path planner → Path processing: processes paths
- Mission manager → Path planner: dispatches goals
- Mission manager → Patrol trajectories: generates patrols
- Path planner → Position controller: publishes references
- Position controller → 6DoF dynamics: sends motor commands
- 6DoF dynamics → Position controller: publishes odometry
- 6DoF dynamics → Qt ROS worker: publishes telemetry
- 6DoF dynamics → Web ROS bridge: publishes telemetry
- Simulation launch → Static map node: starts
- Simulation launch → Path planner: starts
- Simulation launch → Mission manager: starts
- Simulation launch → Position controller: starts
- Simulation launch → 6DoF dynamics: starts
