본문 바로가기

ROS2

ROS2 통신 (local, docker)

Local에서의 ROS2와 docker에서의 ROS2 간의 통신 방법

이런느낌..?

세 가지 확인할 것

 

1. network host (docker)

2. ROS_DOMAIN_ID

3. cyclone dds

 

Network host (docker)

우선 docker image를 다운받아서 접속한다.

# 도커 이미지 다운
docker pull osrf/ros:humble-desktop

# 도커 이미지 실행
docker run -itd --privileged --name humble --net=host osrf/ros:humble-desktop

도커 이미지를 run 할 때 주의 사항으로는 --net=host를 해줘야 한다. 그래야 Local과 docker가 통신을 할 수 있는 환경으로 된다.


# 도커 컨테이너 접속
docker exec -it humble /bin/bash

도커 컨테이너 접속 시 다음과 같은 환경이 뜬다.

여기에 ros2의 데모 노드 talker를 통해서 외부와 통신을 시도해보자. 

# docker
root@ubuntu:/# 
source /opt/ros/humble/setup.bash
ros2 run demo_nodes_cpp talker

[INFO] [1689831809.441734161] [talker]: Publishing: 'Hello World: 1'
[INFO] [1689831810.441714146] [talker]: Publishing: 'Hello World: 2'
[INFO] [1689831811.441724923] [talker]: Publishing: 'Hello World: 3'
[INFO] [1689831812.441764275] [talker]: Publishing: 'Hello World: 4'

 

하지만 왜인지 외부 환경에서 통신 불가

# Local 
ubuntu@ubuntu:~$ ros2 run demo_nodes_cpp listener

ROS_DOMAIN_ID

두 환경에서 ROS_DOMAIN_ID를 맞춰준다.

# Local

ubuntu@ubuntu:~$ vim ~/.bashrc
export ROS_DOMAIN_ID=5

 

#docker

root@ubuntu:/# 
vim ~/.bashrc

export ROS_DOMAIN_ID=5

 


그래도 안돼서 마지막으로 찾은 해법. 

Cyclone dds

https://docs.ros.org/en/foxy/Installation/DDS-Implementations/Working-with-Eclipse-CycloneDDS.html

 

Eclipse Cyclone DDS — ROS 2 Documentation: Foxy documentation

You're reading the documentation for a version of ROS 2 that has reached its EOL (end-of-life), and is no longer officially supported. If you want up-to-date information, please have a look at Iron. Eclipse Cyclone DDS Eclipse Cyclone DDS is a very perform

docs.ros.org

 

두 환경 모두 cyclonedds 설치 후 export

sudo apt install ros-foxy-rmw-cyclonedds-cpp
export RMW_IMPLEMENTATION=rmw_cyclonedds_cpp

 

 

이제 된다.

# Docker

root@ubuntu:/# 
ros2 run demo_nodes_cpp talker
[INFO] [1689832239.626872963] [talker]: Publishing: 'Hello World: 1'
[INFO] [1689832240.626846146] [talker]: Publishing: 'Hello World: 2'
[INFO] [1689832241.626731638] [talker]: Publishing: 'Hello World: 3'
[INFO] [1689832242.626891032] [talker]: Publishing: 'Hello World: 4'
[INFO] [1689832243.626834851] [talker]: Publishing: 'Hello World: 5'
[INFO] [1689832244.626818372] [talker]: Publishing: 'Hello World: 6'
[INFO] [1689832245.626914695] [talker]: Publishing: 'Hello World: 7'
[INFO] [1689832246.626844994] [talker]: Publishing: 'Hello World: 8'
[INFO] [1689832247.626916290] [talker]: Publishing: 'Hello World: 9'
[INFO] [1689832248.627002166] [talker]: Publishing: 'Hello World: 10'
[INFO] [1689832249.626941888] [talker]: Publishing: 'Hello World: 11'
[INFO] [1689832250.627042852] [talker]: Publishing: 'Hello World: 12'
[INFO] [1689832251.626978279] [talker]: Publishing: 'Hello World: 13'
[INFO] [1689832252.626980638] [talker]: Publishing: 'Hello World: 14'
[INFO] [1689832253.627026116] [talker]: Publishing: 'Hello World: 15'
# Local

ubuntu@ubuntu:~$ ros2 run demo_nodes_cpp listener
[INFO] [1689832243.627257744] [listener]: I heard: [Hello World: 5]
[INFO] [1689832244.627180562] [listener]: I heard: [Hello World: 6]
[INFO] [1689832245.627377121] [listener]: I heard: [Hello World: 7]
[INFO] [1689832246.627398747] [listener]: I heard: [Hello World: 8]
[INFO] [1689832247.627452749] [listener]: I heard: [Hello World: 9]
[INFO] [1689832248.627487039] [listener]: I heard: [Hello World: 10]
[INFO] [1689832249.627474611] [listener]: I heard: [Hello World: 11]
[INFO] [1689832250.627479328] [listener]: I heard: [Hello World: 12]
[INFO] [1689832251.627425727] [listener]: I heard: [Hello World: 13]
[INFO] [1689832252.627450043] [listener]: I heard: [Hello World: 14]
[INFO] [1689832253.627447404] [listener]: I heard: [Hello World: 15]

 

왜인지는 모르겠는데 Local에서 먼저 listener를 실행시켰지만, 이상하게 5번째 메시지부터 듣더라?

dds 때문인가..?

 

아무튼 해결했으니 됐다.

 

 

reference

https://stackoverflow.com/questions/75873776/how-to-communicate-between-ros2-running-on-a-docker-container-and-another-one-ru

 

How to communicate between ros2 running on a docker container and another one running directly on Linux?

I have a problem in communicating between 2 ros2 environments :one running on a docker container hosted on a macos and the second one running directly on a Linux. I set up the env ROS_DOMAIN_ID=5 for

stackoverflow.com