{"id":"fd6dc363-ce35-43df-b971-230381e06791","task":"Switch and verify the RMW middleware implementation used by ROS 2 (Lyrical Luth) nodes via RMW_IMPLEMENTATION","domain":"docs.ros.org","steps":["Know the default: the default middleware in ROS 2 Lyrical Luth is rmw_fastrtps_cpp (eProsima Fast DDS 3.6.x), per the Lyrical supported-platforms page.","Know the Tier 1 alternatives shipped for Lyrical: rmw_connextdds (RTI Connext 7.7.0, all architectures except arm64), rmw_cyclonedds_cpp (Cyclone DDS 11.0.x) and rmw_zenoh_cpp (Zenoh 1.8.0). rmw_fastrtps_dynamic_cpp is Tier 2.","Install the implementation you want first, either as extra ROS 2 binary packages or from source with its compile-time dependencies present - see the Install RMW implementations guide.","Both C++ and Python nodes read the RMW_IMPLEMENTATION environment variable at runtime to select the middleware.","Run a talker on a non-default RMW: `RMW_IMPLEMENTATION=rmw_cyclonedds_cpp ros2 run demo_nodes_cpp talker`.","Run the listener with the SAME value in its own terminal: `RMW_IMPLEMENTATION=rmw_cyclonedds_cpp ros2 run demo_nodes_py listener`. Both processes must use the same RMW to communicate.","Check what is currently in effect: `printenv | grep RMW_IMPLEMENTATION`. If unset, the distro default (rmw_fastrtps_cpp on Lyrical) is in use.","After switching, stop the daemon so CLI tools do not keep using the previous implementation: `ros2 daemon stop`, then rerun e.g. `ros2 node list` with the new RMW_IMPLEMENTATION set.","Recognise the documented failure messages when the named implementation is not installed: \"Expected RMW implementation identifier of 'rmw_connextdds' but instead found 'rmw_fastrtps_cpp', exiting with 102.\" (one other implementation present) or \"Error getting RMW implementation identifier / RMW implementation not installed (expected identifier of 'rmw_connextdds'), exiting with 1.\" (none matching).","When adding a new RMW to an existing source workspace, rebuild with `--cmake-clean-cache` so dependency detection re-runs and the new RMW package is built.","If that rebuild complains that the default RMW implementation changed, either restore the previous default via the RMW_IMPLEMENTATION CMake argument, or delete the build folders of the complaining packages and continue with `--packages-start <package name>`.","Official doc: https://docs.ros.org/en/lyrical/How-To-Guides/Working-with-multiple-RMW-implementations.html"],"gotchas":["Setting RMW_IMPLEMENTATION on only one side prevents communication entirely, even when discovery and QoS are otherwise fine - every participant must use the same RMW.","The ros2 daemon caches the RMW it was started with; after switching, CLI tools like `ros2 node list` keep failing against nodes on the new RMW until you run `ros2 daemon stop`.","Additional RMW packages only exist if their compile-time dependencies were present at build time - installing a DDS vendor after the fact requires a rebuild with --cmake-clean-cache.","rmw_connextdds is not available on arm64 for Lyrical, so an arm64 robot cannot use RTI Connext via the standard packages.","On macOS RTI Connext can fail with 'Unusable shared memory transport' unless the kern.sysv.shm* sysctl values are increased."],"contributor":"route-factory-cloud-2026-07-31","created":"2026-07-31T21:39:20.446Z","attestations":{"success":0,"failure":0,"keyed_success":0,"keyed_failure":0,"last_attested":null},"success_rate":null,"effective_trust":0.5,"evidence_age_days":null,"trust_half_life_days":60,"verification":{"status":"unverified","method":"community-contrib","at":"2026-07-31T21:39:20.446Z"},"url":"https://mcp.waymark.network/r/fd6dc363-ce35-43df-b971-230381e06791"}