Networking
ROS 2 uses DDS for message transport.
Set the environment variable RMW_IMPLEMENTATION to select a DDS implementation (RMW = robotic middleware). For instance:
To check which RMW implementation is being used:
DDS Discovery
There is no rosmaster like in ROS 1. Node discovery is peer-to-peer with nodes announcing their topics on startup and periodically after that. By default, any machines on the same network will see each other if they have the same ROS_DOMAIN_ID.
ROS_DOMAIN_ID can be any number between 0 and 253, although it is recommended to use numbers less than 128.
In addition to the ROS_DOMAIN_ID, CycloneDDS supports a domain tag, which allows nearly infinite partitioning of the network (see below).
If you want to limit communication to the localhost set ROS_LOCALHOST_ONLY, which is available since Eloquent.
CycloneDDS
Cyclone can be configured with XML. This can be stored in a file or passed directly in the environment variable CYCLONEDDS_URI. A full list of supported options can be found in the eclipse-cyclonedds repo. See also the Guide to Configuration.
CycloneDDS: Large Topics Fail with Best Effort Subscribers
Starting with ROS 2 Jazzy, I noticed an issue where best effort subscribers no longer transmitted data for large topics (point clouds and images). This was fixed by applying the buffer size changes noted here.
CycloneDDS: Multiple Interfaces
Cyclone currently only works with a single network interface. If you have multiple interfaces, specify which one to use in the NetworkInterfaceAddress:
<CycloneDDS>
<Domain>
<General>
<NetworkInterfaceAddress>wlp2s0</NetworkInterfaceAddress>
</General>
</Domain>
</CycloneDDS>
CycloneDDS: Disabling Multicast (Except Discovery)
Some network hardware can perform poorly with multicast (especially with WIFI). You can limit multicast to just discovery:
<CycloneDDS>
<Domain>
<General>
<AllowMulticast>spdp</AllowMulticast>
</General>
</Domain>
</CycloneDDS>
CycloneDDS: Domain Tag
CycloneDDS also defines a "Domain Tag" which allows to drastically partition the network with a custom string:
Example
The above tags can all be combined:
<CycloneDDS>
<Domain>
<General>
<!-- Explicitly set network interface -->
<NetworkInterfaceAddress>wlp2s0</NetworkInterfaceAddress>
<!-- Use multicast for discovery only -->
<AllowMulticast>spdp</AllowMulticast>
</General>
<Discovery>
<!-- This tag has to be the same on each machine -->
<Tag>my_robot_name</Tag>
</Discovery>
</Domain>
</CycloneDDS>