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?