History와 Depth

콜백이 바쁜 사이에 온 메시지는 어디서 기다릴까?

대기열

메시지는 대기열에 줄을 섭니다

받은 메시지는 콜백이 꺼내 갈 때까지 대기열(queue)에서 기다립니다. 콜백이 바쁘면 그동안 온 메시지가 쌓입니다. 이 대기열을 어떻게 다룰지 정하는 정책이 History, 크기가 Depth입니다.

발행 쪽에도 보내기 전 메시지를 담아 두는 대기열이 있습니다.

Keep last

가득 차면 가장 오래된 것을 버립니다

KEEP_LAST는 최근 N개만 남깁니다. N이 Depth입니다. 새 메시지가 왔는데 칸이 다 찼으면, 가장 오래된 메시지를 버리고 그 자리를 씁니다.

History의 기본값이 Keep last입니다.

Depth

Depth는 대기열 크기입니다

메시지가 한꺼번에 몰려와도 Depth 10이면 열 개를 모두 붙잡아 둡니다. Depth 1이면 늘 가장 새 메시지 하나만 남습니다. Depth는 History가 Keep last일 때만 쓰입니다.

Keep all

Keep all은 버리지 않고 쌓습니다

KEEP_ALL은 메시지를 버리지 않고 모두 담습니다. 그렇다고 끝없이 쌓이지는 않습니다. 미들웨어의 자원 한도까지만 담습니다. 입문에서는 Keep last에 알맞은 Depth를 고르면 충분합니다.

같은 뜻

숫자 10은 최근 10개라는 뜻

1편에서 본 숫자 10은 History를 Keep last로, Depth를 10으로 정한다는 뜻입니다. 아래처럼 HistoryPolicy를 써서 길게 적어도 같습니다. 나머지 정책은 기본값 그대로입니다.

HistoryPolicy도 rclpy.qos에서 가져옵니다.

고르는 법

최신 값만 쓴다면 작게

콜백이 느린데 Depth가 크면, 콜백은 쌓인 순서대로 오래된 메시지부터 처리합니다. 속도 명령처럼 지금 값만 의미 있는 데이터는 Depth를 작게 둡니다. 하나도 놓치기 싫은 데이터는 넉넉하게 둡니다.

5번, 1초, 번호는 예시 값입니다.

다음 편

구독자가 늦게 오면 지나간 메시지는 못 받을까요?

4편늦게 온 구독자도 받게 11강 목록