각종 DDS 구현체 설정 예시

eProsima Fast DDS 기본 설정

ROS 2 Humble에서 기본적으로 제공되는 rmw_fastrtps_cpp(또는 rmw_fastrtps_dynamic_cpp)는 eProsima의 Fast DDS를 사용한다. 멀티머신 환경에서 Fast DDS를 사용할 때 고려해야 할 몇 가지 핵심 설정은 다음과 같다.

Domain ID:

  • ROS 2는 DDS Domain ID를 통해 통신 영역을 구분한다.

  • 여러 머신이 같은 Domain ID를 사용해야 통신이 가능하다.

  • ROS_DOMAIN_ID 환경변수를 사용하거나 DDS XML 설정 파일을 사용해 Domain ID를 지정한다.

예를 들어, 시스템 전역으로 Domain ID를 42로 설정할 경우 다음과 같이 설정할 수 있다:

export ROS_DOMAIN_ID=42

만약 세션별로 설정이 다를 수 있도록 설정파일을 쓰고 싶다면, ROS 2 XML 설정을 작성해야 한다.

Transport 설정:

  • Fast DDS에서는 UDP, TCP, SHM(Shared Memory) 등 다양한 Transport Layer를 선택할 수 있다.

  • 멀티머신 간 통신에서는 주로 UDP 혹은 TCP를 고려한다.

  • UDP를 쓸 경우, OS의 방화벽 설정이나 MTU 크기 등을 고려해야 한다.

Discovery 설정:

  • DDS에서 Discovery는 노드들끼리 서로를 인식하게 하는 핵심 메커니즘이다.

  • Fast DDS는 기본적으로 Simple Discovery Protocol(SDP)를 사용하거나, Static Discovery 또는 PDP(Participant Discovery Protocol) 등을 지원한다.

  • 멀티머신 환경에서 Discovery가 제대로 동작하지 않으면 노드들이 서로를 찾지 못하므로, Discovery 초기 설정이 매우 중요하다.

eProsima Fast DDS XML 설정 파일 예시

Fast DDS 설정을 세부적으로 제어하고 싶다면 XML 설정 파일을 작성해서 사용한다. 일반적으로 ROS 2는 아래와 같은 순서로 DDS 설정을 로드한다.

  1. FASTRTPS_DEFAULT_PROFILES_FILE 환경변수로 지정된 XML 파일

  2. 또는 ~/.ros/ 디렉터리 내의 default_fastdds_profile.xml 파일

  3. 아무것도 없다면 내부 기본설정 사용

XML 예시(간단한 UDP 설정):

위 XML 파일에서 주목할 만한 부분은 다음과 같다:

  • <transport_descriptor> 노드를 통해 UDP 버퍼 크기를 명시적으로 설정한다.

  • <participant profile_name="default_participant_profile"> 노드에서 domainId42로 지정한다.

  • <useBuiltinTransports>false</useBuiltinTransports>로 기본 Transport를 비활성화하고, <transport_id>udp_transport</transport_id>만 사용하도록 한다.

이를 실제로 적용하기 위해서는 다음과 같이 환경변수를 설정한다:

이후 ROS 2를 실행하면 지정된 설정에 따라 Fast DDS가 동작한다.

Fast DDS 멀티머신 환경에서의 추가 고려사항

멀티캐스트 주소:

  • Fast DDS는 Discovery 시에 멀티캐스트를 사용할 수 있다.

  • 네트워크 환경에 따라 멀티캐스트가 허용되지 않으면 Discovery가 실패할 수 있으므로, 방화벽 및 네트워크 라우터 설정을 확인해야 한다.

QoS(서비스 품질) 설정:

  • Reliability, Durability 등을 포함해 다양한 QoS 파라미터가 있다.

  • 멀티머신 환경에서 데이터 손실이 우려되는 경우, Reliability를 RELIABLE로 설정하고, 병목을 일으키지 않도록 Flow Control(Throughput Controller) 등을 적절히 튜닝해야 한다.

