zerodds-ros2-bridge v1.0 — Spec Coverage
Source: docs/specs/zerodds-ros2-bridge-1.0.md
Implementation:
crates/rmw-zerodds-shim/· docs.rs — ROS 2 RMW shim (rmw_zerodds).
§1 Conformance levels
§1 L1-L6 conformance matrix
Spec: §1 — six levels (Wire/DDS/Bridging/Config/Auth/Multi-Tenant); L1–L4 mandatory, L5–L6 optional.
Repo: —
Tests: —
Status: n/a (informative) — assignment of the levels; the requirements are the items §2 to §12.
§2 CLI surface
§2 zerodds-ros2-shim subcommands
Spec: §2 — subcommands info/topics/qos/enclaves/validate/
selftest; options --config/--set/--check-config/--domain/
--version/--help; refused with a pointer: --runtime-config/--log-level/--enclave; exit codes 0/1/2/3/4.
Repo: crates/rmw-zerodds-shim/src/bin/zerodds-ros2-shim.rs,
crates/rmw-zerodds-shim/src/lib.rs.
Tests: crates/rmw-zerodds-shim/tests/shim_cli_e2e.rs::selftest_succeeds,
::topic_mangle_emits_rt_prefix, ::qos_sensor_data_is_best_effort,
::qos_unknown_profile_exits_nonzero, ::version_emits_one_line,
::validate_with_minimal_yaml_succeeds,
::info_includes_rmw_compat_marker,
::flags_of_the_old_shim_file_are_refused_with_their_replacement.
Status: done
§3 Config-file format
§3 The ros2 section of the runtime configuration
Spec: §3 — ros2.topic_mangling/custom_mangling.topic_prefix,
qos_profiles (the REP-2009 table, replaceable field by field),
topic_overrides (qos_profile or a qos map), time_based_filter; keys
rcl owns are refused; ENV substitution.
Repo: crates/rmw-zerodds-shim/src/ros2_config.rs (Ros2Config),
crates/rmw-zerodds-shim/src/lib.rs (rmw_zerodds_init,
rmw_zerodds_create_publisher/_subscription: effective_qos,
dds_topic), crates/dcps/src/runtime.rs (is_rmw_path),
packaging/linux/configs/ros2.yaml.example, man/man5/zerodds-ros2.yaml.5.
Tests: crates/rmw-zerodds-shim/src/ros2_config.rs::tests (6),
crates/rmw-zerodds-shim/tests/shim_cli_e2e.rs::topic_shows_the_configured_mangling_and_override,
::check_config_refuses_what_rcl_owns,
crates/dcps/tests/runtime_config_layering.rs::the_rmw_section_is_not_an_unknown_key_for_other_programs,
tools/traceability/tests/bridge_config_manpages.rs.
Status: done
§4 Wire protocol
§4 RTPS direct + REP-2007/2008/2009 mangling
Spec: §4 — native RTPS peer; wire format per zerodds-xcdr2-bindings-conformance-1.0
§3.
Repo: crates/rmw-zerodds-shim/src/lib.rs, crates/ros2-rmw/.
Tests: crates/rmw-zerodds-shim/tests/shim_cli_e2e.rs::selftest_succeeds.
Status: done
§4.1 RMW-API mapping rmw_init/create_*/publish/take/…
Spec: §4.1 — mapping rmw_* calls onto DCPS symbols.
Repo: crates/rmw-zerodds-shim/src/lib.rs, crates/ros2-rmw/.
Tests: crates/rmw-zerodds-shim/tests/shim_cli_e2e.rs::selftest_succeeds
(rmw_init+publish+take loopback).
Status: done
§4.2 Service pattern request-reply
Spec: §4.2 — rq/<service>Request/rr/<service>Reply with the types
<pkg>::srv::dds_::<Srv>_Request_/_Response_; correlation in the peer’s
form (Cyclone: guid/seq before the body; Fast DDS:
related_sample_identity, PID 0x800f); graph (ros2 service list,
ros2 node info).
Repo: crates/rmw-zerodds-shim/src/services.rs,
crates/rmw-zerodds-shim/rmw_c/rmw_zerodds.c (service calls, graph),
crates/dcps/src/runtime.rs (write_user_sample_related,
UserSample::Alive.related_sample_identity, participant_vendor),
crates/rtps/src/inline_qos.rs (PID_EPROSIMA_RELATED_SAMPLE_IDENTITY).
Tests: crates/rmw-zerodds-shim/rmw_c/run_ros2_services_test.sh
(Linux test host, Humble, demo_nodes_py AddTwoInts 2 + 3: server/client
zerodds↔︎zerodds, cyclonedds→zerodds, zerodds→cyclonedds,
fastrtps→zerodds, zerodds→fastrtps each Result of add_two_ints: 5),
crates/rmw-zerodds-shim/src/lib.rs::tests::{a_service_call_between_two_runtimes_correlates_by_the_related_identity, two_clients_in_one_runtime_each_get_their_own_reply},
crates/rmw-zerodds-shim/src/services.rs::tests::{the_cyclone_header_reads_in_both_byte_orders, user_data_keys_read_like_rmw_cyclonedds, a_full_table_drops_its_oldest_entry},
crates/dcps/src/runtime.rs::tests::the_related_identity_is_0x0083_or_eprosimas_0x800f_from_a_writer_that_means_it,
crates/rtps/src/inline_qos.rs::tests::the_eprosima_pid_is_found_exactly_and_not_as_0x0083,
crates/rmw-zerodds-shim/src/ros2_config.rs::tests::service_topics_are_the_rq_rr_names_of_the_other_rmws.
Status: done
§4.3 Action pattern (5 topics)
Spec: §4.3 — actions are composed of 5 topics; the shim wraps them without special mapping.
Repo: crates/ros2-rmw/src/action.rs (cluster-C action pattern with 5
topics).
Tests: crates/ros2-rmw/src/action.rs::tests: topic_set_has_exactly_5_topics,
goal_topic_uses_rq_prefix_and_send_goal_suffix,
cancel_topic_uses_rq_prefix_and_cancel_suffix,
result_topic_uses_rr_prefix_and_reply_suffix,
feedback_and_status_use_rt_prefix,
handles_action_name_without_leading_slash;
crates/ros2-rmw/tests/cross_vendor.rs::action_topic_set_matches_cyclone_format.
Status: done
§5 Topic mapping
§5.1 REP-2007 topic mangling rt/rq/rr prefix
Spec: §5.1 — /chatter → rt/chatter; service req → rq/...Request,
reply → rr/...Reply.
Repo: crates/rmw-zerodds-shim/src/lib.rs (mangling helper),
crates/ros2-rmw/.
Tests: crates/rmw-zerodds-shim/tests/shim_cli_e2e.rs::topic_mangle_emits_rt_prefix.
Status: done
§5.2 REP-2008 type mapping .msg/.srv → IDL
Spec: §5.2 — geometry_msgs/Pose → IDL:geometry_msgs/msg/dds_/Pose_:1.0.
Repo: crates/ros2-rmw/src/msg_to_idl.rs (REP-2008 type mapping
cluster-C), crates/ros2-rmw/src/type_mapping.rs.
Tests: crates/ros2-rmw/src/msg_to_idl.rs::tests: parse_simple_msg_three_fields,
parse_skips_comments_and_blank_lines, parse_array_spec,
parse_constants_are_ignored, idl_mapping_primitives,
idl_mapping_qualified_type, render_idl_produces_module_and_struct.
Status: done
§5.3 Bridge mode none
Spec: §5.3 — topic_mangling: "none" disables the prefix for
co-existence with non-ROS DDS apps.
Repo: crates/rmw-zerodds-shim/src/ros2_config.rs (Mangling::None,
dds_topic, dds_service_topics).
Tests: crates/rmw-zerodds-shim/src/ros2_config.rs::tests::{mangling_none_and_custom_name_the_dds_topic, service_topics_are_the_rq_rr_names_of_the_other_rmws},
crates/rmw-zerodds-shim/rmw_c/run_ros2_config_test.sh (5b: Cyclone reads
the topic without prefix from SEDP, Linux test host).
Status: done
§6 QoS translation
§6 REP-2009 QoS profiles sensor_data/services/parameters/…
Spec: §6 — sensor_data/services/parameters/parameter_events/default profile map.
Repo: crates/rmw-zerodds-shim/src/lib.rs (QoS-profile lookup),
crates/ros2-rmw/.
Tests: crates/rmw-zerodds-shim/tests/shim_cli_e2e.rs::qos_sensor_data_is_best_effort,
::qos_unknown_profile_exits_nonzero.
Status: done
§7 Security
§7.1 SROS2 enclaves → DDS-Security 1.2
Spec: §7.1 — enclave cert/key/permissions/governance onto dds.sec.*
plugin properties.
Repo: crates/security-runtime/src/profile.rs —
SecurityProfile::from_enclave_dir maps the sros2-keystore format
(identity_ca/cert/key/permissions_ca/governance.p7s/permissions.p7s)
onto a DDS-Security SecurityProfile; from_env loads it via
ZERODDS_SECURITY_DIR + ROS_DOMAIN_ID (C7 secure-by-default).
crates/rmw-zerodds-shim/src/lib.rs wires it (set → security participant,
set-but-invalid → hard error); crates/security-permissions/ covers
governance/permissions (DDS-Security 1.2 §9.4).
Tests: security-runtime enclave_dir_resolves_all_sros2_filenames,
enclave_dir_missing_cert_is_io_naming_cert; rmw-zerodds-shim
shim_cli_e2e (ZERODDS_SECURITY_DIR path).
Status: done — the SROS2 enclave is loaded as a mapping layer onto DDS-Security 1.2 (ADR 0012).
§7.2 ACL via permissions XML
Spec: §7.2 — permissions-XML-driven allow/deny per topic via
dds.sec.access.
Repo: crates/security-permissions/ — CMS-verified permissions XML
(DDS-Security 1.2 §9.4) via the dds.sec.access plugin
(is_publish_allowed/is_subscribe_allowed, check_create_datawriter/
check_create_datareader); the enclave permissions material
(permissions.p7s/governance.p7s) comes from from_enclave_dir (§7.1).
Tests: crates/security-permissions/src/xml.rs::tests::default_deny_without_explicit_tag, crates/security-permissions/src/plugin.rs::tests::{deny_on_non_matching_topic, deny_writer_when_only_subscribe_granted, permit_reader_on_subscribe_allowed_topic, allow_rule_and_deny_rule_decide_the_same_xml_differently, deny_rule_also_binds_the_reader_side} (allow and deny per topic, writer and reader side).
Status: done — permissions XML is enforced per topic via DDS-Security 1.2 access control (ADR 0012).
§8 Operations + observability
§8.1 rcutils logging + JSON
Spec: §8.1 — logging.format: "ros" uses rcutils, "json" is
structured.
Repo: crates/rmw-zerodds-shim/src/lib.rs (logging-format switch),
crates/ros2-rmw/src/json_log.rs (cluster-C rcutils + JSON-sink wire-up).
Tests: crates/ros2-rmw/src/json_log.rs::tests: level_strings_match_rcutils,
render_json_simple, render_json_escapes_quotes_and_backslash,
render_json_escapes_newline_and_tab, render_json_escapes_control_char.
Status: done
§8.2 Prometheus metrics via a separate exporter
Spec: §8.2 — a zerodds-ros2-metrics-exporter process with 8
counter/gauge families. Cluster-A wires the metrics endpoint directly into
the zerodds-ros2-shim diagnostics binary instead of as a separate
exporter.
Repo: —
Tests: —
Status: open — zerodds-ros2-shim metrics prints the name catalogue, but no test
in crates/rmw-zerodds-shim/tests/shim_cli_e2e.rs calls it, and no counter
is incremented on the rmw path.
### §8.3 OTLP rmw_publish/rmw_take spans
Spec: §8.3 — OTEL_EXPORTER_OTLP_ENDPOINT enables span emission.
Repo: —
Tests: —
Status: open — neither crates/rmw-zerodds-shim/ nor crates/ros2-rmw/ names
OTEL_EXPORTER_OTLP_ENDPOINT or emits a span.
## §9 Lifecycle
§9 RMW-API lifecycle (rcl-driven)
Spec: §9 — no own lifecycle; follows rcl_init/node_init/…; signal handling is done by rcl/rclcpp.
Repo: crates/rmw-zerodds-shim/src/lib.rs, crates/ros2-rmw/.
Tests: crates/rmw-zerodds-shim/tests/shim_cli_e2e.rs::selftest_succeeds
(rcl-sequence loopback).
Status: done
§10 Cross-vendor
§10 RTPS peer + FastRTPS/CycloneDDS/Connext
Spec: §10 — the ZeroDDS RMW shim is a native DDS peer; cross-vendor with rmw_fastrtps_cpp, rmw_cyclonedds_cpp and rmw_connextdds; ROS distros Humble, Iron, Jazzy, Rolling with a build target each.
Repo: crates/rmw-zerodds-shim/src/lib.rs, crates/ros2-rmw/.
Tests: crates/rmw-zerodds-shim/rmw_c/run_qos_translation_test.sh (Linux test host, Humble, with RMW_PUB/RMW_SUB: topics both ways with rmw_cyclonedds_cpp and rmw_fastrtps_cpp), crates/rmw-zerodds-shim/rmw_c/run_ros2_services_test.sh (services both ways with the same partners); crates/ros2-rmw/tests/cross_vendor.rs::{topic_mangling_matches_rmw_dds_common_convention, service_topic_pair_matches_cyclone_format, action_topic_set_matches_cyclone_format}; crates/rmw-zerodds-shim/tests/shim_cli_e2e.rs::{graph_shows_participant_and_discovery_mode, doctor_multicast_free_with_peers_ok}.
Status: partial — Fast DDS and Cyclone DDS are measured; rmw_connextdds and the Iron build target are missing (own items).
§10.1 Cross-vendor with rmw_connextdds
Spec: §10 — cross-vendor with rmw_connextdds (RTI).
Repo: —
Tests: —
Status: open — not measured; the spec itself says “not measured (not installed in the test env)”. A run of run_qos_translation_test.sh and run_ros2_services_test.sh against rmw_connextdds is missing.
§10.2 Build target for the ROS distro Iron
Spec: §10 — a build target per distro: Humble, Iron, Jazzy, Rolling; §11 — package ros-iron-rmw-zerodds-cpp and image zerodds/ros2-iron:1.0.
Repo: —
Tests: —
Status: open — packaging/linux/deb/build-rmw-deb.sh knows humble jazzy kilted rolling and refuses any other name; ci/full.yml::ros-rmw-deb builds the same four. packaging/docker/ros2-shim/Dockerfile names the variant iron, whose package build the script refuses (not built, read from the script).
§11 Packaging
§11 librmw_zerodds_cpp.so + diagnostics binary
Spec: §11 — librmw_zerodds_cpp.so (library, not a daemon); a .deb per
ROS distro; zerodds-ros2-shim diagnostics binary; configs/Docker; manuals.
Repo: packaging/linux/deb/build-rmw-deb.sh (ros-<distro>-rmw-zerodds-cpp),
ci/full.yml (ros-rmw-deb),
packaging/linux/deb/assemble-debs.sh (zerodds-ros2),
packaging/linux/rpm/zerodds.spec (%files ros2),
packaging/macos/homebrew/zerodds-ros2.rb,
packaging/windows/services/Install-Services.ps1,
packaging/docker/ros2-shim/,
packaging/linux/configs/ros2.yaml.example,
man/man1/zerodds-ros2-shim.1, man/man5/zerodds-ros2.yaml.5.
Tests: tools/traceability/tests/deployment_layout.rs::the_ros2_diagnostics_cli_is_not_installed_as_a_service;
crates/rmw-zerodds-shim/src/ros2_config.rs::tests::the_shipped_example_reads_as_it_says
(the shipped example configuration through the real parser, with the values it states);
tools/traceability/tests/bridge_config_manpages.rs::{every_example_key_is_documented_in_the_man_page, the_man_page_names_no_key_the_example_does_not_declare, the_pre_spec_vocabulary_is_gone_from_pages_and_examples, every_man_page_names_its_parser_and_what_an_unknown_key_does}
(the manual page and the example file name the same keys);
crates/rmw-zerodds-shim/tests/ros2_deb_package.rs::{the_package_is_named_after_the_distro_and_the_distro_is_checked, the_package_carries_the_library_the_index_entries_and_package_xml, the_ros2_image_installs_the_rmw_from_the_package, the_ros2_deb_description_points_at_the_rmw_package, the_endpoint_info_scripts_exit_non_zero_on_a_mismatch},
crates/rmw-zerodds-shim/tests/ros2_deb_ci_job.rs::{the_ci_job_builds_the_package_in_the_ros_image_and_checks_its_file_list, the_endpoint_info_checks_run_after_the_round_trip}
(package name, install layout, file list out of the ament install, CI job and image — checkable without a ROS 2 installation);
executor: ci/full.yml::ros-rmw-deb (weekly) runs as a matrix, once per distro (humble, jazzy, kilted, rolling) in that distro’s ROS 2 image, checks the .deb’s file list, installs it back into the ROS prefix with dpkg -i, and then exchanges std_msgs/String between two processes with packaging/linux/deb/rmw-pubsub-check.py; packaging/linux/deb/rmw-type-hash-check.py checks the type hash a peer process reads (against the package itself and both ways against rmw_fastrtps_cpp, not on Humble), and on Rolling packaging/linux/deb/rmw-service-info-check.py the servers and clients of a service.
Status: partial — librmw_zerodds_cpp.so is in the deb package ros-<distro>-rmw-zerodds-cpp (built from crates/rmw-zerodds-shim/ament), and the image installs it from that package; the diagnostics binary, configuration and manual pages ship. The weekly job ros-rmw-deb and the image build have not run. Missing: publication on the packages.ros.org mirror (§11.1) and package and image for Iron (§10.2).
§11.1 Publication on the packages.ros.org mirror
Spec: §11 — one .deb per ROS distro, ros-humble-rmw-zerodds-cpp, ros-iron-rmw-zerodds-cpp etc., on the packages.ros.org mirror.
Repo: —
Tests: —
Status: open — packaging/linux/deb/build-rmw-deb.sh builds the package; no job and no script uploads it to packages.ros.org.
§12 Testing
§12.1 Unit tests per module
Spec: §12.1 — mangling/qos_profile/node_registry/service_pair/enclave, ≥ 5 tests each.
Repo: crates/rmw-zerodds-shim/src/lib.rs (inline tests),
crates/ros2-rmw/.
Tests: crates/ros2-rmw/src/topic_mangling.rs::tests (11 tests, among them
mangle_each_kind_uses_correct_prefix, demangle_round_trips_all_kinds),
crates/ros2-rmw/src/service.rs::tests (5),
crates/ros2-rmw/src/action.rs::tests (6),
crates/ros2-rmw/src/msg_to_idl.rs::tests (7),
crates/ros2-rmw/src/json_log.rs::tests (5),
crates/rmw-zerodds-shim/src/lib.rs::tests (24, among them rmw_codes_match_rep_2007,
type_hash_sha256_is_deterministic, event_driven_wait_roundtrip_inprocess);
crates/rmw-zerodds-shim/src/ros2_config.rs::tests (6).
Status: done
§12.2 Integration tests bridge_e2e
Spec: §12.2 — ROS-2 talker/listener with
RMW_IMPLEMENTATION=rmw_zerodds_cpp; selftest with a service call.
Repo: crates/rmw-zerodds-shim/src/bin/zerodds-ros2-shim.rs.
Tests: crates/rmw-zerodds-shim/tests/shim_cli_e2e.rs::selftest_succeeds,
::topic_mangle_emits_rt_prefix, ::qos_sensor_data_is_best_effort,
::qos_unknown_profile_exits_nonzero, ::version_emits_one_line,
::validate_with_minimal_yaml_succeeds,
::info_includes_rmw_compat_marker.
Status: done
§12.3 Multi-vendor cross_vendor.rs
Spec: §12.3 — topics via run_qos_translation_test.sh with RMW_PUB/RMW_SUB against rmw_cyclonedds_cpp and rmw_fastrtps_cpp both ways; services via run_ros2_services_test.sh; security via run_ros2_security_test.sh; cross_vendor.rs checks the wire conventions of rmw_cyclonedds_cpp without ROS.
Repo: crates/rmw-zerodds-shim/rmw_c/, crates/ros2-rmw/tests/cross_vendor.rs.
Tests: crates/rmw-zerodds-shim/rmw_c/run_qos_translation_test.sh (RMW_PUB/RMW_SUB), crates/rmw-zerodds-shim/rmw_c/run_ros2_services_test.sh, crates/rmw-zerodds-shim/rmw_c/run_ros2_security_test.sh; crates/ros2-rmw/tests/cross_vendor.rs::{topic_mangling_matches_rmw_dds_common_convention, service_topic_pair_matches_cyclone_format, action_topic_set_matches_cyclone_format}; the live cases in that file are #[ignore].
Status: done
§13 Cross-references
§13 Related library + REPs + DDS-Security
Spec: §13 — library crates/ros2-rmw//crates/rmw-zerodds-shim/,
REP-2007/2008/2009 + SROS2, wire format, deployment, DDS-Security 1.2.
Repo: —
Tests: —
Status: n/a (informative) — reference list.
§14 Versioning
§14 SemVer bump rules
Spec: §14 — patch=bugfixes, minor=additive QoS profile / ROS distro, major=RMW-API breaking.
Repo: —
Tests: —
Status: n/a (informative) — rule for assigning the version number of a release, not a property of the daemon.
Audit status
17 done / 2 partial / 5 open / 0 blocked / 3 n/a (informative).
Open items: zerodds-ros2-bridge-1.0.open.en.md.
zerodds-ros2-bridge v1.0 — Spec-Coverage
Quelle: docs/specs/zerodds-ros2-bridge-1.0.md
Implementation:
crates/rmw-zerodds-shim/· docs.rs — ROS-2-RMW-Shim (rmw_zerodds).
§1 Conformance-Levels
§1 L1-L6 Conformance-Matrix
Spec: §1 — sechs Levels (Wire/DDS/Bridging/Config/Auth/Multi- Tenant); L1–L4 Pflicht, L5–L6 optional.
Repo: —
Tests: —
Status: n/a (informative) — Zuordnung der Levels; die Anforderungen sind die Items §2 bis §12.
§2 CLI-Surface
§2 zerodds-ros2-shim Subcommands
Spec: §2 — Subcommands info/topics/qos/enclaves/validate/
selftest; Optionen --config/--set/--check-config/--domain/
--version/--help; abgelehnt mit Verweis: --runtime-config/--log-level/--enclave; Exit-Codes 0/1/2/3/4.
Repo: crates/rmw-zerodds-shim/src/bin/zerodds-ros2-shim.rs,
crates/rmw-zerodds-shim/src/lib.rs.
Tests: crates/rmw-zerodds-shim/tests/shim_cli_e2e.rs::selftest_succeeds,
::topic_mangle_emits_rt_prefix,
::qos_sensor_data_is_best_effort,
::qos_unknown_profile_exits_nonzero,
::version_emits_one_line,
::validate_with_minimal_yaml_succeeds,
::info_includes_rmw_compat_marker,
::flags_of_the_old_shim_file_are_refused_with_their_replacement.
Status: done
§3 Config-File-Format
§3 ros2-Sektion der Runtime-Konfiguration
Spec: §3 — ros2.topic_mangling/custom_mangling.topic_prefix,
qos_profiles (REP-2009-Tabelle, feldweise ersetzbar), topic_overrides
(qos_profile oder qos-Map), time_based_filter; Schlüssel, die rcl
trägt, abgelehnt; ENV-Substitution.
Repo: crates/rmw-zerodds-shim/src/ros2_config.rs (Ros2Config),
crates/rmw-zerodds-shim/src/lib.rs (rmw_zerodds_init,
rmw_zerodds_create_publisher/_subscription: effective_qos,
dds_topic), crates/dcps/src/runtime.rs (is_rmw_path),
packaging/linux/configs/ros2.yaml.example, man/man5/zerodds-ros2.yaml.5.
Tests: crates/rmw-zerodds-shim/src/ros2_config.rs::tests (6),
crates/rmw-zerodds-shim/tests/shim_cli_e2e.rs::topic_shows_the_configured_mangling_and_override,
::check_config_refuses_what_rcl_owns,
crates/dcps/tests/runtime_config_layering.rs::the_rmw_section_is_not_an_unknown_key_for_other_programs,
tools/traceability/tests/bridge_config_manpages.rs.
Status: done
§4 Wire-Protocol
§4 RTPS direkt + REP-2007/2008/2009-Mangling
Spec: §4 — Native RTPS-Peer; Wire-Format gemäß zerodds-xcdr2- bindings-conformance-1.0 §3.
Repo: crates/rmw-zerodds-shim/src/lib.rs,
crates/ros2-rmw/.
Tests: crates/rmw-zerodds-shim/tests/shim_cli_e2e.rs::selftest_succeeds.
Status: done
§4.1 RMW-API-Mapping rmw_init/create_*/publish/take/…
Spec: §4.1 — Mapping rmw_*-Calls auf DCPS-Symbole.
Repo: crates/rmw-zerodds-shim/src/lib.rs,
crates/ros2-rmw/.
Tests: crates/rmw-zerodds-shim/tests/shim_cli_e2e.rs::selftest_succeeds
(rmw_init+publish+take Loopback).
Status: done
§4.2 Service-Pattern Request-Reply
Spec: §4.2 — rq/<service>Request/rr/<service>Reply mit den Typen
<pkg>::srv::dds_::<Srv>_Request_/_Response_; Korrelation in der Form
des Gegenübers (Cyclone: guid/seq vor dem Body; Fast DDS:
related_sample_identity, PID 0x800f); Graph (ros2 service list/type,
ros2 node info).
Repo: crates/rmw-zerodds-shim/src/services.rs,
crates/rmw-zerodds-shim/rmw_c/rmw_zerodds.c (Service-Aufrufe, Graph),
crates/dcps/src/runtime.rs (write_user_sample_related,
UserSample::Alive.related_sample_identity, participant_vendor),
crates/rtps/src/inline_qos.rs (PID_EPROSIMA_RELATED_SAMPLE_IDENTITY).
Tests: crates/rmw-zerodds-shim/rmw_c/run_ros2_services_test.sh
(Linux-Testhost, Humble, demo_nodes_py AddTwoInts 2 + 3: Server/Client
zerodds↔︎zerodds, cyclonedds→zerodds, zerodds→cyclonedds,
fastrtps→zerodds, zerodds→fastrtps je Result of add_two_ints: 5),
crates/rmw-zerodds-shim/src/lib.rs::tests::{a_service_call_between_two_runtimes_correlates_by_the_related_identity, two_clients_in_one_runtime_each_get_their_own_reply},
crates/rmw-zerodds-shim/src/services.rs::tests::{the_cyclone_header_reads_in_both_byte_orders, user_data_keys_read_like_rmw_cyclonedds, a_full_table_drops_its_oldest_entry},
crates/dcps/src/runtime.rs::tests::the_related_identity_is_0x0083_or_eprosimas_0x800f_from_a_writer_that_means_it,
crates/rtps/src/inline_qos.rs::tests::the_eprosima_pid_is_found_exactly_and_not_as_0x0083,
crates/rmw-zerodds-shim/src/ros2_config.rs::tests::service_topics_are_the_rq_rr_names_of_the_other_rmws.
Status: done
§4.3 Action-Pattern (5 Topics)
Spec: §4.3 — Actions sind composit aus 5 Topics; Shim wraps ohne Sondermapping.
Repo: crates/ros2-rmw/src/action.rs (Cluster-C Action-Pattern
mit 5 Topics).
Tests: crates/ros2-rmw/src/action.rs::tests: topic_set_has_exactly_5_topics,
goal_topic_uses_rq_prefix_and_send_goal_suffix,
cancel_topic_uses_rq_prefix_and_cancel_suffix,
result_topic_uses_rr_prefix_and_reply_suffix,
feedback_and_status_use_rt_prefix,
handles_action_name_without_leading_slash;
crates/ros2-rmw/tests/cross_vendor.rs::action_topic_set_matches_cyclone_format.
Status: done
§5 Topic-Mapping
§5.1 REP-2007 Topic-Mangling rt/rq/rr-Prefix
Spec: §5.1 — /chatter → rt/chatter; Service-Req → rq/...Request,
Reply → rr/...Reply.
Repo: crates/rmw-zerodds-shim/src/lib.rs (mangling helper),
crates/ros2-rmw/.
Tests: crates/rmw-zerodds-shim/tests/shim_cli_e2e.rs::topic_mangle_emits_rt_prefix.
Status: done
§5.2 REP-2008 Type-Mapping .msg/.srv → IDL
Spec: §5.2 — geometry_msgs/Pose → IDL:geometry_msgs/msg/dds_/ Pose_:1.0.
Repo: crates/ros2-rmw/src/msg_to_idl.rs (REP-2008 Type-Mapping
Cluster-C),
crates/ros2-rmw/src/type_mapping.rs.
Tests: crates/ros2-rmw/src/msg_to_idl.rs::tests: parse_simple_msg_three_fields,
parse_skips_comments_and_blank_lines, parse_array_spec,
parse_constants_are_ignored, idl_mapping_primitives,
idl_mapping_qualified_type, render_idl_produces_module_and_struct.
Status: done
§5.3 Bridge-Mode none
Spec: §5.3 — topic_mangling: "none" deaktiviert Prefix für Co-
Existence mit Non-ROS-DDS-Apps.
Repo: crates/rmw-zerodds-shim/src/ros2_config.rs (Mangling::None,
dds_topic, dds_service_topics).
Tests: crates/rmw-zerodds-shim/src/ros2_config.rs::tests::{mangling_none_and_custom_name_the_dds_topic, service_topics_are_the_rq_rr_names_of_the_other_rmws},
crates/rmw-zerodds-shim/rmw_c/run_ros2_config_test.sh (5b: Cyclone liest
den Topic ohne Präfix aus SEDP, Linux-Testhost).
Status: done
§6 QoS-Translation
§6 REP-2009 QoS-Profile sensor_data/services/parameters/…
Spec: §6 — sensor_data/services/parameters/parameter_events/ default-Profile-Map.
Repo: crates/rmw-zerodds-shim/src/lib.rs (QoS-Profile-Lookup),
crates/ros2-rmw/.
Tests: crates/rmw-zerodds-shim/tests/shim_cli_e2e.rs::qos_sensor_data_is_best_effort,
::qos_unknown_profile_exits_nonzero.
Status: done
§7 Security
§7.1 SROS2-Enclaves → DDS-Security 1.2
Spec: §7.1 — Enclave-Cert/Key/Permissions/Governance auf
dds.sec.*-Plugin-Properties.
Repo: crates/security-runtime/src/profile.rs —
SecurityProfile::from_enclave_dir mappt das sros2-keystore-Format
(identity_ca/cert/key/permissions_ca/governance.p7s/permissions.p7s)
auf einen DDS-Security-SecurityProfile; from_env lädt via
ZERODDS_SECURITY_DIR + ROS_DOMAIN_ID (C7 secure-by-default).
crates/rmw-zerodds-shim/src/lib.rs verdrahtet es (gesetzt →
Security-Participant, gesetzt-aber-invalid → harter Fehler);
crates/security-permissions/ deckt Governance/Permissions (DDS-Security
1.2 §9.4).
Tests: security-runtime enclave_dir_resolves_all_sros2_filenames,
enclave_dir_missing_cert_is_io_naming_cert; rmw-zerodds-shim
shim_cli_e2e (ZERODDS_SECURITY_DIR-Pfad).
Status: done — SROS2-Enclave wird als Mapping-Layer auf DDS-Security 1.2 geladen (ADR 0012).
§7.2 ACL via Permissions-XML
Spec: §7.2 — Permissions-XML-Driven allow/deny pro Topic via
dds.sec.access.
Repo: crates/security-permissions/ — CMS-verifiziertes Permissions-XML
(DDS-Security 1.2 §9.4) über das dds.sec.access-Plugin
(is_publish_allowed/is_subscribe_allowed, check_create_datawriter/
check_create_datareader); das Enclave-Permissions-Material
(permissions.p7s/governance.p7s) kommt aus from_enclave_dir (§7.1).
Tests: crates/security-permissions/src/xml.rs::tests::default_deny_without_explicit_tag, crates/security-permissions/src/plugin.rs::tests::{deny_on_non_matching_topic, deny_writer_when_only_subscribe_granted, permit_reader_on_subscribe_allowed_topic, allow_rule_and_deny_rule_decide_the_same_xml_differently, deny_rule_also_binds_the_reader_side} (Erlaubnis und Verbot pro Topic, Schreiber- und Leserseite).
Status: done — Permissions-XML wird via DDS-Security-1.2-Access-Control pro Topic durchgesetzt (ADR 0012).
§8 Operations + Observability
§8.1 rcutils-Logging + JSON
Spec: §8.1 — logging.format: "ros" nutzt rcutils, "json"
strukturiert.
Repo: crates/rmw-zerodds-shim/src/lib.rs (Logging-Format-Switch),
crates/ros2-rmw/src/json_log.rs (Cluster-C rcutils + JSON-Sink-
Wireup).
Tests: crates/ros2-rmw/src/json_log.rs::tests: level_strings_match_rcutils,
render_json_simple, render_json_escapes_quotes_and_backslash,
render_json_escapes_newline_and_tab, render_json_escapes_control_char.
Status: done
§8.2 Prometheus-Metrics via separater Exporter
Spec: §8.2 — zerodds-ros2-metrics-exporter-Prozess mit 8
Counter/Gauge-Familien. Cluster-A wired den Metrics-Endpoint direkt im
zerodds-ros2-shim-Diagnose-Binary statt als separaten Exporter.
Repo: —
Tests: —
Status: open — zerodds-ros2-shim metrics druckt den Namens-Katalog, aber kein
Test in crates/rmw-zerodds-shim/tests/shim_cli_e2e.rs ruft ihn auf, und
kein Zähler wird im rmw-Pfad hochgezählt.
### §8.3 OTLP rmw_publish/rmw_take Spans
Spec: §8.3 — OTEL_EXPORTER_OTLP_ENDPOINT aktiviert Span-Emission.
Repo: —
Tests: —
Status: open — weder crates/rmw-zerodds-shim/ noch crates/ros2-rmw/ nennt
OTEL_EXPORTER_OTLP_ENDPOINT oder emittiert einen Span.
## §9 Lifecycle
§9 RMW-API-Lifecycle (rcl-driven)
Spec: §9 — kein eigener Lifecycle; folgt rcl_init/node_init/…; Signal-Handling übernimmt rcl/rclcpp.
Repo: crates/rmw-zerodds-shim/src/lib.rs,
crates/ros2-rmw/.
Tests: crates/rmw-zerodds-shim/tests/shim_cli_e2e.rs::selftest_succeeds
(rcl-Sequence Loopback).
Status: done
§10 Cross-Vendor
§10 RTPS-Peer + FastRTPS/CycloneDDS/Connext
Spec: §10 — ZeroDDS-RMW-Shim ist nativer DDS-Peer; Cross-Vendor mit rmw_fastrtps_cpp, rmw_cyclonedds_cpp und rmw_connextdds; ROS-Distros Humble, Iron, Jazzy, Rolling mit je eigenem Build-Ziel.
Repo: crates/rmw-zerodds-shim/src/lib.rs,
crates/ros2-rmw/.
Tests: crates/rmw-zerodds-shim/rmw_c/run_qos_translation_test.sh (Linux-Testhost, Humble, mit RMW_PUB/RMW_SUB: Topics in beide Richtungen mit rmw_cyclonedds_cpp und rmw_fastrtps_cpp), crates/rmw-zerodds-shim/rmw_c/run_ros2_services_test.sh (Services in beide Richtungen mit denselben Partnern); crates/ros2-rmw/tests/cross_vendor.rs::{topic_mangling_matches_rmw_dds_common_convention, service_topic_pair_matches_cyclone_format, action_topic_set_matches_cyclone_format}; crates/rmw-zerodds-shim/tests/shim_cli_e2e.rs::{graph_shows_participant_and_discovery_mode, doctor_multicast_free_with_peers_ok}.
Status: partial — Fast DDS und Cyclone DDS sind gemessen; rmw_connextdds und das Build-Ziel Iron fehlen (eigene Items).
§10.1 Cross-Vendor mit rmw_connextdds
Spec: §10 — Cross-Vendor mit rmw_connextdds (RTI).
Repo: —
Tests: —
Status: open — nicht gemessen; die Spec selbst nennt es „not measured (not installed in the test env)“. Es fehlt ein Lauf von run_qos_translation_test.sh und run_ros2_services_test.sh gegen rmw_connextdds.
§10.2 Build-Ziel ROS-Distro Iron
Spec: §10 — eigenes Build-Ziel pro Distro: Humble, Iron, Jazzy, Rolling; §11 — Paket ros-iron-rmw-zerodds-cpp und Image zerodds/ros2-iron:1.0.
Repo: —
Tests: —
Status: open — packaging/linux/deb/build-rmw-deb.sh kennt humble jazzy kilted rolling und lehnt jeden anderen Namen ab; ci/full.yml::ros-rmw-deb baut dieselben vier. packaging/docker/ros2-shim/Dockerfile nennt die Variante iron, deren Paketbau das Skript ablehnt (nicht gebaut, aus dem Skript gelesen).
§11 Packaging
§11 librmw_zerodds_cpp.so + Diagnose-Binary
Spec: §11 — librmw_zerodds_cpp.so (Library, kein Daemon); .deb
pro ROS-Distro; zerodds-ros2-shim Diagnose-Binary; Configs/Docker;
Manuals.
Repo: packaging/linux/deb/build-rmw-deb.sh (ros-<distro>-rmw-zerodds-cpp),
ci/full.yml (ros-rmw-deb),
packaging/linux/deb/assemble-debs.sh (zerodds-ros2),
packaging/linux/rpm/zerodds.spec (%files ros2),
packaging/macos/homebrew/zerodds-ros2.rb,
packaging/windows/services/Install-Services.ps1,
packaging/docker/ros2-shim/,
packaging/linux/configs/ros2.yaml.example,
man/man1/zerodds-ros2-shim.1,
man/man5/zerodds-ros2.yaml.5.
Tests: tools/traceability/tests/deployment_layout.rs::the_ros2_diagnostics_cli_is_not_installed_as_a_service;
crates/rmw-zerodds-shim/src/ros2_config.rs::tests::the_shipped_example_reads_as_it_says
(die ausgelieferte Beispiel-Konfiguration durch den echten Parser, mit den Werten, die sie nennt);
tools/traceability/tests/bridge_config_manpages.rs::{every_example_key_is_documented_in_the_man_page, the_man_page_names_no_key_the_example_does_not_declare, the_pre_spec_vocabulary_is_gone_from_pages_and_examples, every_man_page_names_its_parser_and_what_an_unknown_key_does}
(die Handbuchseite und die Beispieldatei nennen dieselben Schlüssel);
crates/rmw-zerodds-shim/tests/ros2_deb_package.rs::{the_package_is_named_after_the_distro_and_the_distro_is_checked, the_package_carries_the_library_the_index_entries_and_package_xml, the_ros2_image_installs_the_rmw_from_the_package, the_ros2_deb_description_points_at_the_rmw_package, the_endpoint_info_scripts_exit_non_zero_on_a_mismatch},
crates/rmw-zerodds-shim/tests/ros2_deb_ci_job.rs::{the_ci_job_builds_the_package_in_the_ros_image_and_checks_its_file_list, the_endpoint_info_checks_run_after_the_round_trip}
(Paketname, Installationspfad, Dateiliste aus dem ament-Install, CI-Job und Image, ohne ROS-2-Installation prüfbar);
Ausführer: ci/full.yml::ros-rmw-deb (weekly) läuft als Matrix einmal pro Distro (humble, jazzy, kilted, rolling) im jeweiligen ROS-2-Image, prüft die Dateiliste des .deb, installiert es mit dpkg -i zurück in den ROS-Präfix und tauscht dann mit packaging/linux/deb/rmw-pubsub-check.py std_msgs/String zwischen zwei Prozessen aus; packaging/linux/deb/rmw-type-hash-check.py prüft den Typ-Hash, den ein zweiter Prozess liest (gegen das Paket selbst und in beiden Richtungen gegen rmw_fastrtps_cpp, nicht auf Humble), und auf Rolling packaging/linux/deb/rmw-service-info-check.py Server und Clients eines Service.
Status: partial — librmw_zerodds_cpp.so liegt im deb-Paket ros-<distro>-rmw-zerodds-cpp (gebaut aus crates/rmw-zerodds-shim/ament), das Image installiert es aus diesem Paket; Diagnose-Binary, Konfiguration und Handbuchseiten sind ausgeliefert. Der wöchentliche Job ros-rmw-deb und der Image-Bau sind nicht gelaufen. Es fehlen die Veröffentlichung auf dem packages.ros.org-Spiegel (§11.1) und Paket und Image für Iron (§10.2).
§11.1 Veröffentlichung auf dem packages.ros.org-Spiegel
Spec: §11 — ein .deb pro ROS-Distro, ros-humble-rmw-zerodds-cpp, ros-iron-rmw-zerodds-cpp usw., auf dem packages.ros.org-Spiegel.
Repo: —
Tests: —
Status: open — packaging/linux/deb/build-rmw-deb.sh baut das Paket; kein Job und kein Skript lädt es auf packages.ros.org hoch.
§12 Testing
§12.1 Unit-Tests pro Modul
Spec: §12.1 — mangling/qos_profile/node_registry/service_pair/ enclave je ≥ 5 Tests.
Repo: crates/rmw-zerodds-shim/src/lib.rs (inline tests),
crates/ros2-rmw/.
Tests: crates/ros2-rmw/src/topic_mangling.rs::tests (11 Tests, darunter
mangle_each_kind_uses_correct_prefix, demangle_round_trips_all_kinds),
crates/ros2-rmw/src/service.rs::tests (5),
crates/ros2-rmw/src/action.rs::tests (6),
crates/ros2-rmw/src/msg_to_idl.rs::tests (7),
crates/ros2-rmw/src/json_log.rs::tests (5),
crates/rmw-zerodds-shim/src/lib.rs::tests (24, darunter rmw_codes_match_rep_2007,
type_hash_sha256_is_deterministic, event_driven_wait_roundtrip_inprocess);
crates/rmw-zerodds-shim/src/ros2_config.rs::tests (6).
Status: done
§12.2 Integration-Tests bridge_e2e
Spec: §12.2 — ROS-2-talker/listener mit RMW_IMPLEMENTATION= rmw_zerodds_cpp; selftest mit Service-Call.
Repo: crates/rmw-zerodds-shim/src/bin/zerodds-ros2-shim.rs.
Tests: crates/rmw-zerodds-shim/tests/shim_cli_e2e.rs::selftest_succeeds,
::topic_mangle_emits_rt_prefix,
::qos_sensor_data_is_best_effort,
::qos_unknown_profile_exits_nonzero,
::version_emits_one_line,
::validate_with_minimal_yaml_succeeds,
::info_includes_rmw_compat_marker.
Status: done
§12.3 Multi-Vendor cross_vendor.rs
Spec: §12.3 — Topics über run_qos_translation_test.sh mit RMW_PUB/RMW_SUB gegen rmw_cyclonedds_cpp und rmw_fastrtps_cpp in beide Richtungen; Services über run_ros2_services_test.sh; Security über run_ros2_security_test.sh; cross_vendor.rs prüft die Wire-Konventionen von rmw_cyclonedds_cpp ohne ROS.
Repo: crates/rmw-zerodds-shim/rmw_c/, crates/ros2-rmw/tests/cross_vendor.rs.
Tests: crates/rmw-zerodds-shim/rmw_c/run_qos_translation_test.sh (RMW_PUB/RMW_SUB), crates/rmw-zerodds-shim/rmw_c/run_ros2_services_test.sh, crates/rmw-zerodds-shim/rmw_c/run_ros2_security_test.sh; crates/ros2-rmw/tests/cross_vendor.rs::{topic_mangling_matches_rmw_dds_common_convention, service_topic_pair_matches_cyclone_format, action_topic_set_matches_cyclone_format}; die Live-Fälle in dieser Datei sind #[ignore].
Status: done
§13 Cross-References
§13 Verwandte Library + REPs + DDS-Security
Spec: §13 — Library crates/ros2-rmw//crates/rmw-zerodds-shim/,
REP-2007/2008/2009 + SROS2, Wire-Format, Deployment, DDS-Security 1.2.
Repo: —
Tests: —
Status: n/a (informative) — Verweisliste.
§14 Versioning
§14 SemVer-Bump-Regeln
Spec: §14 — Patch=Bugfixes, Minor=additive QoS-Profile / ROS-Distro, Major=RMW-API-Breaking.
Repo: —
Tests: —
Status: n/a (informative) — Regel für die Vergabe der Versionsnummer eines Release, keine Eigenschaft des Daemons.
Audit-Status
17 done / 2 partial / 5 open / 0 blocked / 3 n/a (informative).
Offene Punkte: zerodds-ros2-bridge-1.0.open.md.