DDS
DDS
Category: Networking/IoT
Overview
DDS (Data Distribution Service) is an OMG standard for real-time, broker-less, data-centric pub/sub. Used in robotics (ROS 2), defense, autonomous vehicles, and medical systems, it provides deterministic low-latency distribution with 22 QoS policies and peer-to-peer RTPS discovery.
1. Theory & Fundamentals
- Broker-less: Peer-to-peer RTPS discovery via multicast
- Data-centric: Topics are typed data streams
- QoS: 22 policies — Reliability, Durability, Deadline, Latency Budget, Liveliness, etc.
- Domain: Integer isolation space (0–232)
- GUID: 12-byte prefix + 4-byte entity ID (globally unique)
- Implementations: Fast DDS (eProsima), Cyclone DDS, RTI Connext DDS
2. Frame / Packet Structure
RTPS Wire Protocol:
Header: "RTPS" | Version | VendorID | GUIDPrefix
Submessages: SubMsgHeader + Payload
Submessage types:
DATA: Application payload
HEARTBEAT: Publisher announces available samples
ACKNACK: Subscriber requests missing
GAP: Samples no longer available
INFO_TS: Timestamp
DataWriter→DataReader match requires compatible QoS:
Reliability: RELIABLE publisher ≥ BEST_EFFORT subscriber
Durability: TRANSIENT_LOCAL ≥ VOLATILE
3. Protocol Mechanics
- Discovery: PDP (Participant) + EDP (Endpoint) phases via multicast
- Reliable: HEARTBEAT/ACKNACK retransmit missing samples
- TRANSIENT_LOCAL durability: Late subscribers get history
- Deadline: Subscriber detects missed update
- Content-filtered topics: Server-side filter, reduces bandwidth
4. Hardware Implementation
- Any Linux/RTOS with UDP/TCP stack
- Micro-XRCE-DDS: MCU client (~50 KB RAM) for ROS 2 micro-ROS
- ROS 2: Default middleware layer uses Fast DDS or Cyclone DDS
- Network: UDP unicast + multicast; works on LAN
- Docker: Deploy DDS applications in containers
5. Register-Level / Configuration
#include <fastdds/dds/domain/DomainParticipantFactory.hpp>
using namespace eprosima::fastdds::dds;
DomainParticipant* p =
DomainParticipantFactory::get_instance()
->create_participant(0, PARTICIPANT_QOS_DEFAULT);
Topic* t = p->create_topic("Temp",
"Float32", TOPIC_QOS_DEFAULT);
Publisher* pub = p->create_publisher(PUBLISHER_QOS_DEFAULT);
DataWriter* w = pub->create_datawriter(t,
DATAWRITER_QOS_DEFAULT);
Float32 sample; sample.data(23.5f);
w->write(&sample);
6. Driver / Software Development
from cyclonedds.domain import DomainParticipant
from cyclonedds.topic import Topic
from cyclonedds.pub import DataWriter
from cyclonedds.idl import IdlStruct
from dataclasses import dataclass
@dataclass
class Temperature(IdlStruct):
value: float
sensor_id: str
dp = DomainParticipant()
topic = Topic(dp, "Temperature", Temperature)
writer = DataWriter(dp, topic)
writer.write(Temperature(value=23.5, sensor_id="r1"))
7. Debugging & Testing
- Fast DDS Monitor / RTI Spy: Visualize topics, QoS, writer/reader pairs
- Wireshark: RTPS dissector (filter: rtps)
- ros2 topic list/echo (ROS 2 environments)
- Common issues: QoS mismatch; multicast blocked by firewall; domain ID wrong
8. Real-World Applications
- ROS 2 robot middleware
- Autonomous vehicle sensor fusion
- US Navy / NATO C2 systems
- Medical device integration
- Flight simulation systems
9. Advanced Topics & Edge Cases
- RTPS over shared memory: Zero-copy for intra-host
- DDS Security: Auth, encryption, access control plugins
- Micro-XRCE-DDS: Client-agent model for MCUs
- Content-filtered topics: Subscribe to subset of data
- QoS tuning: Reliability vs latency for different data types
10. Standards & Variants
| Standard | Notes |
|---|---|
| DDS 1.4 | OMG core |
| RTPS 2.3 | Wire protocol |
| DDS-XTYPES | Type extensibility |
| DDS Security 1.1 | Auth + encryption |
| Micro-XRCE-DDS | MCU/ROS 2 micro-ROS |
💡 Practical Examples
Ex 1: Reliable QoS writer: qos.reliability().kind = RELIABLERELIABILITYQOS;
Ex 2: Content filter: Create ContentFilteredTopic with SQL predicate value > 30.
Ex 3: ROS 2 publisher: pub = node.create_publisher(Float32, 'temperature', 10)
🧪 Practice Questions
Beginner: 1) Broker-less? 2) What is RTPS? 3) What is a domain? 4) DDS in ROS 2? 5) Reliable vs best-effort?
Intermediate: 1) QoS TRANSIENT_LOCAL. 2) HEARTBEAT/ACKNACK. 3) Content-filtered topic. 4) DDS discovery phases. 5) QoS mismatch diagnosis.
Advanced: 1) LiDAR QoS design 1M pts/sec. 2) DDS Security with PKIX. 3) Micro-XRCE-DDS on STM32. 4) Minimum latency control loop. 5) DDS vs MQTT vs AMQP.
Checklist
- [ ] Implement DDS publisher and subscriber
- [ ] Configure QoS (Reliability, Durability, Deadline)
- [ ] Use content-filtered topic
- [ ] Monitor with Fast DDS Monitor
- [ ] Debug with Wireshark RTPS dissector
- [ ] Integrate with ROS 2
- [ ] Implement DDS Security
- [ ] Connect MCU with Micro-XRCE-DDS
- [ ] Design QoS for real-time system
- [ ] Compare DDS vs message brokers