Security 설정:

  • DDS Security(OMG DDS Security Spec) 기능을 통해 데이터 암호화, 인증 등을 적용할 수 있다.

  • 멀티머신 상에서 보안 통신을 고려한다면, XML 설정에서 Security 관련 플러그인을 활성화하고, 인증서 파일 등을 설정해야 한다.

Eclipse Cyclone DDS 기본 설정

Eclipse Cyclone DDS는 Eclipse 재단 산하에서 개발되는 DDS 구현체로, 가볍고 빠른 Discovery 프로세스와 함께 ROS 2 Humble에서 rmw_cyclonedds_cpp를 통해 사용될 수 있다. 멀티머신 환경에서 Cyclone DDS를 사용할 때 고려해야 하는 설정은 다음과 같다.

Domain ID:

  • Cyclone DDS도 마찬가지로 동일 Domain ID로 설정된 노드끼리만 통신이 가능하다.

  • ROS 2 내에서 export ROS_DOMAIN_ID=N (N은 정수) 와 같이 환경변수를 설정하거나, 아래의 TOML 설정 파일에서 Domain ID를 명시할 수 있다.

TOML 설정 파일:

  • Cyclone DDS는 XML 대신 TOML 형식을 사용해 네트워크, Discovery, QoS 등을 설정한다.

  • 설정 파일 경로는 CYCLONEDDS_URI 환경변수를 통해 지정할 수 있다.

Discovery 프로토콜:

  • Cyclone DDS는 Simple Discovery와 Multicast를 이용해 동일 서브넷 내의 노드들을 자동으로 발견한다.

  • 멀티머신 환경에서 서브넷을 넘어서 통신해야 한다면, 유니캐스트 주소를 추가하거나, 교차 서브넷 멀티캐스트를 허용해야 한다.

Cyclone DDS TOML 설정 파일 예시

아래 예시는 Cyclone DDS를 멀티머신 환경에서 UDP를 이용하도록 설정한 예시다.

위 예시에서 핵심 포인트는 다음과 같다.

  • [domain] 섹션에서 id = 42로 지정해 Domain ID를 설정한다.

  • [transport.udp] 섹션에서 포트 범위를 7400부터 7500으로 지정했다.

  • [interfaces] 섹션에서 eth0 인터페이스만 사용하도록 제한했다.

  • [trace] 섹션에서 디버그 로그 출력을 제어한다.

해당 설정 파일을 시스템에 저장한 뒤, 아래와 같이 환경 변수를 설정하면 Cyclone DDS가 TOML 설정을 인식한다.

Cyclone DDS 멀티머신 환경에서의 추가 고려사항

멀티캐스트와 방화벽:

  • Cyclone DDS는 Discovery에 멀티캐스트를 활용한다.

  • 방화벽이나 라우터에서 멀티캐스트가 차단되어 있으면 서로를 찾지 못할 수 있으니, 네트워크 환경 설정을 확인한다.

Unicast Peers 설정:

  • 서브넷이 다른 호스트끼리 통신해야 할 경우, TOML 설정에서 Peers 옵션을 활용해 특정 호스트 IP와 포트를 직접 명시할 수 있다.

  • 예)

위와 같이 설정하면, Discovery 시에 해당 IP들과 직접 소통하여 노드를 찾는다.

QoS 프로필:

  • Cyclone DDS에서도 Reliability, History, Durability 등의 QoS를 ROS 2 QoS 설정과 함께 맞춰야 한다.

  • 기본적으로 ROS 2 레이어에서 QoS 설정을 하게 되지만, Cyclone DDS 내부 설정도 함께 튜닝할 수 있다.

RTI Connext DDS 기본 설정

