본문으로 바로가기

ROS2 Service

category 강좌/ROS2 2026. 5. 4. 15:05
728x90
728x90

1. ROS 2 Service란 무엇인가요?

ROS 2에서 Service는 한 노드가 다른 노드에게 특정 작업을 요청하고, 그 결과를 응답받는 통신 방식입니다.

Topic이 계속 데이터를 주고받는 구조라면, Service는 다음과 같은 형태입니다.

 

 

위의 그림과 같이 Node A와 Node B가 연결되어 있고 이때 사용하는 방식은 동기식 양방향 메시지 송수신 방식입니다.

Service Client는 서비스의 요청(Request)을 하는 쪽이며, Service Server는 요청받은 서비스를 수행한 후 서비스의 응답(Response)을 합니다. ROS2의 서비스는 특정 요청을 하는 클라이언트와 요청받은 일을 수행한 후에 그 결괏값을 돌려주는 서버 와의 통신입니다. 서비스 요청과 응답(Request/Response)은  msg 인터페이스의 변형인 srv 인터페이스를 사용합니다.

 

즉, 서비스는 요청과 응답이 한 쌍으로 동작하는 통신 방식입니다.

예를 들어 turtlesim에서 거북이를 특정 위치로 순간 이동시키고 싶을 때, 클라이언트가 /turtle1/teleport_absolute 서비스를 호출하면 turtlesim 노드가 요청을 처리하고 결과를 응답합니다.

 

Service Serve에는 다수의 클라이언트가 접속할 수 있습니다. 그러나 서비스 응답은 서비스를 요청한 서비스 클라이언트에 대해서만 응답을 수행합니다. 아래의 그림은 이 예를 설명하고 있습니다.

 

 

 

Node C의 Service Client가 Node B의 Service Server에 서비스 요청을 하였다면 Node B의 Service Server는 요청받은 서비스를 수행한 후 Node C의 Service Client에게만 서비스 응답을 하게 됩니다.

 

 

2. 현재 사용할 수 있는 서비스 목록 확인

새로운 터미널을 실행한 상태에서 turtlesim 노드를 실행합니다. 단 .bashrc에는 ros2 실행환경에 선언이 추가되어 있어야 합니다.

 

ros2 run turtlesim turtlesim_node

 

 

 

새로운 터미널을 실행하고 서비스 리스트를 볼 수 있는 다음 명령을 입력합니다.

 

ros2 service list

 

 

 

위의 그림과 같이 대표적인 서비스들이 나타납니다.

여기서 /clear, /kill, /reset, /spawn처럼 바로 서비스 이름이 나오는 것도 있고, /turtle1/teleport_absolute처럼 앞에 /turtle1이 붙는 것도 있습니다. 이 /turtle1이 바로 namespace, 즉 네임스페이스입니다.

 

3. ROS2 service type 확인

 

서비스 이름만 알아서는 서비스를 호출할 수 없습니다. 해당 서비스가 어떤 데이터 구조를 사용하는지 알아야 합니다.

 

아래의 명령들을 사용하면 서비스의 타입을 확인할 수 있습니다.

 

ros2 service type /clear

ros2 service type /kill

ros2 service type /spawn

ros2 service type /turtle1/teleport_absolute

 

 

 

 

서비스 목록 확인 (ros2 service list) 명령어에 옵션으로 `-t`를 붙여주면 형태를 서비스 목록과 함께 볼 수 있습니다.

 

ros2 service list -t

 

 

 

마지막 서비스 타입을 예로 들어 설명하면 의미는 다음과 같습니다.

패키지 이름: turtlesim
서비스 폴더: srv
서비스 정의 파일: TeleportAbsolute
 

 

즉, /turtle1/teleport_absolute 서비스는 turtlesim 패키지 안의 srv 폴더에 있는 TeleportAbsolute.srv 정의를 사용합니다.

 

 

 

 

 

4. Service Definition 확인하기

 

서비스 타입을 확인했다면, 이제 실제로 어떤 값을 요청해야 하는지 봐야 합니다.

interface show 명령을 사용하여 서비스 데이터 구조를 확인할 수 있습니다.  아래의 명령을  입력하여 TeleportAbsolute 서비스의 구조를 확인합니다.

 

ros2 interface show turtlesim/srv/TeleportAbsolute

 

 

TeleportAbsolute 서비스의 데이터 구조는 위의 그림과 같습니다. 

여기서 --- 위쪽은 Request 영역입니다.
아래쪽은 Response 영역입니다.

TeleportAbsolute 서비스는 응답으로 특별한 데이터를 돌려주지 않기 때문에 --- 아래가 비어 있습니다.

즉, 이 서비스는 다음 세 값을 입력받습니다.

x      : 이동할 x 좌표
y      : 이동할 y 좌표
theta  : 거북이의 방향
 

 

 

5. ROS2 Service find

 

서비스의 특정 형태를 입력하면 해당 형태의 서비스를 사용하는 서비스명을 알려주는 명령어가 있습니다. 
사용법은 아래와 같이 `ros2 service find` 명령어에 인자로 특정 서비스 형태를 기술하면 됩니다.

 

ros2 service find std_srvs/srv/Empty

ros2 service find turtlesim/srv/SetPen

 

 

 

 

6. Service Call 기본 형식

 

