# agirsailing/sailing_ros architecture

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

- Interactive diagram: https://gitdiagram.com/agirsailing/sailing_ros
- Repository: https://github.com/agirsailing/sailing_ros

## Overview

Agir’s ROS 2 workspace acquires sailboat sensor data, processes it into higher-level measurements, and exposes telemetry and rosbag recording control. The principal flow is hardware acquisition → ROS sensor topics → processing nodes → telemetry/MQTT; operators can also request recording through MQTT, which the command gateway forwards to the rosbag manager. Live and replay launch modes compose the runtime. The README documents the broader capabilities, but several node implementations and topic configurations were not sampled, so uncertain per-topic wiring is left abstract.

Main entry points: [`ros2_ws/src/rosbag_manager/rosbag_manager/rosbag_manager_node.py`](https://github.com/agirsailing/sailing_ros/blob/main/ros2_ws/src/rosbag_manager/rosbag_manager/rosbag_manager_node.py) (Rosbag manager), [`ros2_ws/src/communication_web/communication_web/gateway/mqtt_client.py`](https://github.com/agirsailing/sailing_ros/blob/main/ros2_ws/src/communication_web/communication_web/gateway/mqtt_client.py) (MQTT transport), [`ros2_ws/src/orchestrator/launch/live_system.launch.py`](https://github.com/agirsailing/sailing_ros/blob/main/ros2_ws/src/orchestrator/launch/live_system.launch.py) (Live / replay launcher), [`ros2_ws/src/communication_web/communication_web/command_gateway_node.py`](https://github.com/agirsailing/sailing_ros/blob/main/ros2_ws/src/communication_web/communication_web/command_gateway_node.py) (Recording command gateway)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_runtime["Runtime orchestration"]
  node_orchestrator["Live / replay launcher"]
  node_sensor_launch["Sensor launch<br/>[sensors_launch.py]"]
  node_processing_launch["Processing launch"]
  node_interfaces["Messages and services<br/>[CMakeLists.txt]"]
end

subgraph group_acquisition["Sensor acquisition"]
  node_gps["GPS acquisition<br/>[gps_node.py]"]
  node_ultrasonic["Ultrasonic acquisition<br/>[ultrasonic_node.py]"]
  node_i2c["I2C sensors"]
  node_battery["Battery sensing<br/>[battery_node.py]"]
end

subgraph group_processing["Data processing"]
  node_imu_processing["IMU attitude<br/>[imu_node.py]"]
  node_heading["Heading processing<br/>[heading_node.py]"]
  node_height_filter["Height / ultrasonic"]
  node_battery_monitor["Battery monitoring"]
end

subgraph group_communications["Web communication"]
  node_telemetry["Telemetry gateway"]
  node_mqtt_transport["MQTT transport<br/>[mqtt_client.py]"]
  node_command_gateway["Recording command gateway"]
  node_recording_rpc["Recording RPC<br/>[recording_rpc.py]"]
end

subgraph group_recording["Rosbag recording"]
  node_bag_manager["Rosbag manager"]
  node_bag_store[("MCAP recordings")]
end

node_operator(("Operator / GUI"))
node_hardware{{"Boat hardware"}}
node_ros_topics["ROS 2 topics"]
node_mqtt_broker(("MQTT broker"))

node_operator -->|"selects mode"| node_orchestrator
node_orchestrator -->|"starts acquisition"| node_sensor_launch
node_orchestrator -->|"starts processing"| node_processing_launch
node_hardware -->|"position signals"| node_gps
node_hardware -->|"range signals"| node_ultrasonic
node_hardware -->|"IMU / compass"| node_i2c
node_hardware -->|"battery readings"| node_battery
node_gps -->|"publishes"| node_ros_topics
node_ultrasonic -->|"publishes"| node_ros_topics
node_i2c -->|"publishes"| node_ros_topics
node_battery -->|"publishes"| node_ros_topics
node_ros_topics -->|"sensor input"| node_imu_processing
node_ros_topics -->|"sensor input"| node_heading
node_ros_topics -->|"sensor input"| node_height_filter
node_ros_topics -->|"sensor input"| node_battery_monitor
node_imu_processing -->|"publishes processed data"| node_ros_topics
node_heading -->|"publishes processed data"| node_ros_topics
node_height_filter -->|"publishes processed data"| node_ros_topics
node_battery_monitor -->|"publishes processed data"| node_ros_topics
node_ros_topics -->|"telemetry input"| node_telemetry
node_telemetry -->|"publishes telemetry"| node_mqtt_transport
node_mqtt_transport -->|"sends MQTT"| node_mqtt_broker
node_mqtt_broker -->|"delivers telemetry"| node_operator
node_mqtt_broker -->|"record commands"| node_mqtt_transport
node_mqtt_transport -->|"dispatches messages"| node_command_gateway
node_command_gateway -->|"handles requests"| node_recording_rpc
node_recording_rpc -->|"calls recording services"| node_bag_manager
node_bag_manager -->|"records all topics"| node_ros_topics
node_bag_manager -->|"writes MCAP"| node_bag_store
node_bag_manager -->|"publishes recording state"| node_command_gateway

click node_orchestrator "https://github.com/agirsailing/sailing_ros/blob/main/ros2_ws/src/orchestrator/launch/live_system.launch.py"
click node_sensor_launch "https://github.com/agirsailing/sailing_ros/blob/main/ros2_ws/src/sensors/launch/sensors_launch.py"
click node_processing_launch "https://github.com/agirsailing/sailing_ros/blob/main/ros2_ws/src/data_elaboration/launch/data_elaboration_launch.py"
click node_gps "https://github.com/agirsailing/sailing_ros/blob/main/ros2_ws/src/sensors/sensors/gps_node.py"
click node_ultrasonic "https://github.com/agirsailing/sailing_ros/blob/main/ros2_ws/src/sensors/sensors/ultrasonic_node.py"
click node_i2c "https://github.com/agirsailing/sailing_ros/blob/main/ros2_ws/src/sensors/sensors/i2c_sensors_node.py"
click node_battery "https://github.com/agirsailing/sailing_ros/blob/main/ros2_ws/src/sensors/sensors/battery_node.py"
click node_imu_processing "https://github.com/agirsailing/sailing_ros/blob/main/ros2_ws/src/data_elaboration/data_elaboration/imu_node.py"
click node_heading "https://github.com/agirsailing/sailing_ros/blob/main/ros2_ws/src/data_elaboration/data_elaboration/heading_node.py"
click node_height_filter "https://github.com/agirsailing/sailing_ros/blob/main/ros2_ws/src/data_elaboration/data_elaboration/ultrasonic_filter_node.py"
click node_battery_monitor "https://github.com/agirsailing/sailing_ros/blob/main/ros2_ws/src/data_elaboration/data_elaboration/battery_monitor_node.py"
click node_interfaces "https://github.com/agirsailing/sailing_ros/blob/main/ros2_ws/src/sail_msgs/CMakeLists.txt"
click node_telemetry "https://github.com/agirsailing/sailing_ros/blob/main/ros2_ws/src/communication_web/communication_web/telemetry_gateway_node.py"
click node_mqtt_transport "https://github.com/agirsailing/sailing_ros/blob/main/ros2_ws/src/communication_web/communication_web/gateway/mqtt_client.py"
click node_command_gateway "https://github.com/agirsailing/sailing_ros/blob/main/ros2_ws/src/communication_web/communication_web/command_gateway_node.py"
click node_recording_rpc "https://github.com/agirsailing/sailing_ros/blob/main/ros2_ws/src/communication_web/communication_web/gateway/recording_rpc.py"
click node_bag_manager "https://github.com/agirsailing/sailing_ros/blob/main/ros2_ws/src/rosbag_manager/rosbag_manager/rosbag_manager_node.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_orchestrator,node_sensor_launch,node_processing_launch,node_interfaces,node_operator toneBlue
class node_gps,node_ultrasonic,node_i2c,node_battery toneAmber
class node_imu_processing,node_heading,node_height_filter,node_battery_monitor toneMint
class node_telemetry,node_mqtt_transport,node_command_gateway,node_recording_rpc toneRose
class node_bag_manager,node_bag_store,node_hardware,node_ros_topics,node_mqtt_broker toneIndigo
```

## Components

### Runtime orchestration

- [Live / replay launcher](https://github.com/agirsailing/sailing_ros/blob/main/ros2_ws/src/orchestrator/launch/live_system.launch.py): `ros2_ws/src/orchestrator/launch/live_system.launch.py`
- [Sensor launch](https://github.com/agirsailing/sailing_ros/blob/main/ros2_ws/src/sensors/launch/sensors_launch.py): `ros2_ws/src/sensors/launch/sensors_launch.py`
- [Processing launch](https://github.com/agirsailing/sailing_ros/blob/main/ros2_ws/src/data_elaboration/launch/data_elaboration_launch.py): `ros2_ws/src/data_elaboration/launch/data_elaboration_launch.py`
- [Messages and services](https://github.com/agirsailing/sailing_ros/blob/main/ros2_ws/src/sail_msgs/CMakeLists.txt): `ros2_ws/src/sail_msgs/CMakeLists.txt`

### Sensor acquisition

- [GPS acquisition](https://github.com/agirsailing/sailing_ros/blob/main/ros2_ws/src/sensors/sensors/gps_node.py): `ros2_ws/src/sensors/sensors/gps_node.py`
- [Ultrasonic acquisition](https://github.com/agirsailing/sailing_ros/blob/main/ros2_ws/src/sensors/sensors/ultrasonic_node.py): `ros2_ws/src/sensors/sensors/ultrasonic_node.py`
- [I2C sensors](https://github.com/agirsailing/sailing_ros/blob/main/ros2_ws/src/sensors/sensors/i2c_sensors_node.py): `ros2_ws/src/sensors/sensors/i2c_sensors_node.py`
- [Battery sensing](https://github.com/agirsailing/sailing_ros/blob/main/ros2_ws/src/sensors/sensors/battery_node.py): `ros2_ws/src/sensors/sensors/battery_node.py`

### Data processing

- [IMU attitude](https://github.com/agirsailing/sailing_ros/blob/main/ros2_ws/src/data_elaboration/data_elaboration/imu_node.py): `ros2_ws/src/data_elaboration/data_elaboration/imu_node.py`
- [Heading processing](https://github.com/agirsailing/sailing_ros/blob/main/ros2_ws/src/data_elaboration/data_elaboration/heading_node.py): `ros2_ws/src/data_elaboration/data_elaboration/heading_node.py`
- [Height / ultrasonic](https://github.com/agirsailing/sailing_ros/blob/main/ros2_ws/src/data_elaboration/data_elaboration/ultrasonic_filter_node.py): `ros2_ws/src/data_elaboration/data_elaboration/ultrasonic_filter_node.py`
- [Battery monitoring](https://github.com/agirsailing/sailing_ros/blob/main/ros2_ws/src/data_elaboration/data_elaboration/battery_monitor_node.py): `ros2_ws/src/data_elaboration/data_elaboration/battery_monitor_node.py`

### Web communication

- [Telemetry gateway](https://github.com/agirsailing/sailing_ros/blob/main/ros2_ws/src/communication_web/communication_web/telemetry_gateway_node.py): `ros2_ws/src/communication_web/communication_web/telemetry_gateway_node.py`
- [MQTT transport](https://github.com/agirsailing/sailing_ros/blob/main/ros2_ws/src/communication_web/communication_web/gateway/mqtt_client.py): `ros2_ws/src/communication_web/communication_web/gateway/mqtt_client.py`
- [Recording command gateway](https://github.com/agirsailing/sailing_ros/blob/main/ros2_ws/src/communication_web/communication_web/command_gateway_node.py): `ros2_ws/src/communication_web/communication_web/command_gateway_node.py`
- [Recording RPC](https://github.com/agirsailing/sailing_ros/blob/main/ros2_ws/src/communication_web/communication_web/gateway/recording_rpc.py): `ros2_ws/src/communication_web/communication_web/gateway/recording_rpc.py`

### Rosbag recording

- [Rosbag manager](https://github.com/agirsailing/sailing_ros/blob/main/ros2_ws/src/rosbag_manager/rosbag_manager/rosbag_manager_node.py): `ros2_ws/src/rosbag_manager/rosbag_manager/rosbag_manager_node.py`
- **MCAP recordings**

### Other components

- **Operator / GUI**
- **Boat hardware**
- **ROS 2 topics**
- **MQTT broker**

## Connections

- Operator / GUI → Live / replay launcher: selects mode
- Live / replay launcher → Sensor launch: starts acquisition
- Live / replay launcher → Processing launch: starts processing
- Boat hardware → GPS acquisition: position signals
- Boat hardware → Ultrasonic acquisition: range signals
- Boat hardware → I2C sensors: IMU / compass
- Boat hardware → Battery sensing: battery readings
- GPS acquisition → ROS 2 topics: publishes
- Ultrasonic acquisition → ROS 2 topics: publishes
- I2C sensors → ROS 2 topics: publishes
- Battery sensing → ROS 2 topics: publishes
- ROS 2 topics → IMU attitude: sensor input
- ROS 2 topics → Heading processing: sensor input
- ROS 2 topics → Height / ultrasonic: sensor input
- ROS 2 topics → Battery monitoring: sensor input
- IMU attitude → ROS 2 topics: publishes processed data
- Heading processing → ROS 2 topics: publishes processed data
- Height / ultrasonic → ROS 2 topics: publishes processed data
- Battery monitoring → ROS 2 topics: publishes processed data
- ROS 2 topics → Telemetry gateway: telemetry input
- Telemetry gateway → MQTT transport: publishes telemetry
- MQTT transport → MQTT broker: sends MQTT
- MQTT broker → Operator / GUI: delivers telemetry
- MQTT broker → MQTT transport: record commands
- MQTT transport → Recording command gateway: dispatches messages
- Recording command gateway → Recording RPC: handles requests
- Recording RPC → Rosbag manager: calls recording services
- Rosbag manager → ROS 2 topics: records all topics
- Rosbag manager → MCAP recordings: writes MCAP
- Rosbag manager → Recording command gateway: publishes recording state
