ROS 2

ROS 2 Tutorials : Understanding services

정지홍 2025. 1. 3. 11:39

출처: ros2 documentation: jazzy의 tutorials/beginner/understanding services
출처: ros2 documentation: jazzy의 tutorials/beginner/understanding services

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

parameter가 붙은 6개의 같은 서비스들을 확인할 수 있다.

  • 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가 없음)
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>

ros2 service find std_srvs/srv/Empty

  • 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좌표 , 거북이의 초기 방향 , 새로운 거북이의 이름이다.
      • 응답부분은 생성된 거북의 이름을 반환한다.
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: ''}"

위와 같이 입력하면, 다음과 같이 출력된다.
이와 같이 서비스를 호출하면, cmd에서 거북을 추가시킬수있다.

  • 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를 식별,조회,호출하는 방법을 다루었다.