[ROS2] Local과 Docker간 통신 (feat. DDS)

choonsikmom·2025년 8월 14일
0

ROS/Robotics

목록 보기
7/8
post-thumbnail

데스크탑 로컬에 Isaac Sim 설치해 놓고, Docker에서 환경 셋팅해서 Sim으로부터 ROS2 topic들 받으려고 했는데, topic list는 뜨지만 값이 받아지지 않았다.

보통 domain ID만 맞춰주면 됐었는데 뭐가 문제지..? 하고 찾아보다가 DDS 설정이란 것에 대해서 알게 되었다.

DDS와 통신을 위해 필요한 설정을 간단히 정리해 보려고 한다.


ROS on DDS

DDS (Data Distribution Service)란?

DDS (Data Distribution Service)는 실시간 분산 시스템을 위한 표준 미들웨어로, OMG(Object Management Group)에서 정의한 발행-구독(Publish-Subscribe) 패턴 기반의 통신 프로토콜이다.

DDS의 핵심 특징

1. 분산 아키텍쳐

  • 중앙 집중식 브로커나 서버를 필요로 하지 않음
  • 각 노드가 독립적으로 발견(Discovery)과 통신 수행
  • 단일 장애점(Single Point of Failure) 제거

2. 실시간 성능

  • 마이크로초 단위의 지연 시간 보장
  • 결정적(Deterministic) 메시지 전달
  • 다양한 QoS(Quality of Service) 정책 지원

3. 표준화된 프로토콜

  • RTPS (Real-Time Publish Subscribe) 와이어 프로토콜 사용
  • 다양한 벤더 간 상호 운용성 보장
  • IDL (Interface Description Language)을 통한 메시지 정의

ROS2에서 DDS의 역할

ROS2에서 DDS의 역할은 무엇일까?

ROS 2에서 DDS(Data Distribution Service)는 데이터 통신을 담당하는 핵심 미들웨어 역할을 한다. 이는 ROS 1의 TCPROS를 대체하여, 노드 간의 메시지(토픽, 서비스 등)를 주고받는 모든 과정을 처리하는 통신 계층이다.

Why DDS ?

ROS2 DDS와 ROS1의 기존 통신 방식을 비교하면 다음과 같다.

특징ROS1 (TCPROS)DDS
아키텍처중앙집중식 (Master)분산형
발견 방식Master 기반자동 발견
실시간 성능제한적우수
표준화비표준OMG 표준
내결함성낮음높음

ROS2에서 DDS를 사용하는 이유는

  1. 분산형 구조를 통해 ROS1에서 Master Node의 단일 장애점 문제(Single Point of Failure : Master가 멈추면 전체 시스템이 마비되는 문제)를 해결하고,
  2. RTPS(Real-Time Publish-Subscribe) 프로토콜을 통해 실시간 성능 요구사항을 충족하며,
  3. OMG(Object Management Group)에서 제정한 산업 표준이기 때문에 상호 운용성이 보장되고 DDS-Security 표준을 채택하여 인증, 접근 제어, 암호화 기능을 지원, ROS1에서 취약했던 보안을 강화했기 때문이다.

통신을 위한 RMW_IMPLEMENTATION 설정 방법

local, docker 간 통신을 위해서는 RMW(ROS MiddleWare - ROS2와 실제 DDS 구현체 사이의 추상화 계층) 구현체 설정을 맞춰 주어야 한다.

# Fast DDS 사용 (기본값)
$ export RMW_IMPLEMENTATION=rmw_fastrtps_cpp

fastDDS가 default이며 다음 명령어를 통해 설치된 구현체를 확인할 수 있다.

$ ros2 doctor --report | grep rmw

RMW_IMPLEMENTATION만 해줬을 때는 심 환경을 실행해도 여전히 토픽 값을 못 읽어왔는데, 검색하다가 docker에서 .xml 설정 파일을 만들어줘야 한다는 것을 알게 되었다.

Isaac Sim Workspace Github에서 fastdds.xml 파일을 그대로 복사해서 도커의 특정 디렉토리에 붙여넣은 다음,

$ export FASTRTPS_DEFAULT_PROFILES_FILE=/PATH/TO/fastdds_profile.xml

위와 같이 export 해 주면 토픽 값을 정상적으로 불러올 수 있었다.


Domain ID 통일하기 (ROS_DOMAIN_ID)

ROS2에서 Domain은 동일한 물리적 네트워크에서 여러 ROS2 시스템을 논리적으로 분리하는 메커니즘으로, 같은 Domain ID를 가진 노드들만 서로 통신할 수 있다.

따라서 DOMAIN ID 를 맞춰주지 않으면 같은 네트워크에서도 통신이 불가능하다. 다음의 명령어로 local, docker의 DOMAIN ID를 동일하게 저장하자.

export ROS_DOMAIN_ID=42

이러한 설정들은 ~/.bashrc에 추가하고 실행 시 자동으로 source 되게 하면 편리하다.


References

profile
춘식이랑 함께하는 개발일지.. 그런데 이제 먼작귀를 곁들인

0개의 댓글