-
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는 하나의 Server에서 여러 개의 Client를 가질 수 있지만, Service의 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 명령어를 사용하면, 다음의 목록을 볼 수 있다.
여기서 parameters가 붙어있는 서비스는 파라미터와 관련되어 있고 모든 노드의 기본 기능으로 포함이 되어 있다.
이는 추후 파라미터를 다룰 때 자세히 알아보도록 하자.
2.2 service type
Service는 Service의 요청 및 응답 데이터가 어떤 형태를 가졌는지 보여주는 명령어가 있다.
Service는 Topic과 유사하지만, request와 response 두 유형을 가진다.
ros2 service type <service_name>
위의 ros2 service list에서 살펴본 몇 가지 service에 대해 type을 살펴보면, 다음과 같다.
Topic과 마찬가지로 명령어의 뒤에 '-t'를 붙여서 type을 확인 할 수도 있다.
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들을 찾아보자.
/clear, /reset Node가 std_srvs/srv/Empty의 type을 사용하는 것을 볼 수 있다.
2.5 interface show
우리가 Terminal에서 service call을 할 수 있지만, 우선 입력 값의 구조(인터페이스, interface)를 알아야 한다.
ros2 interface show <type_name>
/clear에 대한 interface를 확인해보면, 다음과 같다.
---을 기준으로 위는 요청(Request), 아래는 응답(Response)이지만, 비어있는 타입은 데이터를 송수신 하지 않는다.
이번에는 /spawn node에 대해 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 하겠다는 의미이다.
결과:
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 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 _ROS2_Robot Operating System2 (0) 2024.05.24