# DDS 프로토콜 이해

#### 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개의 메시지만 수신하게 된다.

$$
\mathbf{H} = \text{이력 깊이 값}
$$

**4. 리소스 제한 (Resource Limits)**

리소스 제한은 메모리와 네트워크 사용량을 제어하는 정책이다. 이는 시스템 자원의 과도한 사용을 방지하는 데 중요하다.

#### DDS에서의 데이터 전송 모델

DDS는 **퍼블리셔-서브스크라이버** 모델을 기본으로 사용하지만, 이외에도 다양한 데이터 전송 모델을 제공한다. 각 모델은 시스템의 요구 사항에 맞춰 선택할 수 있으며, ROS2에서는 상황에 따라 다른 모델을 적용할 수 있다.

**1. 주기적 데이터 전송 (Periodic Data Transmission)**

주기적 데이터 전송 모델은 특정 주기에 따라 데이터를 퍼블리싱하는 방식이다. 실시간 시스템에서 주기적인 데이터를 송신할 때 유용하며, ROS2에서 사용되는 타이머와 밀접한 관련이 있다.

주기적 데이터 전송의 주기를 설정하는 경우, 타이머 인터벌에 따라 데이터를 송신하게 된다.

$$
T\_{\text{interval}} = \frac{1}{f}
$$

여기서 $T\_{\text{interval}}$은 주기, $f$는 주파수이다.

**2. 이벤트 기반 데이터 전송 (Event-Driven Data Transmission)**

이벤트 기반 데이터 전송 모델은 특정 이벤트가 발생할 때만 데이터를 전송하는 방식이다. ROS2에서 센서 데이터의 변화를 감지하거나, 시스템 이벤트가 발생할 때 이벤트 기반으로 데이터를 송신하는 것이 이에 해당한다.

**3. 요청-응답 모델 (Request-Reply Model)**

이 모델은 요청(Request)과 응답(Reply)이 쌍으로 이루어지는 전송 방식이다. 서비스 호출과 비슷한 구조로, 클라이언트가 요청을 보내면 서버가 응답을 반환하는 구조이다. 이는 ROS2의 **서비스**와 매우 유사하며, **비동기** 방식으로 동작할 수 있다.

$$
\mathbf{R}*{\text{client}} \xrightarrow{\text{Request}} \mathbf{S}*{\text{server}} \xrightarrow{\text{Reply}} \mathbf{R}\_{\text{client}}
$$

**4. 데이터 필터링**

DDS는 대량의 데이터를 처리할 때 **필터링** 기능을 제공하여 불필요한 데이터를 제외하고 원하는 데이터만 송신하거나 수신할 수 있다. ROS2에서 대규모 데이터를 처리할 때 이 필터링 기능을 활용하면 네트워크 성능을 개선할 수 있다.

$$
D\_{\text{filtered}} = f(D\_{\text{original}})
$$

여기서 $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}) = \text{우선순위 레벨}
$$

여기서 $P(\mathbf{d})$는 데이터 $\mathbf{d}$의 우선순위를 나타낸다.

**2. 우선순위 기반 데이터 큐**

우선순위 설정에 따라 DDS는 데이터 전송을 위한 큐를 형성한다. 높은 우선순위의 데이터는 큐의 앞쪽에 배치되며, 더 빠르게 전송된다. 반면, 낮은 우선순위의 데이터는 뒤쪽에 배치되어 상대적으로 느리게 처리된다.

$$
\mathbf{Q} = {\mathbf{d}\_1, \mathbf{d}\_2, \dots, \mathbf{d}\_n}
$$

여기서 $\mathbf{Q}$는 우선순위에 따라 정렬된 데이터 큐이다.

#### ROS2에서의 DDS 선택

ROS2에서는 위에서 설명한 여러 DDS 구현체 중에서 프로젝트에 적합한 것을 선택할 수 있다. 각 구현체는 다양한 장단점을 가지고 있으며, 선택 기준은 다음과 같다.

* **성능**: 실시간 성능이 중요한 경우 RTI Connext나 Fast DDS가 적합한다.
* **리소스 사용**: 저전력, 임베디드 시스템에서는 Cyclone DDS가 더 적합할 수 있다.
* **기능 확장성**: 복잡한 분산 시스템이나 대규모 통신이 필요한 경우 OpenSplice DDS와 같은 고성능 구현체를 사용할 수 있다.

#### DDS 구현체의 선택 방법

다음은 ROS2에서 DDS 구현체를 선택하는 방법에 대한 코드 예제이다. ROS2의 환경 설정 파일을 수정하여 기본 DDS 구현체를 변경할 수 있다.

```bash
export RMW_IMPLEMENTATION=rmw_fastrtps_cpp   # Fast DDS 사용
```

또는 다음과 같이 RTI Connext DDS를 사용할 수 있다.

```bash
export RMW_IMPLEMENTATION=rmw_connext_cpp
```

환경 변수 `RMW_IMPLEMENTATION`을 설정함으로써, ROS2는 해당 DDS 구현체를 사용하게 된다.

#### DDS의 확장성과 분산 처리

DDS는 확장성을 염두에 두고 설계된 프로토콜로, 대규모 분산 시스템에서 각 노드 간의 데이터 전송을 효율적으로 처리할 수 있다. 특히, ROS2는 분산 시스템에서 여러 노드가 동작하는 환경을 잘 지원하며, DDS의 확장성 덕분에 이러한 시스템에서 높은 성능을 발휘할 수 있다.

**1. 분산 시스템의 주요 구성 요소**

* **퍼블리셔-서브스크라이버 구조**: 각 노드가 퍼블리셔와 서브스크라이버로 역할을 분담하며, 분산된 시스템에서 데이터를 송수신한다.
* **네임스페이스와 리매핑**: 분산 시스템 내에서 각 노드가 별도의 네임스페이스를 가지며, 리매핑을 통해 원하는 통신 구조를 형성할 수 있다.

**2. 분산 네트워크 구성 예시**

다음은 분산 네트워크에서 퍼블리셔와 서브스크라이버가 어떻게 연결될 수 있는지를 보여주는 다이어그램이다.

{% @mermaid/diagram content="graph LR
P1(Publisher 1) --> T1(Topic 1)
P2(Publisher 2) --> T2(Topic 2)
T1 --> S1(Subscriber 1)
T2 --> S2(Subscriber 2)
S1 --> R1(Receiver 1)
S2 --> R2(Receiver 2)" %}

위 다이어그램은 퍼블리셔 1과 퍼블리셔 2가 각각 Topic 1과 Topic 2에 데이터를 퍼블리싱하고, 해당 토픽을 구독하는 서브스크라이버들이 데이터를 수신하는 과정을 나타낸다.
