ROS 2 DDS to NGSI-LD Architecture¶
This document describes the active telemetry ingestion path used by ROBIN.
Baseline¶
ROBIN uses a DDS-first flow:
ROS topics are aggregated into a single telemetry message (
ProcessTelemetry)Orion-LD DDS module maps that topic into a
Processentity attributeTROE + Mintaka provide temporal history
Legacy HTTP NGSI bridge is not part of this architecture.
Data Flow¶
graph LR
A["ROS topics"] --> B["telemetry_aggregator_node"]
B --> C["/robin/telemetry"]
C --> D["Orion-LD DDS module"]
D --> E["urn:ngsi-ld:Process:ros_bridge"]
E --> F["TROE / TimescaleDB"]
F --> G["Mintaka"]
ROS Layer¶
Telemetry message¶
File:
vulcanexus_ws/src/robin_interfaces/msg/ProcessTelemetry.msgPurpose: package geometry + machine + pose values into DDS-friendly primitive fields
Aggregation node¶
File:
vulcanexus_ws/src/robin_core_data/scripts/telemetry_aggregator_node.pyPublishes:
/robin/telemetryInputs: geometry, fronius/welder data, pose topics
Orion DDS Mapping¶
Configuration file: config-dds.json
The mapping connects DDS topic rt/robin/telemetry to entity
urn:ngsi-ld:Process:ros_bridge with attribute urn:robin:processTelemetry.
See Configuration Reference for the full JSON and environment variable details.
Validation Steps¶
# 1) Verify telemetry topic exists
ros2 topic echo /robin/telemetry
# 2) Verify Orion process entity
curl -H "NGSILD-Tenant: robin" \
"http://localhost:1026/ngsi-ld/v1/entities/urn:ngsi-ld:Process:ros_bridge"
# 3) Verify temporal history via Mintaka
curl -H "NGSILD-Tenant: robin" \
"http://localhost:9090/temporal/entities/urn:ngsi-ld:Process:ros_bridge?lastN=5"
Notes¶
Keep ROS and Orion DDS domains aligned (
ROS_DOMAIN_ID).Use host networking for DDS discovery where required by deployment.
Prefer flat numeric fields in telemetry messages for robust DDS-to-NGSI mapping.