RTI Connext DDS는 상용 솔루션으로 안정성과 풍부한 기능을 갖춘 DDS 구현체이다. ROS 2 Humble에서 rmw_connext_cpp를 사용하면 RTI Connext DDS가 동작한다. 멀티머신 환경에서 Connext DDS를 사용할 때 고려해야 하는 설정은 다음과 같다.

  1. Domain ID

    • 다른 DDS 구현체와 마찬가지로, Connext DDS 역시 Domain ID를 기반으로 통신 구역을 분리한다.

    • export ROS_DOMAIN_ID=N 명령으로 Domain ID를 지정하거나, RTI Connext DDS 전용 XML 또는 QoS 프로파일 파일을 통해 설정 가능하다.

  2. Connext DDS XML/QoS 프로파일 파일

    • Connext DDS는 XML 또는 .qos 파일 등을 통해 Participant, Publisher, Subscriber, Topic 등에 대한 QoS를 세부적으로 설정할 수 있다.

    • 파일 경로는 환경 변수 NDDS_QOS_PROFILES 등을 통해 지정 가능하다.

  3. 멀티머신 환경에서 필수적인 QoS 및 Transport 설정

    • Connext DDS의 Discovery(Participant Discovery, Endpoint Discovery) 동작을 위해 기본 멀티캐스트 주소 및 포트가 사용된다.

    • 방화벽 설정을 허용하거나, Discovery 시 유니캐스트만 사용하도록 네트워크 인터페이스와 포트를 지정할 수 있다.

RTI Connext DDS XML 설정 예시

아래는 Connext DDS의 기본 XML QoS 프로파일 예시다. 실제로는 RTI Connext DDS에서 제공하는 Admin Console, XML App Creation Tool 등을 통해 생성되는 복잡한 QoS 설정을 편집할 수 있다.

위 XML에서 주목할 만한 사항은 다음과 같다.

  • <participant_qos> 섹션에서 participant_id 등을 수정하거나, Discovery 관련 Transport 설정을 적용할 수 있다.

  • <datawriter_qos><datareader_qos> 섹션에서 Reliability(신뢰성), History, Durability 등 주요 QoS 파라미터를 설정한다.

해당 설정 파일을 Connext DDS에서 인식시키기 위해서는, 일반적으로 다음과 같은 환경 변수를 설정한다.

그리고 ROS 2 실행 시에 Connext DDS를 RMW로 사용하도록 설정한다.

RTI Connext DDS 멀티머신 환경에서의 추가 고려사항

  1. 멀티캐스트 주소와 포트 범위

    • Connext DDS는 Discovery와 데이터 전송 모두에 멀티캐스트를 사용할 수 있다.

    • 방화벽에서 멀티캐스트 주소 239.255.x.x 등을 차단하지 않도록 예외 처리가 필요하다.

    • 포트 충돌 방지를 위해 NDDS_DISCOVERY_PEERS 등을 설정하여 Discovery 포트를 명시하거나, XML/QoS 파일에서 포트 범위를 지정한다.

  2. Unicast Peer 설정

    • 서로 다른 서브넷에서 Connext DDS 노드가 통신해야 한다면, 멀티캐스트가 불가능한 환경에서는 Unicast Peer 목록을 설정해야 한다.

    • 예를 들어, $NDDS_DISCOVERY_PEERS 환경 변수 또는 XML 설정에서 특정 IP와 포트를 수동으로 명시한다.

  3. Security / 인증서

    • Connext DDS Secure를 통해 인증서 기반의 암호화 통신, 무결성 확인, 액세스 제어 등을 적용할 수 있다.

    • 멀티머신 환경에서 민감 데이터를 주고받는 경우, DDS 보안 표준에 따라 PKI(공개키 구조)를 준비하고 XML/QoS 설정에서 Security 플러그인을 활성화한다.

