서비스(Service) 이해하기
저작권: 쿼드(QUAD) 드론연구소 https://www.youtube.com/@quad-robotics
개요
서비스는 ROS 그래프의 노드에 대한 또 다른 통신 방법입니다. 서비스는 호출 및 응답 모델 대 게시자-구독자 주제 모델을 기반으로 합니다. 토픽은 노드가 데이터 스트림을 구독하고 지속적인 업데이트를 받을 수 있도록 허용하지만 서비스는 클라이언트가 구체적으로 호출할 때만 데이터를 제공합니다.
실습
1. 설정
두개의 터미널에 각각 /turtlesim 과
/teleop_turtle
두 개의 turtlesim 노드를 시작 합니다.
ros2 run turtlesim turtlesim_node
ros2 run turtlesim turtle_teleop_key
2. ros2 service list
새 터미널에서 ros2 service list 명령을 실행하면 시스템에서 현재 활성화된 모든 서비스 목록이 반환됩니다.
/clear
/kill
/reset
/spawn
/teleop_turtle/describe_parameters
/teleop_turtle/get_parameter_types
/teleop_turtle/get_parameters
/teleop_turtle/list_parameters
/teleop_turtle/set_parameters
/teleop_turtle/set_parameters_atomically
/turtle1/set_pen
/turtle1/teleport_absolute
/turtle1/teleport_relative
/turtlesim/describe_parameters
/turtlesim/get_parameter_types
/turtlesim/get_parameters
/turtlesim/list_parameters
/turtlesim/set_parameters
/turtlesim/set_parameters_atomically
두 노드 모두 이름에 동일한 6개의 서비스(parameters)가 있음을 알 수 있습니다 . ROS2의 거의 모든 노드에는 매개변수가 구축되는 이러한 인프라 서비스가 있습니다. 다음 자습서에서 매개 변수에 대해 자세히 설명합니다. 이 자습서에서는 매개 변수 services가 논의에서 생략됩니다.
3. ros2 service type
서비스에는 서비스의 요청 및 응답 데이터가 구성되는 방식을 설명하는 유형이 있습니다. 서비스 유형은 토픽 유형과 유사하게 정의되지만 서비스 유형은 요청에 대한 메시지와 응답에 대한 메시지의 두 부분으로 구성됩니다.
서비스 유형을 찾으려면 다음 명령을 사용하십시오.
ros2 service type <service_name>
터틀심의 /clear
서비스를 살펴보겠습니다. 새 터미널에서 다음 명령을 입력합니다.
ros2 service type /clear
다음을 반환해야 합니다.
std_srvs/srv/Empty
유형 Empty
은 서비스 호출이 요청을 할 때 데이터를 보내지 않고 응답을 받을 때 데이터를 받지 않음을 의미합니다.
3.1 ros2 service list -t
모든 활성 서비스의 유형을 동시에 보려면 다음 과 같이 명령 에 --show-types
약어로 표시되는 -t 옵션을 추가할 수 있습니다 .
ros2 service list -t
다음을 반환합니다.
/clear [std_srvs/srv/Empty]
/kill [turtlesim/srv/Kill]
/reset [std_srvs/srv/Empty]
/spawn [turtlesim/srv/Spawn]
...
/turtle1/set_pen [turtlesim/srv/SetPen]
/turtle1/teleport_absolute [turtlesim/srv/TeleportAbsolute]
/turtle1/teleport_relative [turtlesim/srv/TeleportRelative]
...
4. ros2 service find
특정 유형의 모든 서비스를 찾으려면 다음 명령을 사용할 수 있습니다.
ros2 service find <type_name>
예를 들어 다음과 같이 입력된 모든 Empty 서비스를 찾을 수 있습니다.
ros2 service find std_srvs/srv/Empty
다음을 반환합니다.
/clear
/reset
5. ros2 interface show
명령줄에서 서비스를 호출할 수 있지만 먼저 입력 인수의 구조를 알아야 합니다.
ros2 interface show <type_name>.srv
Empty 서비스 유형의 인터페이스를알아 보겠습니다.
ros2 interface show std_srvs/srv/Empty.srv
다음을 반환합니다.
---
요청 구조(위)와 응답 구조(아래)를 "---" 를리이용하여 분리합니다 . 그러나 앞에서 배운 것처럼 Empty
형식은 데이터를 보내거나 받지 않습니다. 따라서 당연히 그 구조는 비어 있습니다.
이번엔 Empty 서비스 유형의 인터페이스를알아 보겠습니다.
ros2 interface show turtlesim/srv/Spawn
다음을 반환합니다.
float32 x
float32 y
float32 theta
string name # Optional. A unique name will be created and returned if this is empty
---
string name
---
줄 위의 정보는 /spawn
서비스를 호출하는 데 필요한 인수(x
, y
그리고 theta)
를 알려줍니다 . 생성된 거북이의 2D 위치를 결정하고 name
은선택 사항입니다.
줄 아래에 있는 정보는 이 경우 알아야 할 정보는 아니지만 서비스에요청서 받은 응답의 데이터 유형을 이해하는 데 도움이 될 수 있습니다.
6. ros2 service call
이제 서비스 유형이 무엇인지, 서비스 유형을 찾는 방법 및 해당 유형의 인수 구조를 찾는 방법을 알았으므로 다음을 사용하여 서비스를 호출할 수 있습니다.
ros2 service call <service_name> <service_type> <arguments>
<arguments>
부분은 선택 사항입니다. 예를 들어 Empty 유형이 지정된 서비스에는 인수가 없다는 것을 알고 있습니다.
ros2 service call /clear std_srvs/srv/Empty
이 명령은 거북이가 그린 선의 turtlesim 창을 지웁니다.

이제 <arguments>
인수를 넣고/spawn 서비스를 호출
하여 새 거북이를 생성해 보겠습니다. 명령줄에서 서비스 호출의 입력은 YAML 구문이어야 합니다.
ros2 service call /spawn turtlesim/srv/Spawn "{x: 2, y: 2, theta: 0.2, name: ''}"
무슨 일이 일어나고 있는지에 대한 이 메서드 스타일 보기와 서비스 응답을 얻을 수 있습니다.
requester: making request: turtlesim.srv.Spawn_Request(x=2.0, y=2.0, theta=0.2, name='')
response:
turtlesim.srv.Spawn_Response(name='turtle2')
Turtlesim 창이 새로 생성된 거북이로 바로 업데이트됩니다.
Last updated
Was this helpful?