이 과정에서:
1. Docker 이미지를 만들고,
2. Docker 네트워크를 설정한 뒤,
3. 각 컨테이너를 네트워크에 연결하여 ROS2 노드를 실행,
4. 컨테이너 간 통신을 설정하는 방식으로 구현할 수 있음
Dockerfile
예시:
# Dockerfile
FROM osrf/ros:foxy-desktop
# 필수 패키지 설치
RUN apt-get update && apt-get install -y \
python3-pip \
ros-foxy-ros-base \
&& rm -rf /var/lib/apt/lists/*
# 네트워크를 위한 추가 패키지 설치
RUN apt-get update && apt-get install -y net-tools iputils-ping
# 워크스페이스 생성 및 ROS2 패키지 빌드
RUN mkdir -p /ros2_ws/src
WORKDIR /ros2_ws
RUN /bin/bash -c "source /opt/ros/foxy/setup.bash && colcon build"
# ROS2 환경 설정
CMD /bin/bash -c "source /opt/ros/foxy/setup.bash && /bin/bash"
docker build -t ros2_foxy:latest .
docker network create ros2_network
각 노드를 실행할 컨테이너를 해당 네트워크에 연결한 뒤 실행합니다.
docker run -it --rm --name ros2_talker --network ros2_network ros2_foxy:latest /bin/bash
컨테이너 안에서 ROS2 talker 노드를 실행합니다.
source /opt/ros/foxy/setup.bash
ros2 run demo_nodes_cpp talker
다른 터미널에서, 같은 네트워크에 연결된 또 다른 컨테이너를 실행합니다.
docker run -it --rm --name ros2_listener --network ros2_network ros2_foxy:latest /bin/bash
컨테이너 안에서 ROS2 listener 노드를 실행합니다.
source /opt/ros/foxy/setup.bash
ros2 run demo_nodes_cpp listener
이제 talker
컨테이너에서 송신하는 메시지가 listener
컨테이너에서 수신되는지 확인할 수 있습니다. 기본적으로 ROS2의 DDS 통신 프로토콜이 네트워크를 통해 메시지를 주고받게 됩니다.
talker
노드에서는 메시지가 계속 송신되고,listener
노드에서는 메시지를 수신하게 됩니다.여러 Docker 컨테이너를 관리하는 것이 복잡해질 수 있으므로, Docker Compose를 사용하면 더 편리하게 여러 컨테이너를 동시에 실행하고 관리할 수 있습니다.
docker-compose.yml
예시:
version: '3'
services:
talker:
image: ros2_foxy:latest
container_name: ros2_talker
networks:
- ros2_network
command: /bin/bash -c "source /opt/ros/foxy/setup.bash && ros2 run demo_nodes_cpp talker"
listener:
image: ros2_foxy:latest
container_name: ros2_listener
networks:
- ros2_network
command: /bin/bash -c "source /opt/ros/foxy/setup.bash && ros2 run demo_nodes_cpp listener"
networks:
ros2_network:
driver: bridge
이 파일을 사용하여 두 컨테이너를 동시에 실행할 수 있습니다:
docker-compose up
ROS_DOMAIN_ID
를 통해 각 컨테이너에서 다른 도메인을 사용하거나, 동일한 도메인에서만 통신되도록 설정할 수 있습니다.export ROS_DOMAIN_ID=10
컨테이너 내부에서 위 명령어를 사용하여 도메인 ID를 동일하게 설정하면, 해당 컨테이너들이 동일한 도메인에서 통신할 수 있습니다.