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

위의 22가지 QoS 항목 중 ROS 2 에서는 대표적으로 Reliability 가 사용된다.
그 외에도 통신 상태에 따라 정해진 크기만큼의 데이터를 보관하는 History
데이터를 수신하는 Subscribe 가 생성되기 전의 데이터를 사용할지 폐기할지에 대한 설정 Durability
정해진 주기 안에 데이터가 발신 및 수신되지 않을 경우 이벤트 함수를 실행시키는 Deadline
정해진 주기 안에서 수신되는 데이터만 유효 판정하고 그렇지 않은 데이터는 삭제하는 Lifespan
정해진 주기 안에서 노드 혹은토픽의 생사 확인하는 Liveliness 등을 사용할 수 있다.
History : 데이터를 몇 개나 보관할지를 결정하는 QoS 옵션
KEEPLAST : 정해진 메시지 큐 크기만큼의 데이터를 보관
depth : 메시지 큐의 크기(KEEP_LAST 설정일 경우에만 유효)
KEEP_ALL : 모든 데이터를 보관(메시지 큐의 크기는 DDS 벤더마다 다름)
해당사항 없음
[RCLCPP]
rclcpp::QoS(rclcpp::KeepLast(10));
[RCLPY]
qos_profile = QoSProfile(history=QoSHistoryPolicy.KEEP_LAST, depth=10)
Reliability : 데이터 전송에 있어 속도를 우선시 하는지 신뢰성을 우선시 하는지를 결정하는 옵션
BEST_EFFORT : 데이터 송신에 집중. 전송 속도를 중시하며 네트워크 상태에 따라 유실이 발생 가능
RELIABLE : 데이터 수신에 집중. 신뢰성을 중시하며 유실이 발생하면 재전송
| Pub(↓) / Sub(→) | BEST_EFFORT | RELIABLE |
|---|---|---|
| BEST_EFFORT | BEST_EFFORT | 불가 |
| RELIABLE | BEST_EFFORT | RELIABLE |
[RCLCPP]
rclcpp::QoS(rclcpp::KeepAll).best_effort();
[RCLPY]
qos_profile = QoSProfile(reliability=QoSReliabilityPolicy.BEST_EFFORT)
Durability : 데이터를 수신하는 서브스크라이버가 생성되기 전의 데이터를 사용할 것인지에 대한 옵션
TRANSIENT_LOCAL : Subscription 이 생성되기 전의 데이터도 보관
VOLATILE : Subscription이 생성되기 전의 데이터는 무효
| Pub(↓) / Sub(→) | TRANSIENT_LOCAL | VOLATILE |
|---|---|---|
| TRANSIENT_LOCAL | TRANSIENT_LOCAL | VOLATILE |
| VOLATILE | 불가 | VOLATILE |
[RCLCPP]
rclcpp::QoS(rclcpp::KeepAll).transient_local();
[RCLPY]
qos_profile = QoSProfile(durability=QoSDurabilityPolicy.TRANSIENT_LOCAL)
Deadline : 정해진 주기 안에 데이터가 발신 및 수신되지 않을 경우 EventCallback 을 실행시키는 옵션
deadline_duration : Deadline 을 확인하는 주기
| Pub(↓) / Sub(→) | 1000ms | 2000ms |
|---|---|---|
| 1000ms | 가능 | 가능 |
| 2000ms | 불가 | 가능 |
[RCLCPP]
rclcpp::QoS(10).deadline(100ms)
[RCLPY]
qos_profile = QoSProfile(depth=10 deadline=Duration(0.1))
Lifespan : 정해진 주기 안에서 수신되는 데이터만 유효 판정하고 그렇지 않은 데이터는 삭제하는 옵션
lifespan_duration : lifespan 을 확인하는 주기
해당 없음
[RCLCPP]
rclcpp::QoS(10).reliable().transient_local().lifespan(10ms);
[RCLPY]
qos_profile = QoSProfile(lifespan=Duration(0.01))
Liveliness : 정해진 주기 안에서 노드 혹은 토픽의 생사를 확인하는 옵션
liveliness : 자동 또는 매뉴얼로 확인할지를 지정하는 옵션, 다음 3가지 중 선택
(AUTOMATIC, MANUAL_BY_NODE, MANUAL_BY_TOPIC)
lease_duration : Liveliness 을 확인하는 주기
| Pub(↓) / Sub(→) | AUTOMATIC | MANUAL_BY_NODE | MANUAL_BY_TOPIC |
|---|---|---|---|
| AUTOMATIC | 가능 | 불가 | 불가 |
| MANUAL_BY_NODE | 가능 | 가능 | 불가 |
| MANUAL_BY_TOPIC | 가능 | 가능 | 가능 |
[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))
점점.. 어려워지네요.. 천천히 조금씩이라도 해볼게요...
일단 나 딱 이해했어. 별로니까 거부하면 된다는거잖아