![]() Cyclone's original code for dds_create_domain() appears to create a domain entity that is automatically deleted when the last attached participant disappears. In reality, it leaks a reference while returning DDS_RETCODE_OK, making it appear as-if it is a regular entity that remains into existence until explicitly deleted. The RMW code assumed that it would be automatically deleted when the last node was destroyed and that a subsequent call to rmw_create_node could create the domain anew. This then fails with "precondition not met". In an upcoming fixed version of dds_create_domain() the domain entities will behave normally (return a handle, require an explicit delete). This commit provides a workaround for the bug in the original implementation: by recovering the handle from the first participant the preceding commits that were intended to future-proof the code will ensure that the entity now gets deleted explicitly. Signed-off-by: Erik Boasson <eb@ilities.com> |
||
---|---|---|
.github | ||
cyclonedds_cmake_module | ||
rmw_cyclonedds_cpp | ||
CONTRIBUTING.md | ||
LICENSE | ||
README.md |
A ROS2 RMW implementation for Eclipse Cyclone DDS
With the code in this repository, it is possible to use ROS2 with Eclipse Cyclone DDS as the underlying DDS implementation.
Getting, building and using it
All it takes to get Cyclone DDS support into ROS2 is to clone this repository into the ROS2 workspace source directory, and then run colcon build in the usual manner:
cd ros2_ws/src
git clone https://github.com/ros2/rmw_cyclonedds
git clone https://github.com/eclipse-cyclonedds/cyclonedds
cd ..
rosdep install --from src -i
colcon build
export RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
This seems to work fine on Linux with a binary ROS2 installation as well as when building ROS2 from source. On macOS it has only been tested in a source build on a machine in an "unsupported" configuration (macOS 10.14 with SIP enabled, instead of 10.12 with SIP disabled), and apart from a few details that are caused by the machine configuration, that works fine, too. There is no reason why it wouldn't work the same on Windows, but I haven't tried.
If you want to use a pre-existing installation of Cyclone DDS, you don't need to clone it, but you
may have to tell CMake where to look for it using the CycloneDDS_DIR
variable. That also appears
to be the case if there are other packages in the ROS2 workspace that you would like to use Cyclone
DDS directly instead of via the ROS2 abstraction.
Known limitations
Cyclone DDS doesn't yet implement the DDS Security standard, nor does it fully implement the Lifespan, Deadline and some of the Liveliness QoS modes. Consequently these features of ROS2 are also not yet supported when using Cyclone DDS.