среда, 3 января 2018 г.

ROS. Сервисы процессов

Среди рассмотренных способов взаимодействия объектов в ROS топики ориентированы на одностороннюю связь, а сервисы хоть и рассчитаны на  общение типа "вопрос - ответ", но предполагают мгновенное исполнение команды. Если же процесс требует времени, придётся ждать, пока он не завершится. 

Для того, чтобы работать с протяжёнными во времени процессами (типа вращения звеньев манипулятора) в ROS предусмотрен специальный тип сервиса - action. Он также имеет клиент-сервисную архитектуру, но при этом клиент имеет возможность отслеживать текущее состояние процесса, а также прерывать его, если необходимо. 



Итак, создадим клиента и сервер, которые эмулируют управление вращением манипулятора. Если вы создаёте новый пакет, выполните команды

   cd окружение_catkin/src
   caktin_create_pkg имя_пакета actionlib actionlib_msgs message_generation rospy

Для продолжения работы с существующим пакетом (в нашем случае, ros_test), нужно будет дописать необходимые зависимости в package.xml:

   <build_depend>actionlib</build_depend>
   <build_depend>actionlib_msgs</build_depend>
   <build_depend>message_generation</build_depend> 
   <run_depend>actionlib</run_depend>
   <run_depend>actionlib_msgs</run_depend>
   <run_depend>message_generation</run_depend>

В файле CMaleLists.txt также нужно дополнить

   find_package(
      ...
      actionlib
      actionlib_msgs
      message_generation
   )

Для выполнения действий необходимо создать action-файл, расположенный в папке пакет/action (т.е. ros_test/action). Назовём его Angle.action. Файл состоит из 3-х частей, первая определяет переменную, в которой клиент укажет целевое значение, вторая часть содержит переменную, где будет сохранён результат при достижении цели, а третья величина предназначена для обратной связи. Вот содержимое файла.

   #goal definition
   int32 count
   ---
   #result definition
   int32 final_count
   --- 
   #feedback
   int32 current_number

После того, как файл action/Angle.action сохранён, можно вернуться к CMaleLists.txt и настроить его для генерации необходимых программе сообщений. Для этого необходимо расскомментировать и отредактировать add_action_files:

   add_action_files(
      FILES
      Angle.action
   )

а также добавить строку в generate_messages:

   generate_messages(
      ...
      actionlib_msgs
   )

Теперь при запуске команды catkin_make будут сгенерированы вспомогательные файлы для работы с Angle (в частности, различные типы сообщений в папке окружение/devel/share/пакет/msg). 

Перейдём к серверу script/angle_server.py. Его код представлен на следующем изображении.


Помимо rospy и actionlib файл импортирует содержимое пакета ros_test.msg. Эти объекты будут сгенерированы при выполнении catkin_make. В частности, AngleFeedback участвует в создании переменной обратной связи _feedback, AngleResult - переменной результата _result. Основной объект, сервер (SimpleActionServer) генерируется на основе AngleAction. При обращении клиента вызывается метод execute_cb, который принимает в качестве аргумента целевое значение (в данном случае, угол поворота).  Во время работы периодически проверяется, не прервал ли пользователь работу (is_preempt_request), и публикуется обратная связь (publish_feedback). При успешном завершении высылается результат (set_succeeded).

Код клиента script/angle_client.py немного меньше.


Основная функция angle_client создаёт объект клиента (SimpleActionClient) и устанавливает целевое значение. Если сервер доступен, публикуется команда (send_goal), при этом определяется функция, которая будет вызвана при получении обратной связи (это действие не обязательно). Метод wait_for_result заставляет функцию ожидать результата бесконечно, либо в течение заданного времени, если определён агрумент функции (в нашем случае 10 секунд). Если процесс завершится раньше указанного времени, будет возвращено полученное в результате значение, иначе -1. Благодаря функции show_feedback текущее состояние процесса будет отображаться на стороне клиента.

Осталось выполнить ряд стандартных действий: сделать файлы исполняемыми и запустить процесс сборки.

   chmod +x script/angle_server.py script/angle_client.py
   cd ~/my_ros_ws
   catkin_make

После этого можно проверить работу программы.

   roscore
   rosrun ros_test angle_server.py
   rosrun ros_test angle_client.py


Комментариев нет:

Отправить комментарий