OpenSplice DDS는 ADLINK(구 PrismTech)에서 개발한 DDS 구현체이다. ROS 2 Humble에서 rmw_opensplice_cpp를 사용하면 OpenSplice DDS를 사용할 수 있다(단, 일부 릴리스에서는 별도의 빌드 옵션이 필요하거나 지원이 제한될 수 있으니 버전 호환을 확인해야 한다). 멀티머신 환경에서 OpenSplice DDS를 사용할 때 고려해야 할 설정은 다음과 같다.

  1. Domain ID

    • OpenSplice DDS도 Domain ID를 통해 네트워크상의 DDS Participant들을 구분한다.

    • $ROS_DOMAIN_ID 환경 변수를 사용하거나, OpenSplice DDS에서 제공하는 설정 파일(ospl.xml)을 통해 Domain ID를 명시할 수 있다.

  2. ospl.xml 설정 파일

    • OpenSplice DDS는 ospl.xml이라는 설정 파일을 통해 Participant, Networking, Discovery 등 전반적인 동작 방식을 제어한다.

    • ROS 2에서 OpenSplice DDS를 사용하면, 일반적으로 $OSPL_URI 환경변수 혹은 내부적으로 컴파일된 default ospl.xml 설정이 적용된다.

  3. Networking Service, Discovery Service

    • OpenSplice DDS는 Networking Service를 통해 데이터 교환을 담당하며, Discovery Service를 통해 Domain 내의 Participant를 검색한다.

    • 멀티머신 환경에서는 Networking Service 설정(UDP 멀티캐스트, 유니캐스트, RT networking 등)을 적절히 조정해야 한다.

ospl.xml 설정 예시

다음 예시는 OpenSplice DDS에서 UDP 멀티캐스트를 활성화하고 Domain ID를 42로 설정하는 간단한 예시다.

위 설정에서 주목할 부분은 다음과 같다.

  • <Domain> 태그에서 Id를 42로 설정함으로써 ROS 2에서 $ROS_DOMAIN_ID=42와 동일한 의미를 갖도록 한다.

  • <DDSI2Service> 내부에서 <General> 태그를 통해 멀티캐스트 기반 Discovery를 기본값으로 사용한다. AUTO로 설정 시 활성화된 네트워크 인터페이스(예: eth0)를 자동으로 탐지한다.

  • <Compatibility> 태그에서 StandardsConformance 값을 lax로 하여 RTPS 표준과의 호환성을 높였다(필요 시 strict 등으로 조정 가능).

OpenSplice DDS 멀티머신 환경에서의 추가 고려사항

  1. 멀티캐스트 vs. 유니캐스트

    • 서브넷을 넘나들거나, 멀티캐스트가 제한된 네트워크 환경에서는 유니캐스트 기반 설정을 적용해야 할 수 있다.

    • ospl.xml에서 <NetworkInterfaceAddress> 또는 <Discovery> 관련 설정을 변경해 유니캐스트 Peer를 지정할 수 있다.

  2. Networking 레이어

    • OpenSplice DDS에는 여러 Networking 모드가 존재한다.

      • DDSTCP: TCP 기반으로 통신

      • DDSI2: RTPS/UDP 기반으로 통신

    • 일반적으로 ROS 2는 RTPS(UDP) 기반의 DDSI2 모드를 사용하며, 멀티머신 환경에서는 UDP 방화벽/라우팅 설정을 주의 깊게 살펴야 한다.

  3. QoS & 튜닝

    • 신뢰성을 위한 Reliability, History, Deadline QoS 설정을 ospl.xml 또는 ROS 2 QoS 프로필을 통해 관리할 수 있다.

    • 시스템 트래픽과 자원 사용량에 맞춰 Networking 스레드 수, 버퍼 크기 등을 조정해야 성능이 최적화된다.

  4. 보안 확장

    • OpenSplice Secure 버전에서 DDS Security가 가능하다.

    • 별도의 인증서 파일 설정, Plugin 활성화 등을 위해 ospl.xml을 확장한 보안 설정 섹션을 구성해야 한다.

OpenDDS 기본 설정

