osrf / ros_dds

(Deprecated) Prototype system using DDS as the middleware for a ROS like API.
Apache License 2.0
41 stars 16 forks source link

Characterize DDS's discovery system #6

Closed wjwwood closed 10 years ago

wjwwood commented 10 years ago

Previously we appraised mDNSResponder (bonjour) and avahi for their use as a discovery system for ROS. We found the system easily got into inconsistent states and could sometimes be very unresponsive. We have similar concerns about DDS's discovery system.

Things we would like to know more about DDS's discovery system:

esteve commented 10 years ago

References:

Troubleshooting:

Improvements:

esteve commented 10 years ago

Link to PDF for the Bloom filter-based protocol: http://dtstc.ugr.es/tl/pdf/pf/PFM_jsanchez_electronic-EN.pdf

esteve commented 10 years ago

Static discovery plug-in for RTI's implementation (page 7): http://www.rti.com/docs/DDS_Over_Low_Bandwidth.pdf

esteve commented 10 years ago

More info about firewalls, DDS and discovery (especially the ports being used):

http://community.rti.com/content/forum-topic/statically-configure-firewall-let-omg-dds-traffic-through

esteve commented 10 years ago

Participants can be either discovered asynchronously (subscribing to the builtin DCPSParticipant datareader) or synchronously via DDSDomainParticipant::get_discovered_participants. I wrote a program that exemplifies the asynchronous API in example/cpp/src/Discovery.cpp

The standard DDS API provides other builtin mechanisms for discovering datareaders and datawriters (via the DCPSSubscription and DCPSPublication datareaders respectively). RTI's implementation provides the Subscriber::get_datareaders and Publisher::get_datawriters synchronous methods, but it's a custom extension.

DDS uses multicast for discovery by default, but it can be configured to a pre-defined topology. OpenDDS has two methods for achieving this, both via the XML configuration file. The first one is by defining a <Discovery> section in <DDSI2Service>:

` ...

... `

the other method is by defining a new networking service, first in the <Domain> section:

`

networking

`

and then in the <OpenSplice> section:

`

53340 53350
  <Discovery enabled="true">
     <PortNr>53360</PortNr>
  </Discovery>

`

RTI's implementation provides more options for configuring discovery programmatically, but they work with OpenDDS:

http://community.rti.com/content/forum-topic/configure-rti-connext-dds-not-use-multicast

In my tests, discovery is very responsive, participants are notified of other participants joining and leaving the domain almost immediately, but more testing should be done.