ROS 2와 DDS 상호운용성: 원활한 통합을 위한 실용 가이드
ROS 2는 기본 통신 계층으로 DDS를 사용하지만, 네이티브 DDS 배포와 ROS 2 간의 완벽한 상호운용성 달성은 여전히 미묘한 과제를 안고 있습니다. 이 가이드는 "Bouncy Bolson"(2018년 7월) ROS 2 릴리스 기준 검증된 실용적 단계와 구성 조정을 정리하여 팀이 일반적인 함정을 피하고 Connext DDS의 모든 힘을 ROS 2 내에서 활용하도록 돕습니다.
ROS 2 현재 상태
ROS 2는 빠르게 진화하는 프레임워크로 향후 릴리스에서 추가 상호운용성 뉘앙스 등장 가능. 그러나 rmw_connext_cpp RMW 레이어로 ROS 2 실행 시 여전히 네이티브 Connext DDS 스택을 사용합니다. 즉 Connext의 고급 기능(세분화된 QoS 제어, 다중 전송 지원 등)을 모두 유지하면서 ROS 2의 고수준 추상화 이점도 누릴 수 있습니다.
핵심 상호운용성 설정
토픽 이름 & 파티션
ROS 2는 토픽의 네임스페이스를 토픽 이름이나 DDS 파티션에 인코딩. 모든 ROS 2 사용자 토픽은 "rt"(ROS Topic) 네임스페이스에 상주. DDS에서 이는 다음과 같이 표현:
토픽 데이터 타입
Connext RMW 레이어 활성화 시 ROS 2는 모든 "rt/*" 토픽을 제네릭 직렬화 타입으로 광고. 결과적으로 원래 강력하게 타입화된 데이터를 발행하는 순수 DDS 애플리케이션은 QoS 불일치 경험하며 연결 불가.
가장 직관적인 해결책은 ROS 2 참여자의 자동 타입 코드 발행 억제. ROS 2 노드 실행 디렉토리에 USER_QOS_PROFILES.xml 파일 추가. 타입 코드 숨김과 타입 객체 공유 비활성화하는 최소 구성:
애플리케이션에 맞게 신뢰도 설정 조정 자유. 위 예제는 시작점으로 "Best Effort" 사용.
이 QoS 파일은 같은 디렉토리에서 시작된 ROS 2 노드에만 적용. 격리된 구성이 필요하면 각 노드 실행 폴더 옆에 전용 USER_QOS_PROFILES.xml 배치.
전송 선택
DDS 시스템과 ROS 2 시스템이 같은 네트워크 공유 시 누락되거나 지원되지 않는 전송(예: udpv4만 지원하는 참여자에 udpv6 불가) 경고 발생 가능. 이런 경고 회피와 신뢰성 있는 연결 보장을 위해 전송 선호도 명시적 구성.
USER_QOS_PROFILES.xml에 <transport_builtin> 마스크를 <participant_qos> 내에 추가해 허용 전송 정의:
<participant_qos> <transport_builtin> <mask>UDPV4|SHMEM</mask> </transport_builtin> </participant_qos>
- 실행 디렉토리에
NDDS_DISCOVERY_PEERS 파일 생성하고 발견 원하는 피어 주소 나열. 멀티캐스트 디스커버리 비활성화하는 쉼표 구분 예시:
localhost,192.168.1.12,shmem://
ROS 2에서 RMW 레이어 선택
ROS 2 노드 시작 전 RMW_IMPLEMENTATION 환경 변수를 rmw_connext_cpp로 항상 설정:
export RMW_IMPLEMENTATION=rmw_connext_cpp
또는 노드 실행 시 인라인으로 전달:
RMW_IMPLEMENTATION=rmw_connext_cpp ros2 run demo_nodes_cpp talker
언바운드 시퀀스 & 문자열
일부 ROS 2 토픽은 언바운드 시퀀스나 문자열 포함. DDS 애플리케이션이 이 토픽 소비/발행 필요 시 DDS 코드 생성기에서 "Unbounded Support" 활성화. RTI 문서 참조해 코드 생성 중 이 옵션 토글 방법 확인.
RTI와의 다음 단계
현재 ROS 2 기능 세트의 일시적 공백—토픽 데이터 기록과 재생—을 이 시리즈 다음 편에서 다룰 예정. 그동안 견고한 DDS 기반 ROS 2 솔루션 배포 준비되셨다면 RTI 전문가에게 연락주세요. 구성 미세 조정과 시장 출시 가속화 도와드리겠습니다.