Three options for ROS 2 communication, from standard DDS to pure-Rust Zenoh.
ROS 2 (DDS)
ROS 2 (Zenoh)
ros-z
API
rclcpp / rclpy
rclcpp / rclpy
Rust
Transport
DDS (FastDDS, Cyclone)
Eclipse Zenoh
Eclipse Zenoh
RMW plugin
rmw_fastrtps_cpp / rmw_cyclonedds_cpp
rmw_zenoh_cpp
No RMW — direct Zenoh API
ROS 2 install required
Yes
Yes
No
ROS 2 (Zenoh) means rmw_zenoh_cpp: a drop-in RMW plugin that gives existing rclcpp/rclpy nodes a Zenoh transport without changing any application code. ros-z is an independent Rust API built directly on Zenoh — no ROS 2 installation needed.
Use rmw_zenoh_cpp when you have an existing rclcpp/rclpy codebase and want Zenoh transport without rewriting anything. You get the full ROS 2 feature set — executors, composable nodes, lifecycle — with Zenoh's routing and cross-network capabilities replacing DDS.
Use ros-z when you are writing new code in Rust and want a minimal, dependency-light library. No ROS 2 installation, no DDS, no executor overhead. ros-z nodes interoperate transparently with rmw_zenoh_cpp nodes over the same Zenoh router.