ROS 2 QoS 호환 규칙
구독자의 요청이 발행자의 제공보다 엄격한 정책이 하나라도 있으면 연결되지 않으며 메시지가 수신되지 않는다.
문제 정의
ROS 2에서는 토픽 이름과 메시지 타입이 같아도 QoS(Quality of Service, 전송 품질 설정)가 호환되지 않으면 발행자와 구독자가 연결되지 않는다. 두 노드는 정상적으로 실행 중이지만 메시지는 하나도 수신되지 않는다.
요청과 제공
구독자는 수용할 수 있는 최소 품질을 요청하고, 발행자는 지원할 수 있는 최대 품질을 제공한다. 요청이 제공보다 엄격한 정책이 하나라도 있으면 연결되지 않는다.
reliability(best effort, reliable)는 전달을 보장하는지를, durability(volatile, transient local)는 뒤늦게 연결된 구독자에게 이전 메시지를 전달하는지를 결정한다. 첫째 표가 reliability, 둘째 표가 durability이다.
| 발행자 | 구독자 | 연결 |
|---|---|---|
| best effort | best effort | 됨 |
| best effort | reliable | 안 됨 |
| reliable | best effort | 됨 |
| reliable | reliable | 됨 |
| 발행자 | 구독자 | 연결 | 수신 메시지 |
|---|---|---|---|
| volatile | volatile | 됨 | 새 메시지 |
| volatile | transient local | 안 됨 | 없음 |
| transient local | volatile | 됨 | 새 메시지 |
| transient local | transient local | 됨 | 새 메시지와 이전 메시지 |
센서 데이터 프로파일
기본 프로파일은 reliable, volatile에 큐 깊이 10이다. 센서 데이터 프로파일은 best effort에 큐 깊이 5이다. 발행자가 센서 데이터 프로파일을 사용하고 구독자를 기본값으로 생성하면 첫째 표의 둘째 행에 해당한다.
# 맨 위에 둘 줄: from rclpy.qos import qos_profile_sensor_data
# 발행자가 best effort이므로 구독자도 같은 프로파일로 맞춘다
self.sub = self.create_subscription(
String, 'reading', self.on_message, qos_profile_sensor_data)
확인 방법
--verbose를 지정하면 발행자와 구독자별 QoS가 출력된다. 양측의 Reliability, Durability 줄을 표와 대조한다.
ros2 topic info /reading --verbose
참고
rclpy 구독자는 QoS가 호환되지 않는 발행자를 발견하면 경고 로그를 기록한다.