skip to Main Content

I am simply trying to connect a ROS2 node from my Ubuntu 22.04 VM on my laptop to another ROS2 node on another machine running Ubuntu 18.04. Ideally, I would only have Docker on the second machine (the first machine runs a trivial node that will never change), but I have been trying using a separate container on each.

Here is what I am doing and what I am seeing when I inspect:

(ssh into machine 2 from VM 1.)

A: start up network from machine 2.

sudo docker network create -d overlay --attachable my-attachable-ovrlay

B: start up container 1.

sudo docker run -it --rm test1

C: successfully attach container 1 to the network.

sudo docker network connect dwgyau64pvpenxoj2edu4liqu bold_murdock

D: Confirm the container lists network.

sudo docker inspect -f '{{range $key, $value := .NetworkSettings.Networks}}{{$key}} {{end}}' bold_murdock

prints:

bridge my-attachable-ovrlay

E: Check the network to see container.

sudo docker network inspect my-attachable-ovrlay

prints (among other things):

"Containers": null,

I am new to Docker AND networking, so I could be missing something huge, but I have tried all of the standard suggestions I found online including disabling my firewall, opening a ton of ports using ufw allow on both machines, making sure nodes are active, etc etc etc etc etc.

I tried joining the network from machine 2 and that works and the container is displayed when using network inspect. But when I do that, then machine 1 simply refuses to connect to network.
F: In this situation it gives an error.

sudo docker network connect dwgyau64pvpenxoj2edu4liqu objective_mendel

prints:

Error response from daemon: attaching to network failed, make sure your network options are correct and check manager logs: context deadline exceeded

Also, before trying any docker networking, I have tried plainly pinging from VM1 to machine 2 and that works, both ways. I have tried to use netcat to open an old-timey chat window on port 1234 (random port as per this resource) and that works one way only. I can communicate both ways, but only when machine 1 sends the initial netcat request and machine 2 listens. When machine 2 sends request and 1 listens, nothing happens.

I have been struggling to get this to work for 3 weeks now. I know it’s something stupid, I just know it. Any advice would be incredibly appreciated. Please explain like I know nothing about networking, because I just about do.

EDIT: I converted images (still hyperlinked) into code blocks.

2

Answers


  1. Chosen as BEST ANSWER

    The issue was that the router was set to 1969. When we updated the time by connecting to the internet for 15 seconds, then disconnected, it started working.


  2. If both PCs are on the same LAN, you could skip the whole network configuration entirely and use ROS2 auto-discovery.

    E.g.

    PC1:

    docker run -it --rm --net=host -v /dev/shm:/dev/shm osrf/ros:foxy-desktop
        export ROS_DOMAIN_ID=1
        ros2 run demo_nodes_py talker
    

    PC2:

    docker run -it --rm --net=host -v /dev/shm:/dev/shm osrf/ros:foxy-desktop
        export ROS_DOMAIN_ID=1
        ros2 run demo_nodes_py listener
    

    If the PCs are not on the same network, I usually use ZeroTier to create a virtual LAN between PC1, PC2, and PC(N), then repeat the above example.

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search