09-17 16:42
Notice
Recent Posts
Recent Comments
반응형
관리 메뉴

BAN2ARU

[ROS2/FOXY] 튜토리얼 5. Understanding services 본문

Study/ROS

[ROS2/FOXY] 튜토리얼 5. Understanding services

밴나루 2024. 1. 23. 22:37

ROS-foxy 튜토리얼은 공식 홈페이지를 참조함

 

이전 튜토리얼 글 모음

목표 : ROS2의 services에 대해 알아보자

Background

service는 ROS 그래프의 node 간의 또 다른 통신 방법이다. service는 publisher-subscriber 모델과 달리 call-and-response 모델을 기반으로 한다. topic은 node가 데이터 스트림에 subscribe하고 업데이트를 받을 수 있는 반면, service는 client에 의해 명시적으로 호출될 때만 데이터를 제공한다.

Prerequisites

이 튜토리얼에서 언급된 Nodes 및 Topic은 이전 튜토리얼에서 다루었으니 해당 내용을 참조하기 바란다.

또한 turtlesim package를 기반으로 튜토리얼을 진행할 것이다.

Tasks

1. 설정

turtlesim 노드 중 /turtlesim/teleop_turtle을 실행한다.

우선 터미널을 열고 아래 명령어를 실행한다.

ros2 run turtlesim turtlesim_node

다른 터미널을 열고 다음 명령어를 실행한다.

ros2 run turtlesim turtle_teleop_key

2. ros2 service list 명령어

새로운 터미널에서 ros2 service list 명령어를 실행하면 시스템에셔 현재 활성화된 모든 서비스 목록이 반환된다.

ros2 service list

node마다 parameters와 관련된 여섯 개의 service가 있는 것을 볼 수 있다. 거의 모든 ROS2 node에는 이러한 기반의 service가 존재하며, 다음 튜토리얼에서 이에 대해 더 자세히 다룰 예정이다.

3. ros2 service type 명령어

service type은 topic type과 유사하게 정의되지만 request와 response을 위한 두 부분으로 구성된다.

service type을 알아내려면 아래 명령어를 실행하자

ros2 service type <service_name>

예를 들어, turtlesim의 /clear service의 type을 알고 싶다면 아래와 같이 작성하면 된다.

ros2 service type /clear

Empty type은 service 호출이 request를 만들 때 데이터를 보내지 않으며 response 시에도 데이터를 수신하지 않음을 의미한다.

3.1. ros2 service list -t 명령어

모든 활성화 service의 유형을 동시에 보려면 command에 --show-types 또는 -t 옵션을 활용하면 된다.

ros2 service list -t

4. ros2 service find 명령어

특정 type의 모든 service를 찾고 싶다면 ros2 service find 명령어를 활용하자.

ros2 service find <type_name>

예를 들어, 아래와 같이 모든 Empty type의 service를 찾을 수 있다.

ros2 service find std_srvs/srv/Empty

5. ros2 interface show 명령어

command에서 service를 호출할 수 있지만 먼저 입력 argument의 구조를 알아야한다.

ros2 interface show <type_name>.srv

/clear service의 Empty type에 적용해보자.

ros2 interface show std_srvs/srv/Empty.srv

---는 request 구조와 response 구조를 분리한다. Empty type은 데이터를 보내거나 받지 않기 때문에 구조가 비어있다.

이번에는 데이터를 보내고 받는 유형의 service를 확인해보자. ros2 service list -t의 결과에서 /spawn type은 turtlesim/srv/Spawn임을 알 수 있다.

/spawn service의 request 및 response 인수를 확인하려면 다음 명령어를 실행하면 된다.

ros2 interface show turtlesim/srv/Spawn

---라인 위의 정보는 /spawn을 호출하기 위해 필요한 인수이다. x, y, theta는 생성된 거북이의 2D 포즈를 결정하고, name은 optional한 것이다.

---라인 아래의 정보는 호출로부터 받은 응답의 데이터 유형을 이해하는데 도움이 된다.

6. ros2 service call 명령어

ros2 service call을 통해 service를 호출할 수 있음

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

<arguments> 부분은 선택사항으로 Empty type의 service에는 인수가 없다.

ros2 service call /clear std_srvs/srv/Empty

해당 명령어는 거북이가 그린 선들을 지우는데 사용한다.

이번에는 /spawn을 호출하여 새 거북이를 생성하고 인수를 설정해보자. command에서 service 호출에 사용되는 입력 <arguments>는 YAML 구문을 따라야한다.

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

command에 해당 명령어를 실행하면 service를 실행한 상황에 대한 응답을 나타낸다.

TurtleSim 창에 새 거북이가 나타난다.

Summary

ROS2에서 node는 service를 사용하여 통신할 수 있다. topic은 node가 정보를 publish하고 하나 이상의 subscriber가 이를 소비하는 일방향 통신 패턴이라면 service는 client가 service를 제공하는 node에 request를 보내고 service가 request를 처리하고 response를 생성하는 request/response 패턴이다.

일반적으로 지속적인 호출에는 service를 권장하지 않는다. 이런 경우에는 topic이나 심지어 action을 사용하는 것이 더 적절하다.

728x90
Comments