
데스크탑 로컬에 Isaac Sim 설치해 놓고, Docker에서 환경 셋팅해서 Sim으로부터 ROS2 topic들 받으려고 했는데, topic list는 뜨지만 값이 받아지지 않았다.
보통 domain ID만 맞춰주면 됐었는데 뭐가 문제지..? 하고 찾아보다가 DDS 설정이란 것에 대해서 알게 되었다.
DDS와 통신을 위해 필요한 설정을 간단히 정리해 보려고 한다.
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의 역할은 무엇일까?

ROS 2에서 DDS(Data Distribution Service)는 데이터 통신을 담당하는 핵심 미들웨어 역할을 한다. 이는 ROS 1의 TCPROS를 대체하여, 노드 간의 메시지(토픽, 서비스 등)를 주고받는 모든 과정을 처리하는 통신 계층이다.
ROS2 DDS와 ROS1의 기존 통신 방식을 비교하면 다음과 같다.
| 특징 | ROS1 (TCPROS) | DDS |
|---|---|---|
| 아키텍처 | 중앙집중식 (Master) | 분산형 |
| 발견 방식 | Master 기반 | 자동 발견 |
| 실시간 성능 | 제한적 | 우수 |
| 표준화 | 비표준 | OMG 표준 |
| 내결함성 | 낮음 | 높음 |
ROS2에서 DDS를 사용하는 이유는
단일 장애점 문제(Single Point of Failure : Master가 멈추면 전체 시스템이 마비되는 문제)를 해결하고, 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 해 주면 토픽 값을 정상적으로 불러올 수 있었다.
ROS2에서 Domain은 동일한 물리적 네트워크에서 여러 ROS2 시스템을 논리적으로 분리하는 메커니즘으로, 같은 Domain ID를 가진 노드들만 서로 통신할 수 있다.
따라서 DOMAIN ID 를 맞춰주지 않으면 같은 네트워크에서도 통신이 불가능하다. 다음의 명령어로 local, docker의 DOMAIN ID를 동일하게 저장하자.
export ROS_DOMAIN_ID=42
이러한 설정들은 ~/.bashrc에 추가하고 실행 시 자동으로 source 되게 하면 편리하다.