ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • ROS2 Service 기초 사용법
    ROS/ROS2 2025. 1. 13. 19:07
    ROS2 version: jazzy

    1. Service

    Service는 Topic과 달리 Server와 Client로 구성이 되어 있다.

    Client가 Server로 데이터를 Request(요청)를 하면, Server가 Client로 Response(응답)를 하게 된다.

    Service의 통신

    즉, 데이터를 요청해야 데이터를 응답받을 수 있다.

    Service는 하나의 Server에서 여러 개의 Client를 가질 수 있지만, Service의 Server는 오직 하나이다.

    여러 개의 Client와 하나의 Server

    2. Service 실습

    이번에도 turtlesim으로 Service에 대해 살펴보자.

    Terminal 1

    ros2 run turtlesim turtlesim_node

    Terminal 2

    ros2 run turtlesim turtle_teleop_key

     

    2.1 service list

    ros2 service list

    ros2 service list 명령어를 사용하면, 다음의 목록을 볼 수 있다.

    service의 list

    여기서 parameters가 붙어있는 서비스는 파라미터와 관련되어 있고 모든 노드의 기본 기능으로 포함이 되어 있다.

    이는 추후 파라미터를 다룰 때 자세히 알아보도록 하자.

     

    2.2 service type

    Service는 Service의 요청 및 응답 데이터가 어떤 형태를 가졌는지 보여주는 명령어가 있다.

    Service는 Topic과 유사하지만, request와 response 두 유형을 가진다.

    ros2 service type <service_name>

     

    위의 ros2 service list에서 살펴본 몇 가지 service에 대해 type을 살펴보면, 다음과 같다.

    ros2 service type

    Topic과 마찬가지로 명령어의 뒤에 '-t'를 붙여서 type을 확인 할 수도 있다.

    ros2 service list -t

     

    2.3 service info

    ros2 service info <service_name>

    위의 명령어를 사용하여 특정 service의 info를 볼 수 있다.

     

    2.4 service find

    우리가 'ros2 service type'명령어로 service의 형태를 볼 수 있었지만, 특정 형태를 입력하면 해당 형태의 서비스를 사용하는 서비스 명을 확인하는 명령어도 존재한다.

    ros2 service find <type_name>

     

    우리가 찾은 /clear service의 type_name인 '/std_srvs/srv/Empty'를 사용하는 Service node들을 찾아보자.

    std_srvs/srv/Empty type을 사용중인 /clear, /reset service_node

    /clear, /reset Node가 std_srvs/srv/Empty의 type을 사용하는 것을 볼 수 있다.

     

    2.5 interface show

    우리가 Terminal에서 service call을 할 수 있지만, 우선 입력 값의 구조(인터페이스, interface)를 알아야 한다.

    ros2 interface show <type_name>

     

    /clear에 대한 interface를 확인해보면, 다음과 같다.

    /clear의 interface

    ---을 기준으로 위는 요청(Request), 아래는 응답(Response)이지만, 비어있는 타입은 데이터를 송수신 하지 않는다.

     

    이번에는 /spawn node에 대해 interface를 확인해보자.

    ros2에서 interface를 찾는 과정.

    ---을 기준으로 요청(Request), 응답(Response) interface를 확인할 수 있다.

     

    2.6 service call (중요)

    Service call은 실제 서비스 서버에게 서비스를 요청(Request)하는 것이다.

    서비스 요청은 다음과 같이 'ros2 service call' 명령어를 이용하여 <service_name>, <service_type>, <arguments>를 기술한다.

    우리가 위에서 interface 정보를 확인했으니 이를 service call에서 활용할 수 있다.

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

     

    2.6.1 /clear

    우선 Turtlebot sim에서 이동 궤적을 지우는 service를 요청해보자.

    현재 다음과 같이 sim에 궤적이 그려져 있는데,

    ros2 service call /clear std_srvs/srv/Empty

     

    위의 메시지를 요청하면 다음과 같이 된다.

    결과:

    지워진 궤적

     

    2.6.2 /spawn

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

    이번에는 spawn을 해보자.

    위의 명령어는  /spawn에 turtlesim/srv/Spawn type의 msg를 service call 하겠다는 의미이다.

     

    결과:

    x, y, theta의 부분에 생성된 turtle

     

    2.6.3 /kill

    ros2 service call /kill turtlesim/srv/Kill "name: 'turtle2'"

    이번에는 kill 명령어를 사용하여 생성한 turtle을 지워보자.

    결과:

     

    2.6.4 /reset

    ros2 service call /reset std_srvs/srv/Empty

    이번에는 reset 명령어를 사용하여 초기 단계로 돌아가보자.

     

    이처럼 service는 call하는 형식으로 다양하게 사용할 수 있다.

     

    2.7 service echo

    ros2 service echo <service_name | service_type> <arguments>

    service echo를 사용하여 service간의 데이터 송수신을 볼 수 있다.

    이번에는 다음의 예시를 사용해서 보자.

     

    Terminal 1

    ros2 launch demo_nodes_cpp introspect_services_launch.py

    주어진 데모 실행

     

    Terminal 2

    ros2 param set /introspection_service service_configure_introspection contents
    ros2 param set /introspection_client client_configure_introspection contents

    Client 및 Service 활성화

     

    Terminal 3

    ros2 service echo --flow-style /add_two_ints

    ros2 service echo

     

    결과:

     

    'ROS > ROS2' 카테고리의 다른 글

    ROS2 Action 기초 사용법  (0) 2025.02.04
    ROS2 Topic 기초 사용법  (0) 2025.01.08
    ROS2 Node 기초 사용법  (0) 2025.01.07
    ROS2 유용한 명령어  (0) 2025.01.07
    ROS2 DDS (Data Distribution Service)  (0) 2025.01.06
Designed by Tistory.