RMW_IMPLEMENTATION mismatch: publisher and subscriber on different middleware implementations cannot communicate
ID: ros2/rmw-implementation-mismatch-discovery-failure
Version Compatibility
| Version | Status | Introduced | Deprecated | Notes |
|---|---|---|---|---|
| Humble | active | — | — | — |
| Iron | active | — | — | — |
| Rolling | active | — | — | — |
Root Cause
ROS2 nodes must use the same RMW implementation (e.g., rmw_fastrtps_cpp vs rmw_cyclonedds_cpp) to discover each other and exchange messages, due to incompatible DDS protocol variants or transport layers.
generic中文
ROS2节点必须使用相同的RMW实现(如rmw_fastrtps_cpp与rmw_cyclonedds_cpp)才能相互发现并交换消息,因为DDS协议变体或传输层不兼容。
Official Documentation
https://docs.ros.org/en/rolling/How-To-Guides/Working-with-multiple-RMW-implementations.htmlWorkarounds
-
90% success Set the same RMW_IMPLEMENTATION environment variable for all nodes. For example, in a launch file or shell: export RMW_IMPLEMENTATION=rmw_fastrtps_cpp. Then restart all nodes.
Set the same RMW_IMPLEMENTATION environment variable for all nodes. For example, in a launch file or shell: export RMW_IMPLEMENTATION=rmw_fastrtps_cpp. Then restart all nodes.
-
85% success If using Cyclone DDS, install the rmw_cyclonedds_cpp package and set RMW_IMPLEMENTATION=rmw_cyclonedds_cpp on all machines. For Fast DDS, use rmw_fastrtps_cpp. Run 'ros2 doctor' to verify current RMW.
If using Cyclone DDS, install the rmw_cyclonedds_cpp package and set RMW_IMPLEMENTATION=rmw_cyclonedds_cpp on all machines. For Fast DDS, use rmw_fastrtps_cpp. Run 'ros2 doctor' to verify current RMW.
-
80% success To check current RMW: echo $RMW_IMPLEMENTATION. If unset, default is rmw_fastrtps_cpp. Use 'ros2 run demo_nodes_cpp talker' and 'listener' on the same RMW to test discovery.
To check current RMW: echo $RMW_IMPLEMENTATION. If unset, default is rmw_fastrtps_cpp. Use 'ros2 run demo_nodes_cpp talker' and 'listener' on the same RMW to test discovery.
中文步骤
Set the same RMW_IMPLEMENTATION environment variable for all nodes. For example, in a launch file or shell: export RMW_IMPLEMENTATION=rmw_fastrtps_cpp. Then restart all nodes.
If using Cyclone DDS, install the rmw_cyclonedds_cpp package and set RMW_IMPLEMENTATION=rmw_cyclonedds_cpp on all machines. For Fast DDS, use rmw_fastrtps_cpp. Run 'ros2 doctor' to verify current RMW.
To check current RMW: echo $RMW_IMPLEMENTATION. If unset, default is rmw_fastrtps_cpp. Use 'ros2 run demo_nodes_cpp talker' and 'listener' on the same RMW to test discovery.
Dead Ends
Common approaches that don't work:
-
95% fail
Changing ROS_DOMAIN_ID only helps with network segmentation, not RMW incompatibility. Nodes on different RMWs will still not discover each other even on the same domain.
-
90% fail
RMW mismatch is a protocol-level issue, not a network routing problem. Tuning discovery interfaces doesn't change the underlying DDS implementation incompatibility.
-
75% fail
This only sets the default RMW at build time. If environment variable RMW_IMPLEMENTATION is set differently at runtime, the build-time setting is overridden.