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
, и выглядят приблизительно так:
На основе этого файла .action создаются 6 вспомогательных сообщений, чтобы клиент и сервер могли общаться. Это создание сообщений автоматически запускается во время процесса сборки пакета.
Для файла DoDishes.action
будут созданы файлы
Мы обсуждаем работу ActionLib как отдельного протокола, но на самом деле ActionLib именно с точки зрения "транспорта" использует механизм работы с Топиками (Topic).
Поэтому для отладки работы Actions мы будем использовать утилиту rostopic
Прежде чем начать, мы должны запустить некоторые программы, которые помогут нам разобраться с работой.
Запустим ноду симулятора turtlesim
Запустим тестовый ActionServer
Если вы получили ошибку запуска ноды, то возможно вы установили не полную версию ROS, выполните команды
Получим список работающий топиков rostopic list
Мы видим топики в одном пространстве имен turtle_shape
: /cancel
, /feedback
, /goal
, /result
и /status
Эти топики реализуют работу нашего Action shape_server
При помощи довольно сложного вызова, мы можем отправить нашу Цель (Goal) на сервер для начала работы.
Но нам не обязательно это все набирать, тут нас выручает подсказка через вызов Tab
Мы можем набрать rostopic pub /turtle_shape/goal
и нажать два раза таб для заполнения всей структуры сообщения.
Если мы заполним цель как edges: 6, radius: 1.0
, то черепаха в эмуляторе начнет движение по шестиугольнику с гранями в 1 метр.
Модуль ActionLib имеет довольно сложную структуру взаимодействия и выполнения задач. Как Сервер, так и Клиент обрабатывают запросы по принципу Машины состояния (State Machine). Задачи могут отменяться, останавливаться и заново запускаться. Подробное описание этого взаимодействия описано на Wiki странице http://wiki.ros.org/actionlib/DetailedDescription
Не так важно сейчас в этом полностью разобраться, как важно знать, что эти механизмы существуют, и обратиться к документации, когда это будет необходимо.