Configuration Complexity
The pain
Getting DDS to work well in ROS 2 routinely means becoming a part-time DDS
network engineer (21 reports): hundreds of XML knobs, per-vendor dialects
(Fast DDS profiles vs Cyclone XML vs Connext QoS), kernel tuning (rmem_max,
ipfrag_*), and hidden prerequisites that are nearly impossible to find. The
shipped defaults are not the robotics-/WiFi-appropriate ones, so “good enough”
takes days of trial and error.
- Localhost-only mode silently requires multicast enabled on the loopback
interface (
ip link set lo multicast on) — undocumented in practice. - Selecting the right network interface, or making a Discovery Server introspectable, needs expert XML.
- A binary install can even go looking for a paid vendor by default.
Most recent example
ROS Discourse — “I’m done manually tuning DDS parameters!” (2026-04-30). A long, well-received thread: hundreds of knobs, days of trial-and-error, and still suboptimal results — a representative statement of the configuration-complexity tax.
Reference list (most recent)
| Date | Source | Problem |
|---|---|---|
| 2026-04-30 | ROS Discourse | “Done tuning DDS”: hundreds of knobs, days lost |
| 2025-12-09 | ROS Discourse | OSRF “Consolidated User Insights” on DDS pain |
| 2025-08-15 | ros2#1716 | Jazzy on Windows searches for paid RTI Connext |
| 2025-04-04 | rmw_cyclonedds#537 | failed to create domain, error Error |
| 2025-04-02 | cyclonedds#2201 | Network-interface selection requires config spelunking |
How ZeroDDS solves it
Robotics-appropriate defaults out of the box, and environment variables instead of XML dialects.
ros_defaults()works out of the box. A singleRuntimeConfig::ros_defaults()sets the representation offers (XCDR1 + XCDR2) and the 16 MiB reassembly cap ROS actually needs —rmw_zeroddsinterops with a real ROS 2 talker 20/20 with no XML and no environment tuning.- Configuration is environment variables, not an XML dialect. Discovery
(
ZERODDS_PEERS,ZERODDS_NO_MULTICAST), interface pinning (ZERODDS_INTERFACE), sample caps (ZERODDS_MAX_SAMPLE_BYTES), peer limits (ZERODDS_MAX_PEER_PARTICIPANTS) — flat, documented knobs, not nested profile XML you debug with a parser. - Interface selection is one variable. The “network-interface selection”
pain (cyclonedds#2201)
is
ZERODDS_INTERFACE=<ip>, applied uniformly across UDP/TCP/SHM/UDS. - No hidden loopback prerequisite. Unicast localhost discovery does not
depend on multicast being enabled on
lo. - No paid-vendor fallback. The whole stack is open source (Apache-2.0 / MIT); there is no proprietary tier a default install can drift toward.
Why it no longer has to be a pain
The configuration tax comes from defaults tuned for data-center DDS, exposed through per-vendor XML. ZeroDDS ships defaults tuned for the robotics/WiFi case and exposes the few knobs you actually need as flat environment variables — so the median project needs zero configuration, and the rest needs a handful of documented variables, not a weekend with a vendor’s XML schema.
Reproduce it yourself
# Out-of-the-box ROS interop with no XML / no env tuning:
crates/ros2-rmw/interop/run_interop.sh # uses ros_defaults()
→ Back to overview · Next: Scaling
Konfigurations-Komplexität
Der Schmerz
DDS in ROS 2 gut zum Laufen zu bringen heißt routinemäßig, ein Teilzeit-DDS-Netzwerk-Ingenieur zu werden (21 Reports): hunderte XML-Knöpfe, Per-Vendor-Dialekte (Fast-DDS-Profile vs Cyclone-XML vs Connext-QoS), Kernel-Tuning (rmem_max, ipfrag_*) und versteckte Voraussetzungen, die nahezu unmöglich zu finden sind. Die ausgelieferten Defaults sind nicht die robotik-/WiFi-passenden, sodass „gut genug” Tage von Trial-and-Error kostet.
- Localhost-Only-Modus erfordert still, dass Multicast auf dem Loopback-Interface aktiviert ist (
ip link set lo multicast on) — in der Praxis undokumentiert. - Das richtige Netzwerk-Interface zu wählen oder einen Discovery-Server introspizierbar zu machen, braucht Experten-XML.
- Ein Binary-Install kann sogar per Default nach einem bezahlten Vendor suchen.
Jüngstes Beispiel
ROS Discourse — „I’m done manually tuning DDS parameters!” (2026-04-30). Ein langer, gut aufgenommener Thread: hunderte Knöpfe, Tage von Trial-and-Error und immer noch suboptimale Ergebnisse — eine repräsentative Aussage über die Konfigurations-Komplexitäts-Steuer.
Referenzliste (jüngste zuerst)
| Datum | Quelle | Problem |
|---|---|---|
| 2026-04-30 | ROS Discourse | „Done tuning DDS”: hunderte Knöpfe, Tage verloren |
| 2025-12-09 | ROS Discourse | OSRF „Consolidated User Insights” zum DDS-Schmerz |
| 2025-08-15 | ros2#1716 | Jazzy auf Windows sucht nach bezahltem RTI Connext |
| 2025-04-04 | rmw_cyclonedds#537 | failed to create domain, error Error |
| 2025-04-02 | cyclonedds#2201 | Netzwerk-Interface-Auswahl erfordert Config-Spelunking |
Wie ZeroDDS es löst
Robotik-passende Defaults out of the box, und Umgebungsvariablen statt XML-Dialekte.
ros_defaults()funktioniert out of the box. Ein einzigesRuntimeConfig::ros_defaults()setzt die Representation-Offers (XCDR1 + XCDR2) und den 16-MiB-Reassembly-Cap, die ROS tatsächlich braucht —rmw_zeroddsinteropt mit einem echten ROS-2-Talker 20/20 ohne XML und ohne Umgebungs-Tuning.- Konfiguration ist Umgebungsvariablen, kein XML-Dialekt. Discovery (
ZERODDS_PEERS,ZERODDS_NO_MULTICAST), Interface-Pinning (ZERODDS_INTERFACE), Sample-Caps (ZERODDS_MAX_SAMPLE_BYTES), Peer-Limits (ZERODDS_MAX_PEER_PARTICIPANTS) — flache, dokumentierte Knöpfe, kein verschachteltes Profile-XML, das du mit einem Parser debuggst. - Interface-Auswahl ist eine Variable. Der „Netzwerk-Interface-Auswahl”-Schmerz (cyclonedds#2201) ist
ZERODDS_INTERFACE=<ip>, uniform über UDP/TCP/SHM/UDS angewandt. - Keine versteckte Loopback-Voraussetzung. Unicast-Localhost-Discovery hängt nicht davon ab, dass Multicast auf
loaktiviert ist. - Kein Paid-Vendor-Fallback. Der ganze Stack ist Open Source (Apache-2.0 / MIT); es gibt keinen proprietären Tier, zu dem ein Default-Install driften könnte.
Warum es kein Schmerz mehr sein muss
Die Konfigurations-Steuer kommt von Defaults, die für Data-Center-DDS getunt sind, exponiert über Per-Vendor-XML. ZeroDDS liefert Defaults, die für den Robotik-/WiFi-Fall getunt sind, und exponiert die wenigen Knöpfe, die du wirklich brauchst, als flache Umgebungsvariablen — sodass das mediane Projekt null Konfiguration braucht, und der Rest eine Handvoll dokumentierter Variablen, kein Wochenende mit dem XML-Schema eines Vendors.
Selbst reproduzieren
# Out-of-the-box-ROS-Interop ohne XML / ohne Env-Tuning:
crates/ros2-rmw/interop/run_interop.sh # nutzt ros_defaults()
→ Zurück zur Übersicht · Weiter: Scaling