글 / ROS 2 기초

ROS 2 QoS 호환 규칙

구독자의 요청이 발행자의 제공보다 엄격한 정책이 하나라도 있으면 연결되지 않으며 메시지가 수신되지 않는다.

작성일 · 읽는 시간 2분 · ROS 2 Jazzy 기준

문제 정의

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 됨 새 메시지와 이전 메시지

발행자 제공과 구독자 요청의 조합별 QoS 연결 여부

센서 데이터 프로파일

기본 프로파일은 reliable, volatile에 큐 깊이 10이다. 센서 데이터 프로파일은 best effort에 큐 깊이 5이다. 발행자가 센서 데이터 프로파일을 사용하고 구독자를 기본값으로 생성하면 첫째 표의 둘째 행에 해당한다.

python구독 노드의 생성자 안에서
# 맨 위에 둘 줄: 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 줄을 표와 대조한다.

bash
ros2 topic info /reading --verbose
참고

rclpy 구독자는 QoS가 호환되지 않는 발행자를 발견하면 경고 로그를 기록한다.