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
classMonitorTask(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))defrun(self): return self.status defreset(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 более подробно в контексте ряда примеров программ, к которым мы обратимся далее.