3.10.3 Классы дерева поведения, специфичные для ROS
Классы дерева поведения, специфичные для ROS, можно найти в файле pi_trees_ros.py в каталоге pi_trees/pi_trees_ros/src. Эта библиотека содержит три ключевые задачи ROS: MonitorTask для мониторинга темы ROS; ServiceTask для подключения к службе ROS; и SimpleActionTask для отправки целей на сервер действий ROS и получения обратной связи. Мы лишь кратко опишем здесь эти задачи, поскольку их использование наглядно продемонстрировано в последующих примерах программирования.
Ссылка на источник: pi_trees_ros.py
class MonitorTask(Task):
""" Turn a ROS subscriber into a Task """
def __init__(self, name, topic, msg_type, msg_cb, wait_for_message=True, timeout=5):
super(MonitorTask, self).__init__(name)
self.topic = topic
self.msg_type = msg_type
self.timeout = timeout
self.msg_cb = msg_cb
rospy.loginfo("Subscribing to topic " + topic)
if wait_for_message:
try:
rospy.wait_for_message(topic, msg_type, timeout=self.timeout)
rospy.loginfo("Connected.")
except:
rospy.loginfo("Timed out waiting for " + topic)
# Подпишитесь на данную тему с помощью данной функции обратного вызова, выполняемой через run()
rospy.Subscriber(self.topic, self.msg_type, self._msg_cb)
def _msg_cb(self, msg):
self.set_status(self.msg_cb(msg))
def run(self):
return self.status
def reset(self):
pass
MonitorTask подписывается на заданную тему ROS и выполняет заданную функцию обратного вызова. Функция обратного вызова определяется пользователем и отвечает за возврат одного из трех допустимых значений состояния задачи: «УСПЕХ», «НЕУДАЧА» или «ВЫПОЛНЕНИЕ».
Задача ServiceTask упаковывает заданную службу ROS и при необходимости выполняет определяемую пользователем функцию обратного вызова. По умолчанию задача ServiceTask просто вызывает соответствующую службу ROS и возвращает «УСПЕХ», если только сам вызов службы не завершается неудачей, и в этом случае она возвращает «СБОЙ». Если пользователь передает функцию обратного вызова, эта функция может просто выполнить некоторый произвольный код или может вернуть состояние задачи.
Задача SimpleActionTask имитирует задачу SimpleActionState, определенную в SMACH. Ее основная функция заключается в том, чтобы создать программу оболочку для клиента действия ROS (simple action client) и к тому же забрать имя действия, тип действия и цель в качестве аргументов. Она также может принимать аргументы, указывающие определенные пользователем функции обратного вызова для стандартных обратных вызовов: active_cb, done_cb и feedback_cb, которые передаются клиенту ROS. В частности, задача SimpleActionTask определяет функцию по умолчанию done_cb, которая сообщает конечное состояние действия, которое затем преобразуется в соответствующее состояние задачи для использования в остальной части дерева поведения.
Мы рассмотрим задачу SimpleActionTask более подробно в контексте ряда примеров программ, к которым мы обратимся далее.
Last updated
Was this helpful?