ROS2 Tutorial (Basic)
  • 교육 안내
  • ROS2 개요
  • ROS2 환경 구성
  • turtlesim, ROS2 rqt
  • 노드(Node) 이해하기
  • 토픽(Topic) 이해하기
  • 서비스(Service) 이해하기
  • 파라메터(Parameter) 이해하기
  • 액션(Action) 이해하기
  • rqt_console 을 이용해 로그 보기
  • 노드 실행하기(launch)
  • 데이터 기록 및 재생
  • ROS2 프로그래밍 시작
  • 작업공간 만들기
  • 패키지 만들기
  • 간단한 게시자와 구독자 노드 만들기
  • 간단한 서비스 및 클라이언트 작성
  • 사용자 정의 msg 및 srv 파일 생성
  • 사용자 정의 인터페이스 구현
  • 파라메터 사용하기
  • 문제 식별에 ros2doctor 사용하기
Powered by GitBook
On this page
  • 개요
  • 실습
  • 1. 설정
  • 2. ros2 service list
  • 3. ros2 service type
  • 4. ros2 service find
  • 5. ros2 interface show
  • 6. ros2 service call

Was this helpful?

Export as PDF

서비스(Service) 이해하기

저작권: 쿼드(QUAD) 드론연구소 https://www.youtube.com/@quad-robotics

Previous토픽(Topic) 이해하기Next파라메터(Parameter) 이해하기

Last updated 1 year ago

Was this helpful?

개요

서비스는 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 창이 새로 생성된 거북이로 바로 업데이트됩니다.