Note: This tutorial assumes that you have completed the previous tutorials: understanding ROS topics.
(!) Please ask about problems and questions regarding this tutorial on answers.ros.org. Don't forget to include in your question the link to this page, the versions of your OS & ROS, and also add appropriate tags.

ROS Service와 Parameter 이해하기

Description: 이 예제는 ROS service와 parameter를 소개할뿐만 아니라 rosservicerosparam 명령어 도구를 소개합니다.

Tutorial Level: BEGINNER

Next Tutorial: Using rqt_console and roslaunch

이전 예제에 이어서 'turtlesim_node'가 켜져있는 상태라고 가정합니다. 그럼 turtlesim이 어떤 service를 제공하는지 알아봅시다.

ROS Services

서비스는 다른 노드와 통신하는 또 다른 방법입니다. 서비스를 통해 다른노드에 요청을 보내고 응답을 받을 수 있습니다.

Using rosservice

rosservice can easily attach to ROS's client/service framework with services. rosservice has many commands that can be used on services, as shown below:

사용법:

rosservice list         print information about active services
rosservice call         call the service with the provided args
rosservice type         print service type
rosservice find         find services by service type
rosservice uri          print service ROSRPC uri

rosservice list

$ rosservice list

list 명령어는 turtlesim 노드가 제공하는 9가지 서비스를 보여줍니다. (reset, clear, spawn, kill, turtle1/set_pen, /turtle1/teleport_absolute, /turtle1/teleport_relative, turtlesim/get_loggers, turtlesim/set_logger_level). 그리고 rosout 노드와 관련된 2가지 서비스가 있습니다. (/rosout/get_loggers and /rosout/set_logger_level).

  • /clear
    /kill
    /reset
    /rosout/get_loggers
    /rosout/set_logger_level
    /spawn
    /teleop_turtle/get_loggers
    /teleop_turtle/set_logger_level
    /turtle1/set_pen
    /turtle1/teleport_absolute
    /turtle1/teleport_relative
    /turtlesim/get_loggers
    /turtlesim/set_logger_level

Let's look more closely at the clear service using rosservice type: 그럼 clear service를 rosservice type를 통해 좀 더 깊게 살펴봅시다.

rosservice type

Usage:

rosservice type [service]

clear service가 어떤 type인지 알아봅시다.

$ rosservice type /clear
  • std_srvs/Empty

이 service의 타입은 empty입니다. 이는 서비스가 호출 될 때 아무 전달인자가 없다는 것을 의미합니다. (요청을 할 때 아무 데이터를 주지 않고, 응답을 받을때 아무 데이터를 받지 않습니다). 그럼 이제 clear service를 rosservice call를 이용해 호출해 봅시다.

rosservice call

사용법:

rosservice call [service] [args]

여기서 이 service는 type이 empty이기 때문에 어떠한 전달인자 없이 호출합니다.

$ rosservice call /clear

우리가 예상한대로, 이 service는 turtlesim_node의 배경을 지웁니다.

  • turtlesim.png

service가 전달인자를 가지는 경우를 살펴보기위해 spwan service를 살펴 봅시다.

$ rosservice type /spawn | rossrv show
  • float32 x
    float32 y
    float32 theta
    string name
    ---
    string name

이 서비스는 새로운 거북이를 주어진 방향과 위치로 생성합니다. 거북이의 name field는 선택사항입니다. 새로운 거북이에게 이름을 주지 않으면, turtlesim node가 자동으로 이름을 생성합니다.

$ rosservice call /spawn 2 2 0.2 ""

이 spawn service 호출은 새로 생성된 거북이의 이름이 반환합니다.

  • name: turtle2

이제 turtlesim은 아래와 같이 보일 것입니다.

  • turtle(service).png

Using rosparam

rosparam은 ROS의 Parameter Server에 데이터를 저장하고 조작할 수 있게 해줍니다. ROS parameter 서버는 integer, float, boolean, ditionary, list 타입의 데이터를 저장할 수 있습니다. rosparam YAML 마크업언어를 문법으로 사용합니다. 간단한 경우에는 YAML는 가독성이 좋습니다. 1은 integer, 1.0은 float, one은 string, true는 boolean, [1, 2, 3]은 integer list, {a: b, c: d}는 dictionary. rosparam은 아래와 같이 parameter에 사용될 수 있는 많은 명령어를 가집니다.

Usage:

rosparam set            set parameter
rosparam get            get parameter
rosparam load           load parameters from file
rosparam dump           dump parameters to file
rosparam delete         delete parameter
rosparam list           list parameter names

그럼 이제 어떤 parameter들이 현재 parameter 서버에 올라가있는지 살펴 봅시다.

rosparam list

$ rosparam list

turtlesim 노드가 배경색에 대한 3가지 parameter가 parameter 서버에 올라가 있는것을 확인할 수 있습니다.

  • /background_b
    /background_g
    /background_r
    /rosdistro
    /roslaunch/uris/host_57aea0986fef__34309
    /rosversion
    /run_id

rosparam set을 이용해 parameter를 변경해 봅시다.

rosparam set and rosparam get

Usage:

rosparam set [param_name]
rosparam get [param_name]

배경색의 red channel을 한번 변경해 봅시다.

$ rosparam set /background_r 150

parameter 값이 변경되었습니다. 이제 parameter 값 변경을 적용하기 위해 clear service를 호출해야 합니다.

$ rosservice call /clear

이제 turtlesim은 이렇게 보일 것입니다.

  • turtle(param).png

이제 parameter 서버의 parameter 값을 확인해 봅시다. 배경색의 green channel 값을 확인해봅시다.

$ rosparam get /background_g
  • 86

또한, rosparam get / 명령을 통해 Parameter Server의 모든 내용을 확인할 수 있습니다.

$ rosparam get /
  • background_b: 255
    background_g: 86
    background_r: 150
    roslaunch:
      uris: {'aqy:51932': 'http://aqy:51932/'}
    run_id: e07ea71e-98df-11de-8875-001b21201aa8

또한 rosparam을 이용하여 이 파일을 저장하고 추후에 다시 불러올수도 있습니다.

rosparam dump and rosparam load

Usage:

rosparam dump [file_name] [namespace]
rosparam load [file_name] [namespace]

모든 parameter를 params.yaml로 저장합니다.

$ rosparam dump params.yaml

또한, 이 yaml 파일을 새로운 namespace에 저장 할 수도 있습니다. e.g. copy

$ rosparam load params.yaml copy
$ rosparam get /copy/background_b
  • 255

이제 당신은 ROS service와 parameter가 어떻게 동작하는지 이해하였습니다. rqt_console과 roslaunch를 배워봅시다. try using rqt_console and roslaunch

Wiki: ko/ROS/Tutorials/UnderstandingServicesParams (last edited 2019-10-08 06:59:53 by Kang Wonjin)