Среди рассмотренных способов взаимодействия объектов в 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
cd ~/my_ros_ws
catkin_make
После этого можно проверить работу программы.
roscore
rosrun ros_test angle_server.py
rosrun ros_test angle_client.py
Комментариев нет:
Отправить комментарий