OpenDDS는 오픈소스 DDS 구현체로, ACE(ADAPTIVE Communication Environment)와 TAO(The ACE ORB) 프레임워크를 기반으로 동작한다. 멀티머신 환경에서 OpenDDS를 사용할 때 주로 고려해야 하는 사항은 다음과 같다.

  1. Domain ID

    • OpenDDS에서도 ROS 2 Domain ID와 동일 개념으로 “Domain”이 존재한다.

    • 도메인 구분을 통해 분산 환경에서 통신 범위를 제어한다.

  2. Configuration File (ini 형식)

    • OpenDDS는 일반적으로 *.ini(또는 *.conf) 파일 형식을 통해 Transport, Discovery, QoS 등을 설정한다.

    • 이 설정 파일의 경로는 환경 변수나 런타임 인자로 지정 가능하다.

  3. DCPS(Distributed-CPS) InfoRepo Discovery 방식과 RTPS(Real-Time Publish-Subscribe) Discovery 방식

    • OpenDDS는 자체 InfoRepo Discovery 방식을 지원하며, RTPS 디스커버리도 지원한다.

    • ROS 2의 RTPS 기반과 연동을 위해, RTPS Discovery 설정을 사용하는 편이 일반적이다.

OpenDDS 설정 파일 예시

아래 예시는 RTPS Discovery 모드로 설정한 OpenDDS ini 파일의 간단 예시다.

transport.ini

이 구성에서 다음을 확인할 수 있다.

  • [rtps_discovery/rtps_disc] 섹션에서 $Domain=42$로 설정하여, ROS 2의 Domain ID = 42에 대응시켰다.

  • $UseMulticast=1$로 멀티캐스트 기반 Discovery를 활성화했다.

  • SEDPAddress=239.255.0.2:7401으로 Discovery 멀티캐스트 주소와 포트를 지정했다.

  • [transport/t1] 섹션에서 transport_type=rtps_udp를 사용해 RTPS/UDP 기반 전송을 설정했다.

위 ini 파일들을 실제로 적용하기 위해서는, 일반적으로 OpenDDS를 실행할 때 다음과 같은 환경변수 또는 인자를 설정한다.

ROS 2와의 연계 시에는 rmw_opendds_cpp(또는 별도의 오픈소스 브리지 프로젝트) 등을 통해 상호 운용성을 확보해야 한다. 다만, 오피셜 ROS 2 버전에서 기본으로 OpenDDS RMW를 제공하지 않을 수 있으므로, 별도 빌드 설정이 필요하다.

OpenDDS 멀티머신 환경에서의 추가 고려사항

  1. 멀티캐스트 vs. 유니캐스트

    • Default 설정으로 멀티캐스트를 사용하지만, 네트워크 환경에 따라 멀티캐스트가 불가능하면 유니캐스트만 사용하도록 재구성해야 한다.

    • 예: UseMulticast=0로 설정 후, Unicast Peer를 명시하는 옵션을 사용한다.

  2. QoS 설정

    • Reliability, Durability, Deadline 등 ROS 2 QoS 정책에 맞춰 OpenDDS 내에서도 동일하거나 유사한 QoS 매개변수를 설정한다.

    • ini 파일에서 [datawriterqos], [datareaderqos] 섹션 등을 사용해 세부 QoS 조정이 가능하다.

  3. 보안 기능

    • OpenDDS Security 플러그인을 사용하면 DDS Security 스펙(인증, 암호화, 접근제어)을 어느 정도 구현할 수 있다.

    • 멀티머신 환경에서 안전한 통신이 필요하면, 보안 플러그인 설정과 인증서 배포 과정을 별도로 고려해야 한다.

  4. 성능 튜닝

    • 네트워크 부하가 큰 멀티머신 시나리오에서는 Transport 계층의 버퍼 크기, 스레드 풀 크기, RTPS Discovery 주기를 조정해 성능을 최적화할 수 있다.

    • ini 파일에서 MaxMessageSize, FragmentSize, HeartbeatPeriod 등의 값을 조정해볼 수 있다.

Last updated