basic - services

ROS 2에서 **서비스(Service)**는 **원격 프로시저 호출(RPC)**을 의미한다. 한 노드가 다른 노드에게 계산을 요청하고, 그 노드가 연산을 수행한 뒤 결과를 한 번 반환하는 구조다.

RPC(Remote Procedure Call)
네트워크로 연결된 다른 프로세스의 함수를 로컬 함수처럼 호출하는 기술. 클라이언트가 요청을 보내면 서버가 계산 후 응답을 돌려준다.

서비스 메시지 정의는 **요청(request)**과 응답(response) 두 부분으로 나뉜다.

uint32 a
uint32 b
---
uint32 sum

ROS 2에서는 클라이언트가 결과를 기다리는 방식이므로, 서비스는 빠르게 응답하는 작업에 쓴다. 오래 걸리거나 중간에 취소·선점이 필요하거나 진행 피드백이 필요한 작업에는 액션을 사용한다. 서비스를 쓰면 안 되는 경우 예: 긴 계산, 로봇 이동, 취소(preempt) 가능 작업, 상태 피드백이 필요한 작업.

서비스는 서비스 이름(토픽 이름과 비슷하지만 별도 네임스페이스)으로 식별된다. 서비스는 Service ServerService Client 두 부분으로 구성된다.

Service Server

Service Server는 원격 프로시저 요청을 받아 연산을 수행하고 결과를 반환하는 쪽이다. 위 예에서 서버는 ab를 받아 더한 뒤 sum을 반환한다.

하나의 서비스 이름에는 Service Server는 하나만 있어야 한다. 같은 이름에 서버가 여러 개면 어떤 서버가 요청을 받을지 정의되지 않는다.

Service Client

Service Client는 Service Server에게 연산을 요청하는 쪽이다. 위 예에서 클라이언트는 a, b를 담은 요청을 보내고, 서버가 sum을 계산해 돌려줄 때까지 대기한다. Service Client는 동일 서비스 이름에 여러 개 존재할 수 있다.

Service 명령어

# 서비스 목록 확인
ros2 service list

# 서비스 타입 확인
ros2 service type /turtle1/teleport_absolute
# turtlesim/srv/TeleportAbsolute

# 서비스 인터페이스(요청/응답 필드) 확인
ros2 interface show turtlesim/srv/TeleportAbsolute
# float32 x
# float32 y
# float32 theta
# ---

# 서비스 호출 (x, y, theta 값 전달)
ros2 service call /turtle1/teleport_absolute turtlesim/srv/TeleportAbsolute "{x: 2, y: 2, theta: 1.57}"

참고: Services — ROS 2 Jazzy