본문 바로가기

ROS2 QoS Profile 설정하기 본문

BF 2024/ROS2

ROS2 QoS Profile 설정하기

jaegomhoji 2023. 4. 16. 01:39

 

주행로봇에서 받아들이는 비전 데이터와 센서값들의 송수신 상태를 설정하지 않고 노드간 토픽을 주고받아서 그런지, 

뭔가 뜻대로 움직이지 않는다. 제대로 설정하기 위해 QoS Profile을 공부해본다. 인제 갓 ROS 공부하는 입장에서 친절한 자료들이 많지는 않았다 ㅜㅜ.

 

다음 유투브에서 언급하고 있는 내용을 많은 부분 요약하였다.

 https://www.youtube.com/watch?v=EOqqO35fL_8

 

Topic, Service, Action 제각기 QoS를 설정할 수 있다.

 

1. QoS Profile의 옵션 

 

History depth: 메시지 히스토리의 깊이를 설정합니다. 통신 상태에 따라서 (이전 메시지의 수) 정해진 사이즈만큼의 데이터를 보관

 

values

  • KEEP_LAST = 정해진 메시지 큐 사이즈 만큼의 데이터를 보관
  • 현재 개발중인 코드에서 QosProfile(depth=10 ) ← 이 코드라인은 KEEP_LAST 설정일 경우에만 유효
  • 예제 QoSProfile(history=QoSHistoryPolicy.KEEP_LAST, depth = 10 )
  • RxO ( Requested by Offered ) : 관련 없음

Depth: 토픽에서 메시지를 처리하는 데 필요한 메모리의 양을 설정합니다.

 

Reliability: 메시지 송수신의 신뢰성을 설정합니다. 신뢰성이 높은 옵션은 QoS 프로파일에서 'RELIABLE'로 설정됩니다.

→ 데이터 손실과 관련한 설정으로 속도를 우선시하는지, 신뢰성을 우선시 하는지를 결정할 수 있다.

 

values

  • BEST_EFFORT : 전송 속도를 중시, 네트워크 상태에 따라서 유실 발생 가능
  • RELIABLE : 데이터 수신에 집중, 신뢰성을 중시하며 유실이 발생하면 재전송을 통해 수신 보장
  • RxO ( 아래의 표 참고 )
  • 예제 QoSProfile(reliability=QoSReliabilityPolicy.Best_EFFORT)

 

Durability: 메시지의 지속성을 설정합니다. 지속성이 높은 옵션은 QoS 프로파일에서 'TRANSIENT_LOCAL' 또는 'TRANSIENT'로 설정됩니다.

→ 섭스크라이버가 생성되기 전의 데이터를 사용할지 폐기할지에 대한 설정

  • TRANSIENT_LOCAL : Subscription이 생성되기 전에 데이터 보관 ( 퍼블리셔만 적용 가능 )
  • Volatile : 유동적, subscription 생성되기 전의 데이터는 무효
  • RxO ( 아래의 표 참고 )
  • 예제 QoSProfile(durability=QoSDurabilityPolicy.TRANSIENT_LOCAL)

Liveliness: 노드의 액티브 상태를 설정합니다. Liveliness 프로토콜은 노드의 액티브 상태를 확인하여 노드가 계속 작동 중인지 확인합니다.

→ 정해진 주기 안에서 수신되는 데이터만 유효 판정되고, 나머지 데이터는 ‘삭제’

  • liveliness : 자동 혹은 메뉴얼로 확인할지를 지정하는 옵션 ( AUTOMATIC, MANUAL_BY_NODE, MANUAL_BY_TOPIC )
  • lease_duration : liveliness를 확인하는 주기
  • RxO (아래의 표 참고 )
  • 예제 QoSProfile( liveliness = AUTOMATIC, liveliness_lease_duration=Duration(1.0))

 

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

  • Lifespan_duration : Lifespan을 확인하는 주기 ( python ← seconds )
  • RxO ( 없음 )
  • 예제 : QoSProfile(lifespan=Duration(0.01))

 

Deadline: 메시지가 송신된 후에 얼마나 빨리 메시지를 수신해야 하는지 설정합니다. 데드라인을 설정하면 메시지가 일정 시간 내에 처리되지 않으면 손실될 수 있습니다.

→ 정해진 주기 안에 데이터가 발신 및 수신되지 않을 경우 이벤트 함수를 실행시키는 기능

  • Deadline_duration : Deadline을 확인하는 주기 ( python ← seconds , cpp ← mili seconds )
  • 예제 QosProfile(depth =10, deadline=Duration(0.1)
  • RxO ( 아래의 표 참고 )

Compatibility Table ( 출처 : https://www.youtube.com/watch?v=xhwNmqPOXqU  )

 

2.2 RMW QoS Profile 사용

ROS 2의 RMW에서 QoS 설정을 쉽게 사용할 수 있도록 많이 사용하는 QoS 설정을 세트로 표현해둔 것을 RMW QoS Profile라고 한다.

 

목적에 따라 Default, Sensor Data, Service, Action Status, Parameters, Parameter Events의 6가지로 구분되며, Relibility, History, Depth, Durability를 설정한다.

 

사용 예제 

from rclpy.qos import qos_profile_sensor_data
self.sensor_publisher = self.create_publisher(Int8MultiArray, 'sensor', qos_profile_sensor_data)

 

사용자가 직접 설정하여 새로운 프로파일을 만들 수도 있다.

from rclpy.qos import QoSDurabilityPolicy
from rclpy.qos import QoSHistoryPolicy
from rclpy.qos import QiSOrifuke
from rclpy.qos import QoSReliabilityPolicy

QOS_RKL10V = QoSProfile(
reliability=QoSReliabilityPolicy.RELIABLE,
    history=QoSHistoryPolicy.KEEP_LAST,
    depth=10,
    durability=QoSDurabilityPolicy.VOLATILE)
    
self.sensor_publisher = self.create_publisher(Int8MultiArray, 'sensor', QOS_RKL10V)

Comments