Skip to content
Skip to content
Modules RTI Connext DDS

Version 0.1.0 · RTI License · C++

RTI Connext DDS

RTI Connext DDS connects a Holoscan application to a DDS databus. Publish and subscribe to strongly typed data with the DDS publish/subscribe model, so independent Holoscan applications and non-Holoscan systems can exchange data without point-to-point connections maintained by each application.

Experimental prototype

This module is an engineering prototype for Holoscan SDK (HSDK) 5.0.0 EA2, not a packaged production module. It is built, tested, and run in Docker.

Connext handles discovery, so compatible publishers and subscribers find each other without an application-level broker. Each data flow carries its own quality-of-service policy for reliability, history, and durability, and types are defined in OMG IDL, so producers and consumers can evolve independently.

At a glance

Repositoryrticonnextdds-holoscan-module
Version0.1.0
C++ namespacerti::holoscan::dds
Holoscan SDK5.0.0 EA2
RTI Connext DDS7.7.0
CUDA13
Platformsx86_64, aarch64. IGX Orin is not supported, because it does not provide CUDA 13.
LanguagesC++. Python bindings are not included.
LicenseRTI License, in the repository. A Connext runtime license is separate.
MaintainerRTI Real-Time Innovations

This module is maintained by RTI. For the Connext SDK, a runtime license, or support, contact RTI at holoscan@rti.com.

Operators

Operator What it does
PublisherOp<DdsType, Adapter> Takes a Holoscan payload, converts it to a generated DDS type, and writes it with a Connext DataWriter
SubscriberOp<DdsType, Adapter> Reads a generated DDS type with a Connext DataReader, converts it to a Holoscan payload, and emits it into the graph

Both operators own the Connext participant, topic, reader or writer, quality of service, and lifecycle. The subscriber wakes the scheduler through a notification source rather than polling. Your application supplies the data type and the conversion at the Holoscan and DDS boundary.

Endpoint parameters

Each operator takes an EndpointConfig:

Parameter Default What it sets
domain_id 0 DDS domain. Only applications on the same domain discover each other.
topic_name none Topic to publish or subscribe to. Always set it.
qos_file HoloscanConnextQos.xml XML file the quality-of-service profile is loaded from
qos_profile HoloscanConnext::ReliableKeepAll Profile within the XML library
max_samples_per_activation 32 Largest number of samples a subscriber emits per compute
wait_for_reader true Make a publisher wait for a matched reader at startup
reader_match_timeout 10 s How long a publisher waits for that match
acknowledgment_timeout 5 s How long a publisher waits for acknowledgment at shutdown

A writer and a reader exchange data only when the domain, topic name, type definitions, and requested and offered quality of service are all compatible, and a network path allows discovery. Matching C++ type names in the source is not enough on its own; both ends must generate compatible type metadata from compatible IDL.

Sample applications

Application What it shows
connext_shapes_holoviz Generates a shape locally, publishes it, subscribes to the Square, Circle, and Triangle topics, and displays local and received samples with Holoviz
shapes_demo_flatbuffers Separate publisher and subscriber applications that exchange a typed FlatBuffers payload over DDS rather than an in-process connection

Both use the DDS type from the standard RTI Shapes Demo, so they interoperate with it.

Use it in an application

A generated Connext class is not a Holoscan graph payload, so an adapter maps between the two:

Holoscan payload <-> adapter <-> generated DDS type

The adapter names the Holoscan type and converts it:

struct TelemetryAdapter {
  using holoscan_type = std::uint32_t;

  static Telemetry to_dds(holoscan_type index) {
    Telemetry sample;
    sample.sensor_id = 7;
    sample.sample_index = index;
    return sample;
  }
};

When holoscan_type is holoscan::Tensor, the adapter also declares a tensor_input_spec() with the dtype, rank, memory kind, and bounds for the graph compiler. Point the operator at a domain and topic:

const rti::holoscan::dds::EndpointConfig config{
    .domain_id = 42,
    .topic_name = "RobotState",
};

Adding your own data model means generating a C++ type from your IDL, choosing a Holoscan payload the operators in that graph accept, and writing the adapter between them. The module does not generate that mapping. An IDL change usually means updating the generated type, the adapter, any companion schema, and the tests together.

Build and run

Everything builds and runs in Docker, so the host needs neither Connext nor Holoscan installed. The container does need a rti_license.dat, bind-mounted read-only at run time and kept out of the image and out of source control. Request an activation key from the RTI Connext license page.

The container profile shares the host IPC and process namespaces so Connext can use its shared-memory transport between containers and with applications on the host. Private IPC prevents that path, so use a deployment-specific transport configuration when you need stronger isolation.

Source and setup instructions are in the RTI repository.

All modules