Reliability
잃어버린 라이다 한 장, 다시 보내 달라고 해야 할까?
두 가지 값
Reliable과 Best effort
Reliability(신뢰성)는 메시지를 꼭 전할지 정합니다. RELIABLE은 잃은 것을 다시 보내 전달하려 하고, 그러려고 여러 번 다시 보낼 수 있습니다. BEST_EFFORT는 보내 보되, 네트워크가 나쁘면 잃을 수 있습니다.
기본값은 Reliable입니다(1편).
Reliable
잃은 것은 다시 보냅니다
Reliable에서는 받는 쪽이 무엇을 받았는지 알려 주고, 빠진 것은 다시 보냅니다. 그래서 네트워크에서 잃은 것은 다시 받습니다. 단, 대기열(Depth)이 넘치면 Reliable이어도 오래된 메시지는 버려집니다(3편). 또 다시 보내는 데 시간이 들어, 무선 네트워크가 나쁘면 메시지가 늦게 도착할 수 있습니다.
Best effort
잃은 것은 잊고 다음 것을 받습니다
Best effort는 잃어버린 메시지를 다시 보내지 않습니다. 라이다처럼 1초에 여러 번 오는 데이터라면 #4를 잃어도 곧 #5, #6이 옵니다. 다시 보내느라 기다리지 않으니 가장 새 값을 빨리 받습니다.
고르는 법
놓치면 안 되면 Reliable, 신선함이 먼저면 Best effort
센서처럼 자주, 많이 오는 데이터는 흔히 Best effort로 보냅니다. 명령이나 지도처럼 하나라도 빠지면 곤란한 것은 Reliable로 둡니다. 서비스는 기본으로 Reliable입니다.
흔히 쓰는 조합의 예입니다. 실제 값은 토픽마다 1편에서 본 ros2 topic info -v로 확인합니다.
코드
QoSProfile로 직접 정합니다
숫자 10 대신 QoSProfile을 넘기면 정책을 하나씩 정할 수 있습니다. 여기서는 Depth 10에 Reliability만 BEST_EFFORT로 바꿨습니다. 서브스크라이버도 create_subscription에 같은 방법으로 넘깁니다.
예시 코드입니다. LaserScan은 sensor_msgs.msg에서 가져옵니다(4강 7편).
따라 하기
받는 쪽 QoS를 골라서 엿듣기
거북이를 띄운 채 ros2 topic echo /turtle1/pose --qos-reliability best_effort를 실행합니다. turtlesim은 Reliable로 보내지만, Best effort로 받아도 메시지가 잘 옵니다. 왜 되는지는 5편에서 봅니다.
옵션을 빼면 ros2 topic echo가 발행 쪽에 맞춰 QoS를 고릅니다. 거북이를 움직였다면 값은 다릅니다.
다음 편