ROS 2 토픽·서비스·액션 선택 기준
지속적으로 전송되는 값은 토픽, 단시간에 완료되는 요청은 서비스, 장시간 실행되고 취소가 필요한 작업은 액션으로 구분한다.
선택의 필요성
ROS 2 노드는 토픽, 서비스, 액션의 세 가지 방식으로 데이터를 송수신한다. 어느 방식으로도 값을 전송할 수는 있지만 방식마다 전제가 다르다. 적합하지 않은 방식을 선택하면 호출 측이 결과를 대기하며 정지하거나, 작업이 어디까지 진행되었는지 확인할 방법이 없어진다.
세 방식의 전제
- 토픽: 발행자(publisher)가 발행한 값을 같은 이름을 구독하는 모든 노드가 수신한다. 응답은 없다.
- 서비스: 클라이언트가 요청하고 서버가 결과를 반환하는 원격 호출이다. 클라이언트가 결과를 대기하므로 단시간에 완료되어야 한다.
- 액션: 장시간 실행되는 원격 호출이다. 서버가 중간 경과를 전달하고, 클라이언트는 실행 도중에 취소할 수 있다.
이 차이는 정의 파일에도 나타난다. ---로 구분된 부분이 토픽은 하나, 서비스는 둘, 액션은 셋이다.
# 토픽 (.msg)
uint32 field1
string field2
# 서비스 (.srv): 요청, 응답
uint32 request
---
uint32 response
# 액션 (.action): 요청, 결과, 경과
int32 request
---
int32 response
---
int32 feedback
비교
| 토픽 | 서비스 | 액션 | |
|---|---|---|---|
| 흐름 | 단방향으로 계속 | 요청 한 번, 응답 한 번 | 요청, 경과 여러 번, 결과 |
| 소요 시간 | 무관 | 짧아야 함 | 길어도 됨 |
| 수신 측 | 구독자 여럿 | 이름마다 서버 하나 | 이름마다 서버 하나 |
| 취소 | 없음 | 없음 | 있음 |
| 적합한 예 | 센서 값, 상태 | 값 조회, 짧은 계산 | 목표 지점까지 이동 |
선택 순서
- 응답이 필요 없고 값이 지속적으로 발생하면 토픽을 선택한다.
- 응답이 필요하고 단시간에 완료되면 서비스를 선택한다.
- 완료까지 시간이 소요되거나 실행 도중에 중단할 수 있어야 하면 액션을 선택한다.
액션 하나에는 서비스 셋과 토픽 둘이 수반되므로 짧은 호출까지 액션으로 구현할 필요는 없다. 반대로 장시간 실행되는 작업을 서비스로 구현하면 클라이언트는 경과를 알지 못한 채 대기해야 한다.