DDS란 무엇인가?
DDS(Data Distribution Service)는 분산 시스템에서 데이터를 퍼블리싱하고 서브스크라이빙하는 구조를 지원하는 미들웨어 표준이다. ROS2에서는 DDS가 기본 통신 프로토콜로 사용되며, 노드 간의 통신을 효율적으로 관리할 수 있게 도와준다. ROS2가 DDS를 선택한 이유는 DDS가 실시간 데이터를 효율적으로 전송하고 관리할 수 있기 때문이다.
DDS의 주요 개념
1. 퍼블리셔와 서브스크라이버
퍼블리셔(Publisher)와 서브스크라이버(Subscriber)는 DDS에서 데이터를 송수신하는 기본 단위이다. 퍼블리셔는 데이터를 생성하고 이를 퍼블리싱하며, 서브스크라이버는 해당 데이터를 수신한다. 각 퍼블리셔와 서브스크라이버는 특정 토픽(Topic)을 통해 연결된다.
퍼블리셔가 데이터를 전송할 때 토픽을 통해 데이터를 전송하고, 서브스크라이버는 해당 토픽을 구독하여 데이터를 수신한다.
2. 데이터 작성자와 데이터 리더
DDS에서 퍼블리셔와 서브스크라이버는 각각 데이터 작성자(Data Writer)와 데이터 리더(Data Reader)로 구체화된다. 데이터 작성자는 퍼블리셔를 통해 데이터를 송신하고, 데이터 리더는 서브스크라이버를 통해 데이터를 수신한다.
- 데이터 작성자: 데이터를 퍼블리싱할 때 생성되는 객체로, 특정 데이터 타입을 작성하고 이를 DDS 네트워크에 전송하는 역할을 한다.
- 데이터 리더: 데이터를 수신할 때 생성되는 객체로, 퍼블리싱된 데이터를 수신하여 처리한다.
DDS에서의 QoS (Quality of Service)
QoS는 DDS의 핵심 요소 중 하나로, 네트워크 상에서 전송되는 데이터의 품질과 속성을 정의한다. ROS2에서 DDS의 QoS 설정은 퍼블리셔와 서브스크라이버 간의 통신을 최적화하는 데 중요한 역할을 한다.
QoS는 데이터 전송 방식, 데이터 전달 보장, 네트워크 대역폭 제어 등 여러 측면에서 DDS의 성능을 결정한다.
주요 QoS 정책
1. 신뢰성 (Reliability)
신뢰성 정책은 데이터 전송 중 데이터 손실이 발생할 경우, 이를 복구할 수 있는지를 결정한다. 신뢰성(Reliable)과 최선(Best Effort)의 두 가지 모드가 존재한다.
- Reliable: 데이터를 수신할 때까지 송신자는 전송을 반복하며, 수신자는 송신자에게 데이터를 성공적으로 수신했음을 알려준다.
- Best Effort: 데이터는 한번 전송되며, 손실된 데이터는 재전송되지 않는다.
2. 지속성 (Durability)
지속성 정책은 퍼블리셔가 데이터를 전송한 후에도 서브스크라이버가 이를 수신할 수 있는지를 설정한다. 네 가지 지속성 레벨이 있다.
- Volatile: 퍼블리셔가 데이터를 전송할 때 서브스크라이버가 없으면 해당 데이터는 삭제된다.
- Transient Local: 퍼블리셔의 메모리 내에 저장되어 서브스크라이버가 나중에 데이터를 수신할 수 있다.
- Transient: 퍼블리셔가 아닌 DDS 인프라 내에 저장된다.
- Persistent: 데이터가 영구 저장소에 저장된다.
3. 이력 깊이 (History Depth)
이력 깊이는 서브스크라이버가 퍼블리셔로부터 수신하는 데이터의 수를 설정한다. 예를 들어, 이력 깊이를 10으로 설정하면 서브스크라이버는 최근 10개의 메시지만 수신하게 된다.
4. 리소스 제한 (Resource Limits)
리소스 제한은 메모리와 네트워크 사용량을 제어하는 정책이다. 이는 시스템 자원의 과도한 사용을 방지하는 데 중요하다.
DDS에서의 데이터 전송 모델
DDS는 퍼블리셔-서브스크라이버 모델을 기본으로 사용하지만, 이외에도 다양한 데이터 전송 모델을 제공한다. 각 모델은 시스템의 요구 사항에 맞춰 선택할 수 있으며, ROS2에서는 상황에 따라 다른 모델을 적용할 수 있다.
1. 주기적 데이터 전송 (Periodic Data Transmission)
주기적 데이터 전송 모델은 특정 주기에 따라 데이터를 퍼블리싱하는 방식이다. 실시간 시스템에서 주기적인 데이터를 송신할 때 유용하며, ROS2에서 사용되는 타이머와 밀접한 관련이 있다.
주기적 데이터 전송의 주기를 설정하는 경우, 타이머 인터벌에 따라 데이터를 송신하게 된다.
여기서 T_{\text{interval}}은 주기, f는 주파수이다.
2. 이벤트 기반 데이터 전송 (Event-Driven Data Transmission)
이벤트 기반 데이터 전송 모델은 특정 이벤트가 발생할 때만 데이터를 전송하는 방식이다. ROS2에서 센서 데이터의 변화를 감지하거나, 시스템 이벤트가 발생할 때 이벤트 기반으로 데이터를 송신하는 것이 이에 해당한다.
3. 요청-응답 모델 (Request-Reply Model)
이 모델은 요청(Request)과 응답(Reply)이 쌍으로 이루어지는 전송 방식이다. 서비스 호출과 비슷한 구조로, 클라이언트가 요청을 보내면 서버가 응답을 반환하는 구조이다. 이는 ROS2의 서비스와 매우 유사하며, 비동기 방식으로 동작할 수 있다.
4. 데이터 필터링
DDS는 대량의 데이터를 처리할 때 필터링 기능을 제공하여 불필요한 데이터를 제외하고 원하는 데이터만 송신하거나 수신할 수 있다. ROS2에서 대규모 데이터를 처리할 때 이 필터링 기능을 활용하면 네트워크 성능을 개선할 수 있다.
여기서 D_{\text{filtered}}는 필터링된 데이터, f는 필터 함수, D_{\text{original}}은 원본 데이터이다.
DDS의 데이터 통합과 분산
DDS는 분산 시스템에서 각 노드 간의 데이터를 효과적으로 통합 및 분산하는 기능을 지원한다. 특히 ROS2는 로봇 시스템의 분산 환경을 구축할 때 DDS의 이러한 특성을 적극 활용한다.
1. 데이터 통합
DDS는 다수의 데이터 작성자(Data Writer)로부터 데이터를 수집하여 단일 데이터 리더(Data Reader)에게 통합할 수 있다. 이는 여러 센서에서 데이터를 수집하고 이를 하나의 노드에서 처리할 때 유용하다.
2. 데이터 분산
반대로, DDS는 하나의 데이터 작성자로부터 데이터를 수신한 후, 다수의 데이터 리더에게 데이터를 분산할 수 있다. 이는 로봇 시스템에서 여러 노드가 동일한 데이터를 공유해야 할 때 적합한다.
DDS에서의 보안
DDS는 데이터 보안을 중요하게 다룬다. 특히 실시간 통신에서 데이터의 기밀성, 무결성, 가용성을 보장하기 위한 다양한 보안 기능을 제공한다. ROS2는 이러한 DDS 보안 기능을 활용하여 안전한 통신을 보장한다.
1. 보안 레벨 설정
DDS는 보안 요구 사항에 따라 다양한 보안 레벨을 설정할 수 있다. 보안 인증, 암호화, 무결성 검증 등이 이러한 설정에 포함된다.
- 암호화: 데이터 전송 시 데이터를 암호화하여 외부 공격으로부터 보호한다.
- 인증: 퍼블리셔와 서브스크라이버 간의 인증을 통해 신뢰할 수 있는 통신을 보장한다.
2. 보안 정책 구성
DDS에서 제공하는 다양한 보안 정책은 시스템의 요구 사항에 따라 설정할 수 있다. 각 정책은 데이터 송수신 시 적용되며, ROS2에서도 필요에 따라 이러한 보안 설정을 구성할 수 있다.
DDS의 미들웨어 구현체
DDS는 다양한 미들웨어 구현체를 통해 사용할 수 있으며, 각 구현체는 DDS 표준을 기반으로 동작하면서도 성능, 기능, 그리고 특정 환경에 맞춘 최적화된 특징을 갖는다. ROS2는 여러 DDS 구현체를 지원하며, 개발자는 프로젝트 요구에 따라 적합한 구현체를 선택할 수 있다.
1. Fast DDS (eProsima)
Fast DDS는 ROS2에서 기본으로 제공하는 DDS 구현체 중 하나로, 성능과 효율성에 중점을 둔 구현체이다. eProsima에서 개발된 이 구현체는 실시간 애플리케이션을 위한 빠른 데이터 전송을 제공한다. ROS2에서 기본적으로 사용하는 설정이기 때문에 많은 사용자들이 Fast DDS를 활용하게 된다.
2. RTI Connext DDS
RTI Connext DDS는 DDS의 표준 구현 중 하나로, 산업 및 상용 로봇에서 많이 사용된다. 높은 신뢰성과 실시간 요구 사항을 충족하는 성능을 제공한다. 특히, 실시간 제어 시스템에 적합한 특성을 갖추고 있으며, 시스템 간의 대규모 데이터 전송에서 강력한 성능을 발휘한다.
3. Cyclone DDS
Cyclone DDS는 특히 저자원 환경에서 효율적으로 동작하도록 설계된 DDS 구현체이다. ROS2에서 소형 임베디드 시스템과 같이 리소스가 제한된 환경에서 Cyclone DDS를 사용할 수 있으며, 저전력 시스템에서 성능을 극대화하기 위한 최적화가 이루어져 있다.
4. OpenSplice DDS
OpenSplice DDS는 데이터 중심의 시스템 통신을 위한 DDS 구현체로, 고성능과 확장성을 제공한다. 이 DDS 구현체는 다양한 시스템 아키텍처를 지원하며, 특히 고신뢰성과 실시간 성능을 요구하는 분야에 적합한다. OpenSplice DDS는 대규모 분산 시스템에서 안정적으로 데이터를 처리하는 데 중점을 두고 있다.
DDS에서의 데이터 전송 우선순위
DDS는 데이터 전송 시 우선순위를 설정할 수 있는 기능을 제공한다. 이는 실시간 시스템에서 중요한 데이터를 더 빨리 전송할 수 있게 하여, 시스템의 응답성을 높인다.
1. 우선순위 설정
각 데이터는 전송 우선순위를 가질 수 있으며, DDS는 이를 바탕으로 데이터 전송을 최적화한다. 예를 들어, 센서 데이터와 비상 데이터가 동시에 전송되어야 할 때, 비상 데이터에 더 높은 우선순위를 부여하여 지연 없이 처리할 수 있다.
여기서 P(\mathbf{d})는 데이터 \mathbf{d}의 우선순위를 나타낸다.
2. 우선순위 기반 데이터 큐
우선순위 설정에 따라 DDS는 데이터 전송을 위한 큐를 형성한다. 높은 우선순위의 데이터는 큐의 앞쪽에 배치되며, 더 빠르게 전송된다. 반면, 낮은 우선순위의 데이터는 뒤쪽에 배치되어 상대적으로 느리게 처리된다.
여기서 \mathbf{Q}는 우선순위에 따라 정렬된 데이터 큐이다.
ROS2에서의 DDS 선택
ROS2에서는 위에서 설명한 여러 DDS 구현체 중에서 프로젝트에 적합한 것을 선택할 수 있다. 각 구현체는 다양한 장단점을 가지고 있으며, 선택 기준은 다음과 같다.
- 성능: 실시간 성능이 중요한 경우 RTI Connext나 Fast DDS가 적합한다.
- 리소스 사용: 저전력, 임베디드 시스템에서는 Cyclone DDS가 더 적합할 수 있다.
- 기능 확장성: 복잡한 분산 시스템이나 대규모 통신이 필요한 경우 OpenSplice DDS와 같은 고성능 구현체를 사용할 수 있다.
DDS 구현체의 선택 방법
다음은 ROS2에서 DDS 구현체를 선택하는 방법에 대한 코드 예제이다. ROS2의 환경 설정 파일을 수정하여 기본 DDS 구현체를 변경할 수 있다.
export RMW_IMPLEMENTATION=rmw_fastrtps_cpp # Fast DDS 사용
또는 다음과 같이 RTI Connext DDS를 사용할 수 있다.
export RMW_IMPLEMENTATION=rmw_connext_cpp
환경 변수 RMW_IMPLEMENTATION
을 설정함으로써, ROS2는 해당 DDS 구현체를 사용하게 된다.
DDS의 확장성과 분산 처리
DDS는 확장성을 염두에 두고 설계된 프로토콜로, 대규모 분산 시스템에서 각 노드 간의 데이터 전송을 효율적으로 처리할 수 있다. 특히, ROS2는 분산 시스템에서 여러 노드가 동작하는 환경을 잘 지원하며, DDS의 확장성 덕분에 이러한 시스템에서 높은 성능을 발휘할 수 있다.
1. 분산 시스템의 주요 구성 요소
- 퍼블리셔-서브스크라이버 구조: 각 노드가 퍼블리셔와 서브스크라이버로 역할을 분담하며, 분산된 시스템에서 데이터를 송수신한다.
- 네임스페이스와 리매핑: 분산 시스템 내에서 각 노드가 별도의 네임스페이스를 가지며, 리매핑을 통해 원하는 통신 구조를 형성할 수 있다.
2. 분산 네트워크 구성 예시
다음은 분산 네트워크에서 퍼블리셔와 서브스크라이버가 어떻게 연결될 수 있는지를 보여주는 다이어그램이다.
위 다이어그램은 퍼블리셔 1과 퍼블리셔 2가 각각 Topic 1과 Topic 2에 데이터를 퍼블리싱하고, 해당 토픽을 구독하는 서브스크라이버들이 데이터를 수신하는 과정을 나타낸다.