Action
Last updated
Last updated
Модель коммуникации в режиме Действие (Action) используется, когда выполнение запрошенной команды занимает продолжительное время и необходима обратная связь с процессом. Это очень похоже на модель Service: (Service Request) используется как Задача (Action Goal), а ответ (Service Response) используется как Результат (Action Result). Также есть дополнительная сущность Обратная Связь (Action Feedback) для передачи промежуточных результатов выполнения процесса для клиента. После отправки запроса (Action Goal) программа может продолжать работать, "отвлекаясь" только на обработку или Результата (Action Result), или промежуточного состояния (Action Feedback). Такой метод работы будет асинхронным.
Например, как показано на рисунке, если клиент устанавливает цель -- мыть посуду, сервер начинает мыть посуду и в процессе информирует клиента о ходе мытья посуды в форме обратной связи. После окончания обработки, сервер отправляет клиенту сообщение об окончании процесса.
В отличие от службы (Service), действие (Action) часто используется для управления сложными задачами робота, такими как передвижение к заданной точке, запуск лазерного сканирования, перемещение манипуляторов робота по сложной траектории и т.п.
Файлы описания действия (Action) находятся в директории ./action
пакета, имеют расширение .action
, и выглядят приблизительно так:
# Определение цели (goal)
uint32 dishes # Сколько мыть тарелок
---
# Определение результата (result)
uint32 total_dishes_cleaned # Сколько всего было вымыто
---
# Определение обратной связи (feedback)
uint32 dishes_cleaned # Сколько вымыто посуды сейчас
На основе этого файла .action создаются 6 вспомогательных сообщений, чтобы клиент и сервер могли общаться. Это создание сообщений автоматически запускается во время процесса сборки пакета.
Для файла DoDishes.action
будут созданы файлы
DoDishesAction.msg
DoDishesActionGoal.msg
DoDishesActionResult.msg
DoDishesActionFeedback.msg
DoDishesGoal.msg
DoDishesResult.msg
DoDishesFeadback.msg
Мы обсуждаем работу ActionLib как отдельного протокола, но на самом деле ActionLib именно с точки зрения "транспорта" использует механизм работы с Топиками (Topic).
Поэтому для отладки работы Actions мы будем использовать утилиту rostopic
Прежде чем начать, мы должны запустить некоторые программы, которые помогут нам разобраться с работой.
Запустим ноду симулятора turtlesim
rosrun turtlesim turtlesim_node
Запустим тестовый ActionServer
rosrun turtle_actionlib shape_server
Если вы получили ошибку запуска ноды, то возможно вы установили не полную версию ROS, выполните команды
sudo apt install ros-noetic-turtle-actionlib
Получим список работающий топиков rostopic list
***
/turtle_shape/cancel
/turtle_shape/feedback
/turtle_shape/goal
/turtle_shape/result
/turtle_shape/status
Мы видим топики в одном пространстве имен turtle_shape
: /cancel
, /feedback
, /goal
, /result
и /status
Эти топики реализуют работу нашего Action shape_server
При помощи довольно сложного вызова, мы можем отправить нашу Цель (Goal) на сервер для начала работы.
rostopic pub /turtle_shape/goal turtle_actionlib/ShapeActionGoal "header:
seq: 0
stamp:
secs: 0
nsecs: 0
frame_id: ''
goal_id:
stamp:
secs: 0
nsecs: 0
id: ''
goal:
edges: 6
radius: 1.0"
Но нам не обязательно это все набирать, тут нас выручает подсказка через вызов Tab
Мы можем набрать rostopic pub /turtle_shape/goal
и нажать два раза таб для заполнения всей структуры сообщения.
Если мы заполним цель как edges: 6, radius: 1.0
, то черепаха в эмуляторе начнет движение по шестиугольнику с гранями в 1 метр.
Модуль ActionLib имеет довольно сложную структуру взаимодействия и выполнения задач. Как Сервер, так и Клиент обрабатывают запросы по принципу Машины состояния (State Machine). Задачи могут отменяться, останавливаться и заново запускаться. Подробное описание этого взаимодействия описано на Wiki странице http://wiki.ros.org/actionlib/DetailedDescription
Не так важно сейчас в этом полностью разобраться, как важно знать, что эти механизмы существуют, и обратиться к документации, когда это будет необходимо.