We’ve currently been running into some issues that look like reaching the maximum number of DDS entities (i.e. nodes are started without error, but do not appear in ros2 node list, neither do their topics appear). If we shut down a few other nodes, than the same node runs well.
Is it the case that the simple single-node process creates exactly 1 participant?
How is it with component container? Does it have 1 participant for the whole container, or does it have one per loaded component?
How is it with the weird transform_listener_impl_* nodes automatically created by TransformListener? Do they “eat” a participant?
And last - I guess the 120 participant limit is per PC, right? This isn’t directly mentioned in the design doc, but I think it follows from the design…
To resolve our current problem, I’ll try switching to discovery server, but I’d like to have a clear view on the other mentioned questions.
Related: When you call rclcpp::init(), you initialize the “global default context”. Many APIs will use the global default context when you don’t specify a context as a convenience.
A single node process would create one context, which means 1 participant for the DDS based RMW implementations.
We have seen the exact behavior you are describing when using fastDDS (Nodes not being listed / services not being found etc). We simply switched to cyclone and it was gone.
This is our cyclone config, perhaps it’s useful to you :
Also, if you set ROS_AUTOMATIC_DISCOVERY_RANGE=LOCALHOST, you’re implicitly limited to 32 nodes by the rmw layer. This is independently true of both the FastDDS and CycloneDDS rmw layers, and IMO is a pretty severe undocumented landmine. With CycloneDDS, you at least get loud complaints on the console when you hit the limit, but FastDDS just silently stops working in the manner you describe. Both limits can be overridden if you write your own DDS XML configuration, but to configure them you first have to know that they’re there.