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
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