1. Сервисы ROS и их параметры (ROS Services and Parameters)
Описание: Данный урок знакомит с сервисами ROS и их параметрами, а также с использованием утилит командной строки rosservice и rosparam.
Предполагается, что ваш turtlesim_node, с предыдущего урока, по-прежнему работает, давайте посмотрим на то, какие сервисы предоставляет turtlesim:
2. Сервисы ROS
Сервисы являются еще одним способом, как узлы могут общаться друг с другом. Сервисы позволяют узлам, послать запрос и получить ответ.
2.1 rosservice
rosservice может легко подключаться к клиентско-срвисному фреймворку ROS. У rosservice есть много подкоманд, которые могут быть использованы, как показано ниже:
Использование:
rosservice args print service arguments rosservice call call the service with the provided args rosservice find find services by service type rosservice info print information about service rosservice list list active services rosservice type print service type rosservice uri print service ROSRPC uri
2.1.1 rosservice list
$ rosservice list
Подкоманда list показывает нам, что узел turtlesim предоставляет девять служб: reset, clear, spawn, kill, turtle1/set_pen, /turtle1/teleport_absolute, /turtle1/teleport_relative, turtlesim/get_loggers, и turtlesim/set_logger_level. Есть также две услуги, связанные с отдельным узлом rosout: /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
Давайте посмотрим более внимательно на службу clear с помощью команды rosservice type:
2.1.2 rosservice type
Использование:
rosservice type [service]
Давайте выясним, какой тип у сервиса clear:
$ rosservice type clear std_srvs/Empty
Этот сервис является пустым, это означает, что сервис вызывается без приёма каких-либо аргументов (т. е. он не отправляет никаких данных при принятии запроса и не получает никаких данных при получении ответа). Давайте вызовем этот сервис с помощью команды rosservice call:
2.1.3 rosservice call
Использование:
rosservice call [service] [args]
Здесь мы будем вызывать сервис без аргументов, потому что тип сервиса пустой:
$ rosservice call clear
Команда делает то, что мы и ожидаем, она очищает фон turtlesim_node.
Давайте рассмотрим случай, когда сервис принимает аргументы, давайте посмотрим на сервис(srv) для spawn:
$ rosservice type spawn | rossrv show float32 x float32 y float32 theta string name --- string name
Этот сервис позволяет нам порождать новых черепах в заданном месте и с заданной ориентацией. Поле имени не является обязательным, так что не будем давать нашим новым черепахам имя и пусть turtlesim создаст для нас ещё одну черепаху.
$ rosservice call spawn 2 2 0.2 ""
Вызов сервиса возвращает нам имя вновь созданной черепахи
name: turtle2
Теперь, наш turtlesim должен выглядит следующим образом:
2.2 rosparam
rosparam позволяет хранить и управлять данными на Сервере Параметров ROS (ROS Parameter Server). Сервер Параметров может хранить целые числа, float, boolean, словари и списки. rosparam использует для синтаксиса язык разметки YAML. В простых случаях, YAML выглядит очень естественно: 1 — целое, 1.0 — float, one — строка, true — boolean, [1, 2, 3] — список целых чисел, и {a: b, c: d} — словарь. У rosparam есть много подкоманд, которые могут быть использованы, как показано ниже:
Использование:
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
Давайте посмотрим на то, какие параметры в настоящее время хранятся на Сервере Параметров:
2.2.1 rosparam list
$ rosparam list
Здесь мы можем видеть, что узел turtlesim для цвета фона имеет три параметра на Сервере Параметров:
/background_b /background_g /background_r /roslaunch/uris/host_noonv__38243 /run_id
Давайте поменяем значение одного параметра, используя команду rosparam set:
2.2.2 rosparam set и rosparam get
Использование:
rosparam set [param_name] rosparam get [param_name]
Здесь будет меняться красный канал цвета фона:
$ rosparam set background_r 150
Это приводит к изменению значения параметра, но теперь мы должны вызвать сервис clear чтобы изменения параметра вступили в силу:
$ rosservice call clear
Теперь, наш turtlesim выглядит следующим образом:
Теперь, давайте посмотрим на значения других параметров на Сервере Параметров. Давайте узнаем значение зелёного канала фона:
$ rosparam get background_g 86
Мы также можем использовать rosparam get /, чтобы показать нам содержание всего Сервере Параметров.
$ rosparam get / background_b: 255 background_g: 86 background_r: 150 roslaunch: uris: {host_noonv__38243: 'http://noonv:38243/'} run_id: e07ea71e-98df-11de-8875-001b21201aa8
Вы можете сохранить эти значения в файл, так что вы сможете перезагрузить его в другое время. Это легко реализуется использованием команды rosparam:
2.2.3 rosparam dump и rosparam load
Использование:
rosparam dump [file_name] rosparam load [file_name] [namespace]
Здесь мы запишем все параметры в файл params.yaml
$ rosparam dump params.yaml
Вы даже можете загрузить эти YAML файлы в новое пространство имён (namespaces), например, copy:
$ rosparam load params.yaml copy $ rosparam get copy/background_b 255
Ссылки
http://www.ros.org/wiki/ROS/Tutorials/UnderstandingServicesParams