티스토리 친구하기

본문 바로가기

Robotics/ROS2

ROS2 service [Understanding services]

728x90

 

Goal: command line tools를 이용한 ROS2 services에 대해 배운다.

Tutorial level: Beginner

Time: 10 minutes

 

Background

Services는 ROS graph 내에서 node 간에 communication 하는 방법이다. Services는 topic의 publisher - subscriber 모델과는 달리 call-and-reponse 모델을 기반으로 한다. Topic이 data stream을 subscribe 하고 지속적인 업데이트를 받을 수 있도록 한 반면, Services는 오직 client에 의해 명시적으로 call(요청) 할 때에만 data를 제공한다.

 

Prerequisites

- 이 tutorial에서 언급된 Nodes와 Topics와 같은 몇 가지 개념들은 시리즈의 이전 tutorial에서 다루어졌다.
- turtlebot simulation 패키지(turtlesim)가 필요하다.
- 언제나 새로 열리는 터미널에서 ROS 2를 source로 설정하는 것을 잊지 마세요.

 

Tasks

1 Setup

2개의 turtlesim node를 실행하세요. '/turtlesim', '/teleop_turtle'

 

새로운 터미널을 열고 아래의 명령어를 실행하세요.

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

 

두 노드 모두 이름에 parameter를 가진 동일한 6 가지 Service를 가지고 있는 것을 볼 수 있습니다. ROS 2의 거의 모든 노드에는 이러한 인프라 서비스(infrastructure services)가 있으며, parameter는 이를 기반으로 구축됩니다. 다음 tutorial에서는  parameter에 대한 더 자세한 내용이 나올 것입니다. 이 tutorial에서는 parameter service에 대한 논의를 생략하겠습니다.

지금은 turtlesim-specific service에 집중해 봅시다.

/clear, /kill, /reset, /spawn, /turtle1/set_pen, /turtle1/teleport_absolute, 그리고 /turtle1/teleport_relative입니다.

아마도 turtlesim, ros2, and rqt 튜토리얼에서, rqt를 사용하여 이러한 services과의 interacting 했던 것을 기억할 겁니다.

3 ros2 service type

Service에는 서비스의 요청(request)과 응답(response) 데이터가 어떻게 구성되는지를 설명하는 유형(type)이 있습니다. Service type은 topic type과 유사하게 정의되지만, Service type은 request와 response 이렇게 두 부분으로 구성됩니다. 

서비스의 유형을 알아보려면 다음 명령을 사용합니다:

 

ros2 service type <service_name>


turtlesim simulation에서 '/clear' 서비스를 살펴보겠습니다. 새로운 터미널에서 아래의 명령을 입력하세요.

 

ros2 service type /clear


위의 명령은 아래와 같은 결과를 반환해야 합니다.

 

std_srvs/srv/Empty

 

'Empty' type은 making a service(서비스를 요청할 때) 데이터를 전송하지 않고, receiving a response(응답을 받을 때) 데이터를 전송받지 않는 type입니다.

3.1 ros2 service list -t

active 된 모든 서비스들을 동시에 확인하려면, ' --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]
...


이 명령은 활성화된(active) service의 list와 해당 service의 type을 함께 표시합니다.

4 ros2 service find

만약 특별한 type을 가진 모든 service를 찾고 싶다면, 아래와 같은 명령어를 입력하세요.

 

ros2 service find <type_name>

 

예를 들어, 'Empty' type을 가진 모든 service들을 아래의 명령으로 찾을 수 있습니다.

 

ros2 service find std_srvs/srv/Empty

 

위의 명령어는 아래와 같은 결과를 return 할 겁니다.

 

/clear
/reset

5 ros2 interface show

command line에서도 service call(서비스 요청)을 할 수 있습니다. 그러려면 먼저 input arguments의 구조부터 알아야 합니다.

 

ros2 interface show <type_name>

 

'clear' 서비스의 type 'Empty'로 시도해 보세요.

 

ros2 interface show std_srvs/srv/Empty

 

위의 명령어는 아래와 같은 결과를 return 할 것입니다.

 

---

 

'---'는 request 구조(---의 위쪽)와 response 구조(---의 아래쪽)를 구분합니다. 그러나 앞서 배운 것처럼 'Empty' type은 데이터를 보내거나 받지 않습니다. 그래서 당연히 해당 구조는 비어있습니다.

'/spawn'과 같이 데이터를 보내고 받는 type을 가진 서비스를 검사해 보겠습니다. ros2 service list -t 결과에서 우리는 '/spawn'의 type이 turtlesim/srv/Spawn임을 알고 있습니다.

'/spawn' 서비스의 요청 및 응답 arguments(인수)를 보려면 다음 명령을 실행합니다:

 

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는 생성된 거북이(spawned turtle)의 2D 포즈를 결정하고, name은 선택 사항임을 명확히 나타냅니다.

--- 아래의 정보는 이 경우에는 필요한 정보가 아니지만, 호출에서 얻는 응답의 데이터  type을 이해하는 데 도움이 될 수 있습니다.

 

6 ros2 service call

이제 우리는 service type이 무엇인지, 어떻게 service type은 어떻게 찾는지, 그리고 해당 argument의 구조를 어떻게 찾는지 알게 되었기 때문에, 아래와 같이 service call(서비스 요청)을 할 수 있습니다.

 

ros2 service call <service_name> <service_type> <arguments>


<arguments> 부분은 옵션입니다. 예를 들어, Empty 유형의 서비스는 어떤 인수도 갖지 않음을 알고 있습니다:

ros2 service call /clear std_srvs/srv/Empty

 

위의 command는 turtle이 그렸던 line을 turtlesim window에서 지우는 명령어입니다.

이 명령은 거북이가 그린 선을 모두 지우는 역할을 합니다.

 

 

이제 /spawn을 호출하고 인수를 설정하여 새 거북이를 생성해 봅시다. 명령 행에서 서비스 호출에 <arguments>를 입력할 때 YAML 구문을 사용해야 합니다.

다음 명령을 입력하세요:

ros2 service call /spawn turtlesim/srv/Spawn "{x: 2, y: 2, theta: 0.2, name: ''}"

 

위의 명령을 실행하면 무슨 일이 일어나고 있는지를 보여주는 method-style view와 서비스 응답이 표시됩니다:

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 window는 즉시 새로 생성된 거북이로 업데이트됩니다.

 

Summary

ROS 2에서 노드들은 서비스를 사용하여 통신할 수 있습니다. Topic은 한 노드가 정보를 publish 하고 하나 이상의 subsriber가 그 정보를 사용하는 단방향 통신 패턴입니다. 반면 Service는 Client가 서비스를 제공하는 노드에 요청(request)을 보내고, 서비스가 요청을 처리하고 응답(response)을 생성하는 요청/응답 패턴입니다.

일반적으로 서비스를 연속적으로 호출하는 것은 바람직하지 않으며, Topic이나 때로는 Action이 더 적합할 수 있습니다.

이 튜토리얼에서는 command line tools를 사용하여 서비스를 식별하고 검사하고 호출하는 방법을 사용했습니다.

 

반응형