ROS 2
ROS 2 Tutorials : Understanding services
정지홍
2025. 1. 3. 11:39


background
- services는 ROS graph에서 node들의 또다른 communicatoin 방법중 하나이다.
services는 'topic의 publisher-subscriber 방식'과 다르게 'call-and-response' 모델이다.- topics들은 node들에게 data streams를 subscribe하게 함으로써, continual한 updates를 허락했었다.
- services에서 client가 call할때에만 data를 provide해준다.
Prequisites
- 해당 튜토리얼에서는 앞의 튜토리얼에서 언급한 nodes,topics와 같은 개념이 나온다. 그러니 해당 내용을 숙지하고 있어야 한다.
- turtlesim package가 실습을 위해서 필요하다.
Task
- 1. 우선 늘 그랬듯 turtlesim과 거북을 움직이기 위한 turle_teleop_key를 실행한다.
- 2. 아래의 명령어를 입력하면, 현재의 시스템에서 active된 서비스들을 볼수있다.
- 명령어를 입력하면 parameter가 붙은 6개의 같은 서비스를 볼수있다.
- ROS2의 거의 모든 node들은 이러한 파라미터가 build되는 infrastructure한 services를 가지고 있다.
- 다음 튜토리얼에서 이러한 파라미터들에 대해서 자세히 다룰것이다.
- 즉, 이번 튜토리얼에서는 parameter service에 대한 논의는 생략할 것 이다.
- 지금은 turtlesim의 서비스에 대해서 집중할 것이다.
- /clear , /kill , /reset , /spwan , /turtle1/set_pen , /turtle1/teleport_absolute, /turtle1/teleport_relative들...
- 이번에는 몇몇의 services를 사용하며 앞의 튜토리얼에서 사용한 것을 기억해내며 interacting할 것이다.
ros2 service list

- 3. ros2 service의 type들에 대해서...
- services는 type을 가지고 있으며, 이는 service를 구조화해서, 어떻게 request하고 data를 response할지 묘사하고 있다.
- services의 type은 topics와 유사하다. 하지만 2개의 부분이 다른데 이는 하나는 message의 request를 위한 service이며, 다른 하나는 response를 위한 것이다. ( topic은 이 2개가 하나다.)
- 명령어 형식은 아래와 같다
ros2 service type <service_name>
- 4. 한번 /clear 타입에 대해서 조회해보자.
- std_srvs/srv/Empty라고 출력 될것이다.
- 여기서 Empty는 response를 receiving할때 service call이 보낼 data가 없음을 의미한다.( request나 receive한 data가 없음)
- std_srvs/srv/Empty라고 출력 될것이다.
ros2 service type /clear
- 5. 이번에는 리스트 조회시 t옵션을 주자.
- -t옵션은 --show-types를 의미한다.
ros2 service list -t

- 6. service의 info에 대한 조회
- 아래의 형식으로 입력을 한다.
- 이 명령어를 통해서, service의 type과 service의 client,server의 수를 알 수 있다.
- 아래의 형식으로 입력을 한다.
ros2 service info <service_name>
ros2 service info /clear

- 7. 특정한 type에 대한 모든 service를 찾고 싶을때, 아래의 명령어를 입력하면 된다.
- 아래는 Empty 타입에 대한 service를 찾는 것이다.
ros2 service find <type_name>

- 8. interface show
- 아래와 같은 구조로 입력을 한다.
ros2 interface show <type_name>
- 9. 한번 아래의 명령어를 입력해보자.
- 그러면 ---만 출력될것이다.
- 위처럼 출력되는것은 Empty서비스가 request와 response에 모두 data가 없는 서비스임을 말함.
- 즉, 위의 서비스는 request,response가 없는 단순한 서비스이며, 서비스 호출 자체만으로 동작을 수행함.
- 그래서 request,response에 정의된 filed가 없으니 단순히 ---만 출력하는것임.
- 그러면 ---만 출력될것이다.
ros2 interface show std_srvs/srv/Empty
- 10. 아래 명령어를 입력하자
- 그러면 ---을 기준으로 위에는 request이며, 아래는 response이다.
- 각각 거북을 생성할 x좌표 , y좌표 , 거북이의 초기 방향 , 새로운 거북이의 이름이다.
- 응답부분은 생성된 거북의 이름을 반환한다.
- 그러면 ---을 기준으로 위에는 request이며, 아래는 response이다.
ros2 interface show turtlesim/srv/Spawn

- 11. 특정한 서비스를 호출하는 형식은 아래와 같다.
- arguements는 request 데이터이다. 즉, 서비스 호출시 함께 전송할 데이터를 의미한다.
ros2 service call <service_name> <service_type> <arguments>
ros2 service call /clear std_srvs/srv/Empty
ros2 service call /spawn turtlesim/srv/Spawn "{x: 2, y: 2, theta: 0.2, name: ''}"



- 12. 서비스 호출의 결과를 확인하려면, 아래의 형식의 명령어를 사용한다.
- 이는 특정한 서비스에서 이루어지는 데이터 통신을 출력한다.
해당 기능을 하용하기 위해서 service의 client , server에게 인트로스펙션을 활성화 해야함.
- 이는 특정한 서비스에서 이루어지는 데이터 통신을 출력한다.
ros2 service echo <service_name | service_type> <arguments>
Summary
- ros2에서 node는 service를 사용해서 통신할 수 있다.
- topic과는 다르게 request/response 패턴이며, client가 service 제공 node에게 request를 보내면, service는 이를 처리하고 response를 생성한다.
- 이는 지속적인 호출에는 service를 사용하는 것은 적합하지 않다. 이러한 경우에는 topic or action을 사용해야한다.
- 이번 튜토리얼에서는 명령어를 이용하여 service를 식별,조회,호출하는 방법을 다루었다.