intermediate - Different ROS 2 middleware vendors

ROS 2는 DDS/RTPS를 미들웨어로 사용하며, 여기서 디스커버리·직렬화·전송이 이뤄진다. DDS는 분산 디스커버리(ROS 1처럼 중앙이 아님), 전송 QoS 제어 등 로봇 시스템에 맞는 기능을 제공하는 산업 표준이고, RTI Connext, eProsima Fast DDS, Eclipse Cyclone DDS, GurumNetworks GurumDDS 등 여러 벤더가 구현체를 제공한다. RTPS(DDSI-RTPS)는 DDS가 네트워크로 통신할 때 쓰는 와이어 프로토콜이다.

ROS 2에서 특정 DDS/RTPS 구현체를 쓰려면, 그 구현체의 API·도구로 ROS 미들웨어 추상 인터페이스를 구현한 RMW(ROS Middleware interface) 패키지가 필요하다. RMW 패키지를 여러 개 지원하는 것은 “한 구현체에만 묶이지 않게” 하기 위함이며, 사용자가 프로젝트에 맞게 구현체를 바꿀 수 있게 하기 위해서다.

DDS란?
Data Distribution Service의 약자로, OMG에서 정한 데이터 중심(data-centric) publish-subscribe 표준이다. 토픽·QoS·분산 디스커버리(중앙 브로커 없이 참가자끼리 서로 찾음)를 제공하며, 로봇·항공·의료 등 실시간·분산 시스템에서 널리 쓴다. "무엇을(토픽/타입)·어떤 품질로(QoS) 주고받을지"를 정의하는 동작·API 표준이라고 보면 된다.

OMG란?
Object Management Group의 약자로, DDS·CORBA·UML 등 소프트웨어 표준을 정의·유지하는 국제 표준화 단체다. 1989년 설립되었고, 업계·학계·정부가 참여하는 컨소시엄 형태로 운영된다.

RTPS란?
Real-Time Publish-Subscribe의 약자로, DDS가 네트워크 위에서 실제로 패킷을 주고받을 때 쓰는 프로토콜이다. 정식 명칭은 DDSI-RTPS(DDS Interoperability Wire Protocol)다. 즉 DDS가 "무엇을 어떻게 할지"를 정한다면, RTPS는 "그걸 와이어(케이블/네트워크) 위에서 어떻게 직렬화·전송할지"를 정한다. 서로 다른 벤더의 DDS 구현체도 RTPS를 따르면 상호 연동할 수 있다.

공식 개념 문서: Different ROS 2 middleware vendors (Jazzy)

지원 RMW 구현체

제품명라이선스RMW 구현 패키지비고
eProsima Fast DDSApache 2rmw_fastrtps_cpp완전 지원. 기본 RMW. 바이너리 배포에 포함.
Eclipse Cyclone DDSEclipse Public License v2.0rmw_cyclonedds_cpp완전 지원. 바이너리 배포에 포함.
RTI Connext DDS상용·리서치rmw_connextdds완전 지원. 바이너리에 지원 포함, Connext는 별도 설치.
GurumNetworks GurumDDS상용rmw_gurumdds_cpp커뮤니티 지원. 바이너리에 지원 포함, GurumDDS는 별도 설치.

실무에서 여러 RMW를 쓰는 방법은 Working with multiple RMW implementations 가이드를 참고하면 된다.

여러 RMW 구현체 사용

현재 활성 배포판의 바이너리에는 Fast DDS, RTI Connext Pro, Eclipse Cyclone DDS, GurumNetworks GurumDDS 등 여러 RMW가 기본 포함된다. 기본값은 Fast DDS이며, 추가 설치 없이 사용 가능하다(바이너리 패키지에 함께 배포됨). Cyclone DDS, Connext, GurumDDS는 추가 패키지 설치로 활성화할 수 있고, 기존 패키지를 교체하거나 다시 빌드할 필요는 없다.

소스에서 빌드한 워크스페이스는, 해당 DDS/RTPS가 설치되어 있고 환경 변수가 설정되어 있으면 여러 RMW를 동시에 빌드·설치할 수 있다. 예: RTI Connext DDS용 RMW 코드가 워크스페이스에 있고 Connext Pro가 설치되어 있으면 그 RMW가 빌드된다.

서로 다른 RMW를 쓰는 노드끼리도 많은 경우 통신이 되지만, 항상 보장되지는 않는다. 아래 조합은 지원되지 않는다.

  • Fast DDS ↔ Connext: Fast DDS가 publish한 WString을 Connext가 macOS에서 올바르게 수신하지 못함
  • Connext ↔ Cyclone DDS: WString에 대한 pub/sub 미지원

기본 RMW 구현체

여러 RMW가 설치된 ROS 2 환경에서는 Fast DDS가 있으면 기본 RMW로 선택된다. Fast DDS RMW가 없으면, RMW 구현체 식별자(패키지 이름) 알파벳 순으로 첫 번째가 기본이 된다. 예: rmw_cyclonedds_cpprmw_connextdds만 있으면 rmw_connextdds가 기본이고, rmw_fastrtps_cpp를 나중에 설치하면 그때부터 Fast DDS가 기본이 된다.

실행 시 사용할 RMW를 지정하는 방법은 가이드를 참고하면 된다.

벤더 혼용(Cross-Vendor) 통신

서로 다른 RMW를 써도 제한적으로만 호환될 수 있으며, 항상 호환된다고 보장할 수 없다. 따라서 분산 시스템 전체가 같은 ROS 버전과 같은 RMW 구현체를 쓰도록 하는 것이 권장된다.