Overview
ROS 2는 어떤 구독(subscription)이 받은 메시지에 대한 통계를 내장 측정할 수 있다. 구독별로 통계를 수집하면 시스템 성능을 파악하거나 문제 진단에 활용할 수 있다.
측정 항목은 수신 메시지 주기(received message period) 와 수신 메시지 나이(received message age) 이다. 각 항목마다 평균·최대·최소·표준편차·샘플 수가 제공되며, 이동 윈도우(moving window) 안에서 계산된다.
How statistics are calculated (계산 방식)
각 통계 집합은 libstatistics_collector 유틸리티로 상수 시간·상수 메모리로 계산된다. 구독이 새 메시지를 받을 때마다 현재 측정 윈도우에 샘플이 하나 추가된다. 평균은 이동 평균, 최대·최소·샘플 수는 샘플마다 갱신되고, 표준편차는 Welford의 온라인 알고리즘으로 구한다.
Types of statistics calculated (통계 종류)
| 항목 | 단위 | 설명 |
|---|---|---|
| Received message period | ms | 시스템 시계로 측정한 연속 수신 메시지 간 간격. |
| Received message age | ms | 메시지가 퍼블리셔에서 나온 뒤 얼마나 지났는지. 메시지 헤더에 타임스탬프가 있어야 계산 가능. |
Behavior (동작)
- 기본값: 토픽 통계는 꺼져 있다. 해당 노드의 구독 설정 옵션에서 이 기능을 켜면, 그 구독에 대해 주기·나이 측정이 모두 활성화된다.
- 발행: 통계는 statistics_msg/msg/MetricsMessage 타입으로, 설정 가능한 주기(기본 1초)에 설정 가능한 토픽(기본
/statistics)에 발행된다. 이 발행 주기가 샘플 수집 윈도우 주기이기도 하다. - 나이(age): 헤더에 타임스탬프가 없으면 나이를 구할 수 없으므로, 값을 채우지 않고 NaN으로 발행한다. 아예 발행하지 않는 것보다 “측정 불가”를 명시해 신호 부재로 오해하지 않게 한다.
- 주기(period): 윈도우의 첫 번째 샘플에서는 주기 값을 내지 않는다. “이전 메시지 도착 시각”이 필요하기 때문이며, 그 다음 샘플부터 주기가 계산된다.
Comparison to ROS 1
ROS 1 토픽 통계와 비슷하게 메시지 나이·주기를 구독 측에서 계산한다. ROS 1에 있던 드롭된 메시지 수, 트래픽량 같은 지표는 현재 제공하지 않는다.
Support (지원)
문서 기준으로 이 기능은 rclcpp(C++) 에서 지원된다. Python 지원 등 추가 개선은 공식 문서의 해당 섹션에서 확인할 수 있다.