도커 컨테이너 끼리 ros2 통신

About_work·2024년 9월 10일
0

docker

목록 보기
4/4

1. GPT

1.0. 결론

이 과정에서:
1. Docker 이미지를 만들고,
2. Docker 네트워크를 설정한 뒤,
3. 각 컨테이너를 네트워크에 연결하여 ROS2 노드를 실행,
4. 컨테이너 간 통신을 설정하는 방식으로 구현할 수 있음

1.1. Docker 이미지 준비

  • 먼저, 여러 Docker 이미지를 준비해야 합니다.
  • 각 Docker 이미지에서 ROS2 노드를 실행할 수 있어야 합니다.
  • 만약 ROS2가 설치된 Docker 이미지를 가지고 있지 않다면, 아래 예시와 같이 새로운 이미지를 생성할 수 있습니다.

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 이미지를 기본으로 사용하여, 각 노드를 실행할 수 있는 컨테이너를 만듭니다.

  • 현재 디렉토리에 있는 Dockerfile을 기반으로 Docker 이미지를 빌드(build)하는 과정
  • 이 명령어는 현재 디렉토리(.)에 위치한 Dockerfile을 읽어서 Docker 이미지를 빌드합니다.**
  • -t ros2_foxy:latest 부분은 빌드된 이미지에 이름(ros2_foxy)태그(latest)를 붙이는 과정
    • ros2_foxy는 이미지 이름
    • latest는 태그로, 보통 가장 최신 버전을 의미
docker build -t ros2_foxy:latest .

1.2. Docker 네트워크 설정

  • 여러 컨테이너 간에 ROS2 통신을 원활하게 하기 위해서는 Docker 네트워크를 설정해야 합니다.
  • ROS2는 기본적으로 DDS (Data Distribution Service)를 통해 네트워크 상에서 노드 간 통신을 하기 때문에, 각 컨테이너는 동일한 네트워크에 있어야 합니다.
docker network create ros2_network

1.3. 컨테이너 실행

각 노드를 실행할 컨테이너를 해당 네트워크에 연결한 뒤 실행합니다.

1.3.1. 컨테이너 1: Talker (송신 노드)

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

1.3.2. 컨테이너 2: Listener (수신 노드)

다른 터미널에서, 같은 네트워크에 연결된 또 다른 컨테이너를 실행합니다.

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

1.4. 컨테이너 간 통신 확인

이제 talker 컨테이너에서 송신하는 메시지가 listener 컨테이너에서 수신되는지 확인할 수 있습니다. 기본적으로 ROS2의 DDS 통신 프로토콜이 네트워크를 통해 메시지를 주고받게 됩니다.

  • talker 노드에서는 메시지가 계속 송신되고,
  • listener 노드에서는 메시지를 수신하게 됩니다.

1.5. Docker Compose 사용 (선택 사항)

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

1.6. ROS2 환경 변수 설정 (멀티 컨테이너 환경에서의 추가 설정)

  • 각 컨테이너에서 IP 주소를 명시적으로 설정해야 하는 경우, ROS2의 환경 변수를 설정할 수 있습니다.
  • ROS_DOMAIN_ID를 통해 각 컨테이너에서 다른 도메인을 사용하거나, 동일한 도메인에서만 통신되도록 설정할 수 있습니다.
export ROS_DOMAIN_ID=10

컨테이너 내부에서 위 명령어를 사용하여 도메인 ID를 동일하게 설정하면, 해당 컨테이너들이 동일한 도메인에서 통신할 수 있습니다.

profile
새로운 것이 들어오면 이미 있는 것과 충돌을 시도하라.

0개의 댓글