# RMW_IMPLEMENTATION mismatch: publisher and subscriber on different middleware implementations cannot communicate

- **ID:** `ros2/rmw-implementation-mismatch-discovery-failure`
- **Domain:** ros2
- **Category:** network_error
- **Verification:** ai_generated
- **Fix Rate:** 85%

## 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.

## Version Compatibility

| Version | Status | Introduced | Deprecated |
|---------|--------|------------|------------|
| Humble | active | — | — |
| Iron | active | — | — |
| Rolling | active | — | — |

## Workarounds

1. **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.** (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.
   ```
2. **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.** (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.
   ```
3. **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.** (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.
   ```

## Dead Ends

- **** — 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. (95% fail)
- **** — RMW mismatch is a protocol-level issue, not a network routing problem. Tuning discovery interfaces doesn't change the underlying DDS implementation incompatibility. (90% 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. (75% fail)