ROS 2에서 서비스를 호출하는 기본 형식은 다음과 같습니다.

 
ros2 service call <service_name> <service_type> "<data>"
 

 

예를 들어 거북이를 x=2, y=2 위치로 이동시키고, 방향을 3.14 라디안으로 설정하려면 다음과 같이 입력합니다.

 
ros2 service call /turtle1/teleport_absolute turtlesim/srv/TeleportAbsolute "{x: 7, y: 7, theta: 3.14}"
 

 

실행하면 거북이가 지정한 좌표로 즉시 이동합니다.

이 서비스는 반환 데이터가 없으므로 응답 부분에는 빈 응답 구조만 나타납니다.

 

 

 

다른 서비스 call을 사용해 보겠습니다.

 

그려진 이동 궤적을 모두 지우는 /clear 서비스를 호출해 보겠습니다.

 

 ros2 service call /clear std_srvs/srv/Empty

 

이 서비스는 std_srvs/srv/Empty 타입으로, 별도의 인자를 필요로 하지 않는 구조입니다. 따라서 <arguments> 부분 없이도 호출이 가능합니다.

서비스를 실행하면 기존에 남아있던 거북이의 이동 경로가 모두 사라지는 것을 확인하실 수 있습니다.

 

 

 

다음은 특정 거북이를 제거하는 /kill 서비스입니다. 제거하고자 하는 거북이의 이름을 요청 데이터로 전달해야 합니다.

 

ros2 service call /kill turtlesim/srv/Kill "name: 'turtle1'"

 

 

위 명령어를 실행하면 turtle1이 화면에서 사라지는 것을 확인하실 수 있습니다. 이처럼 /kill 서비스는 지정한 개체를 선택적으로 제거할 때 사용됩니다.

 

 

 

이번에는 시뮬레이션을 초기 상태로 되돌리는 /reset 서비스를 실행해 보겠습니다.

 

 ros2 service call /reset std_srvs/srv/Empty

 

이 서비스를 호출하면 다음과 같은 변화가 발생합니다.

  • 제거되었던 거북이가 다시 생성됨
  • 이동 경로(궤적) 초기화
  • 거북이가 시작 위치(원점)로 복귀

전체 환경을 초기 상태로 되돌리고 싶을 때 유용하게 사용할 수 있습니다. 출력되는 거북이의 모양이 자동으로 변경됩니다.

 

 

 

거북이가 그리는 궤적의 색상과 두께를 변경하는 서비스입니다.

 

ros2 service call /turtle1/set_pen turtlesim/srv/SetPen "{r: 255, g: 255, b: 255, width: 10}"

 

각 파라미터의 의미는 다음과 같습니다.

  • r, g, b : 색상 값 (0~255)
  • width : 선의 두께
  • off : 펜 사용 여부 (0: 사용, 1: 비활성화)

값을 다양하게 변경해 보시면 궤적 스타일이 실시간으로 바뀌는 것을 확인하실 수 있습니다.

 

 

 

마지막으로 새로운 거북이를 생성하는 /spawn 서비스입니다. 위치와 방향, 이름을 지정하여 새로운 개체를 추가할 수 있습니다.

  • 이름을 지정하지 않으면 turtle2, turtle3 형태로 자동 생성됩니다.
  • 동일한 이름은 사용할 수 없습니다.

예를 들어 기존 turtle1을 제거한 후 여러 개의 거북이를 생성하면, 하나의 화면에서 여러 개체를 동시에 제어할 수 있습니다.

 

ros2 service call /kill turtlesim/srv/Kill "name: 'turtle1'"

 

이후 /spawn을 활용하여 여러 거북이를 생성하면 다중 객체 제어 환경을 구성할 수 있습니다.

아래 예제에서는 기본으로 지정된 turtle1을 /kill 서비스를 이용해 없애고 닌자거북이 4 총사인 leonardo, raffaello, michelangelo, donatello를 생성한 모습이다. 이를 수행하면 아래의 그림과 같이 4마리의 거북이를 볼 수 있다. 거북이의 모습은 랜덤 출력이므로 동일한 거북이가 출력될 수도 있습니다.

 

ros2 service call /kill turtlesim/srv/Kill "name: 'turtle1'"

ros2 service call /spawn turtlesim/srv/Spawn "{x: 5.5, y: 9, theta: 1.57, name: 'leonardo'}"

ros2 service call /spawn turtlesim/srv/Spawn "{x: 5.5, y: 7, theta: 1.57, name: 'raffaello'}"

ros2 service call /spawn turtlesim/srv/Spawn "{x: 5.5, y: 5, theta: 1.57, name: 'michelangelo'}"

ros2 service call /spawn turtlesim/srv/Spawn "{x: 5.5, y: 3, theta: 1.57, name: 'donatello'}"

 

 

 

아래의 그림은 토픽 리스트를 확인한 결과입니다. name으로 정한 이름이 turtle1 대신 사용됩니다.

 

 

아래의 그림은 서비스 리스트를 확인한 결과입니다.

 

728x90
728x90

'강좌 > ROS2' 카테고리의 다른 글

ROS2 Action  (0) 2026.05.05
ROS2 Topic  (0) 2026.05.04
ROS2 Humble에서 Turtlesim 설치 및 실행하기  (0) 2026.05.03
ROS2 Run Commands 설정  (0) 2026.05.03
ROS2 Humble 개발 환경 설정  (0) 2026.05.03