ROS Resources: Documentation | Support | Discussion Forum | Service Status | Q&A answers.ros.org

How to run example talker/listener on 2 machines with different ipaddr?

I like have a try on topic publish/subscribe across a ip network, where can I get a example or instructions for such case? thanks.

1 Like

Hi @jwang11

ROS2 (and more precisely DDS) uses UDP multicast to communicate the metadata allowing different node to discover each other and establish communication.
Additionaly DDS allows you to specify a domain ID that is a logical barrier to segregate networks.

If your two machines are on the same network and your network configuration allows UDP multicast communication you should be able to run talker/listener across machines by running:
On machine 1:

source <YOUR_ROS2_WORKSPACE>/setup.bash
ros2 run demo_nodes_cpp talker

On machine 2:

source <YOUR_ROS2_WORKSPACE>/setup.bash
ros2 run demo_nodes_cpp listener

If you don’t want to interfere with other DDS systems on the same network you can set a domain ID, the domain ID is a number between 0 and 255, I’ll use 42 in the following example:
On machine 1:

export ROS_DOMAIN_ID=42
source <YOUR_ROS2_WORKSPACE>/setup.bash
ros2 run demo_nodes_cpp talker

On machine 2:

export ROS_DOMAIN_ID=42
source <YOUR_ROS2_WORKSPACE>/setup.bash
ros2 run demo_nodes_cpp listener
6 Likes

Got it, thanks a lot.

Hi, marguedas

I’m trying the similar thing, to get ros2_talker in my host to send messages to ros2_listener in virtualbox.
Host: macOS, using ROS2_beta1
VBox: Lubuntu16.04, using ROS2_beta2

I used the “Bridged” network setup on VBox and I was able to ping them on both sides.
I tried export ROS_DOMAIN_ID=42, but it doesn’t seem to be working in my case. Do you have any ideas?

many things have changed “under the hood” between beta1 and beta2 so it is expected that they don’t communicate out-of-the-box. Please try using beta2 on both machines and see if that fixes it.

Hi dhood,

Thank you. Beta2 on both sides works!

Sorry if I understood it wrong but by exporting the ROS_DOMAIN_ID, does that mean we can run talker and listener on 2 different machines with different networks ?

Or in any case, the network has to be the same with enabled UDP multicasting ?

All the machines that will be talking to each other must satisfy two constraints. First, they must all be within the same multicast domain on your network. This is a network setup issue and not strictly a ROS thing. If you don’t know how to do that, an alternative is to define the unicast addresses of all the computers that need to communicate with each other in an XML file placed in the directory from which you run the “ros2” command.

Secondly, then they must have the same ROS_DOMAIN_ID. The ROS_DOMAIN_ID is used to segment the network multicast domain into smaller communities that are allowed to talk to each other.

I think auto find mechanism should be closed if no ROS_DOMAIN_ID is set.

can we connect the ros1 system with ros2 system and vice-versa like this…

replying to old message,

@roslearnersai
you can do it via ros1_bridge, if you want to your own msg/srv, you need to build your ros1_bridge. all things considered, you could just take a look at it.

thanks