DDS 의 QoS

민기·2025년 2월 4일

ROS

목록 보기
3/3
post-thumbnail

8.1 DDS의 서비스 품질(QoS, Quality of Service)

Qos 란 ?
"데이터 통신 옵션"

ROS 1 에서는 TCPROS 라는 자체 프로토콜을 사용했었는데, ROS 2 에서는 TCP 처럼 신뢰성을 중시 여기는 통신 방식과 UDP 처럼 통신 속도에 포커스를 맞춘 통신 방식을 선택적으로 사용할 수 있다.
ROS 2 에서는 Publisher 나 Subscribe 등을 선언할 때 QoS 를 인자로 지정할 수 있어서 원하는 데이터 통신의 옵션 설정을 유저가 직접 할 수 있게 되었다.

8.2 QoS 의 종류

위의 22가지 QoS 항목 중 ROS 2 에서는 대표적으로 Reliability 가 사용된다.
그 외에도 통신 상태에 따라 정해진 크기만큼의 데이터를 보관하는 History
데이터를 수신하는 Subscribe 가 생성되기 전의 데이터를 사용할지 폐기할지에 대한 설정 Durability
정해진 주기 안에 데이터가 발신 및 수신되지 않을 경우 이벤트 함수를 실행시키는 Deadline
정해진 주기 안에서 수신되는 데이터만 유효 판정하고 그렇지 않은 데이터는 삭제하는 Lifespan
정해진 주기 안에서 노드 혹은토픽의 생사 확인하는 Liveliness 등을 사용할 수 있다.

8.3 ROS 2에서 사용되는 QoS 옵션

8.3.1 History

1. Values

History : 데이터를 몇 개나 보관할지를 결정하는 QoS 옵션
KEEPLAST : 정해진 메시지 큐 크기만큼의 데이터를 보관
depth : 메시지 큐의 크기(KEEP_LAST 설정일 경우에만 유효)

KEEP_ALL : 모든 데이터를 보관(메시지 큐의 크기는 DDS 벤더마다 다름)

2. RxO(Requested by Offered)

해당사항 없음

3. Examples

[RCLCPP]
rclcpp::QoS(rclcpp::KeepLast(10));
[RCLPY]
qos_profile = QoSProfile(history=QoSHistoryPolicy.KEEP_LAST, depth=10)

8.3.2 Reliability

1. Values

Reliability : 데이터 전송에 있어 속도를 우선시 하는지 신뢰성을 우선시 하는지를 결정하는 옵션
BEST_EFFORT : 데이터 송신에 집중. 전송 속도를 중시하며 네트워크 상태에 따라 유실이 발생 가능
RELIABLE : 데이터 수신에 집중. 신뢰성을 중시하며 유실이 발생하면 재전송

2. RxO(Requested by Offered)

Pub(↓) / Sub(→)BEST_EFFORTRELIABLE
BEST_EFFORTBEST_EFFORT불가
RELIABLEBEST_EFFORTRELIABLE

3. Examples

[RCLCPP]
rclcpp::QoS(rclcpp::KeepAll).best_effort();
[RCLPY]
qos_profile = QoSProfile(reliability=QoSReliabilityPolicy.BEST_EFFORT)

8.3.3 Durability

1. Values

Durability : 데이터를 수신하는 서브스크라이버가 생성되기 전의 데이터를 사용할 것인지에 대한 옵션
TRANSIENT_LOCAL : Subscription 이 생성되기 전의 데이터도 보관
VOLATILE : Subscription이 생성되기 전의 데이터는 무효

2. RxO(Requested by Offered)

Pub(↓) / Sub(→)TRANSIENT_LOCALVOLATILE
TRANSIENT_LOCALTRANSIENT_LOCALVOLATILE
VOLATILE불가VOLATILE

3. Examples

[RCLCPP]
rclcpp::QoS(rclcpp::KeepAll).transient_local();
[RCLPY]
qos_profile = QoSProfile(durability=QoSDurabilityPolicy.TRANSIENT_LOCAL)

8.3.4 Deadline

1. Values

Deadline : 정해진 주기 안에 데이터가 발신 및 수신되지 않을 경우 EventCallback 을 실행시키는 옵션
deadline_duration : Deadline 을 확인하는 주기

2. RxO(Requested by Offered)

Pub(↓) / Sub(→)1000ms2000ms
1000ms가능가능
2000ms불가가능

3. Examples

[RCLCPP]
rclcpp::QoS(10).deadline(100ms)
[RCLPY]
qos_profile = QoSProfile(depth=10 deadline=Duration(0.1))

8.3.5 Lifespan

1. Values

Lifespan : 정해진 주기 안에서 수신되는 데이터만 유효 판정하고 그렇지 않은 데이터는 삭제하는 옵션
lifespan_duration : lifespan 을 확인하는 주기

2. RxO(Requested by Offered)

해당 없음

3. Examples

[RCLCPP]
rclcpp::QoS(10).reliable().transient_local().lifespan(10ms);
[RCLPY]
qos_profile = QoSProfile(lifespan=Duration(0.01))

8.3.6 Liveliness

1. Values

Liveliness : 정해진 주기 안에서 노드 혹은 토픽의 생사를 확인하는 옵션
liveliness : 자동 또는 매뉴얼로 확인할지를 지정하는 옵션, 다음 3가지 중 선택
(AUTOMATIC, MANUAL_BY_NODE, MANUAL_BY_TOPIC)
lease_duration : Liveliness 을 확인하는 주기

2. RxO(Requested by Offered)

Pub(↓) / Sub(→)AUTOMATICMANUAL_BY_NODEMANUAL_BY_TOPIC
AUTOMATIC가능불가불가
MANUAL_BY_NODE가능가능불가
MANUAL_BY_TOPIC가능가능가능

3. Examples

[RCLCPP]
rclcpp::QoS qos_profile(10);
qos_profile
.liveliness(RMW_QOS_POLICY_LIVELINESS_AUTOMATIC)
.liveliness_lease_duration(1000ms);
[RCLPY]
qos_profile = QoSProfile(
	liveliness=AUTOMATIC,
    liveliness_lease_duration=Duration(1.0))

마치며

점점.. 어려워지네요.. 천천히 조금씩이라도 해볼게요...

profile
민기임니다

1개의 댓글

comment-user-thumbnail
2025년 2월 5일

일단 나 딱 이해했어. 별로니까 거부하면 된다는거잖아

답글 달기