container <-> local ros2 topic 통신(ubuntu 20.04)

2025. 2. 18. 16:36ROS2/docker

도커 컨테이너 생성시 --network host 옵션을 쓰면 로컬과 네트워크 설정이 똑같이 되는 걸로 알고잇는데 왜인지 다른 컴퓨터와 통신할때는 잘 되었는데 내 로컬 컴퓨터와 컨테이너 사이의 통신은 되지않았다.

 

그래서 방법을 찾던 중 수동 네트워크 설정을 하면 가능하다는 것을 알게 되었다.

1. Docker 컨테이너에 브릿지 네트워크 설정

기본적으로 Docker는 bridge 네트워크를 사용함. 하지만 기본 브릿지(docker0)는 로컬 머신과 직접 통신이 어렵기 때문에, 별도로 새로운 브릿지 네트워크를 생성해야 함.

브릿지 네트워크 생성

docker network create \
  --driver=bridge \
  --subnet=192.168.1.0/24 \
  ros2_bridge

위 명령어를 실행하면 192.168.1.0/24 범위의 IP를 가지는 ros2_bridge 네트워크가 생성됨.


2. 컨테이너 실행 시 네트워크 연결

이제 컨테이너를 실행할 때 이 네트워크를 사용하도록 지정함.

docker run -it --rm \
  --network ros2_bridge \
  --ip 192.168.1.100 \
  --name ros2_container \
  my-ubuntu-20.04-container

위와 같이 실행하면, 컨테이너는 192.168.1.100의 IP 주소를 가지게 됨.


3. 로컬 컴퓨터와 네트워크 연결 확인

로컬 컴퓨터도 ros2_bridge 네트워크에 연결해야 함. 현재 로컬 머신이 192.168.1.x 대역에서 동작하는지 확인.

로컬에서 컨테이너의 IP로 ping을 보내 테스트함.

ping 192.168.1.100


4. ROS 2 환경 변수 설정

컨테이너와 로컬 머신 모두 아래 환경 변수를 동일하게 설정해야 합니다.

export ROS_DOMAIN_ID=0
export ROS_IP=<자신의 IP 주소>
export ROS_MASTER_URI=http://<ROS Master의 IP>:11311

로컬 머신에서 IP 확인:

ip a | grep "inet "

예를 들어, 로컬 머신이 192.168.1.10이면:

export ROS_IP=192.168.1.10
export ROS_MASTER_URI=http://192.168.1.10:11311

컨테이너 내부에서:

export ROS_IP=192.168.1.100
export ROS_MASTER_URI=http://192.168.1.10:11311

5. ROS 2 topic 통신 테스트

이제 컨테이너와 로컬 머신에서 ROS 2 통신을 테스트할 수 있습니다.

로컬 머신에서 Publisher 실행

ros2 topic pub /test_topic std_msgs/String "data: 'Hello from local machine'"

컨테이너에서 Subscriber 실행

ros2 topic echo /test_topic

'ROS2 > docker' 카테고리의 다른 글

ROS2 docker(2)  (0) 2024.11.04
ROS2 docker(1)  (0) 2024.10.04