📊
ros by example vol 2 indigo
  • Титульная страница
  • 3.9 Деревья поведения
  • 3.9.1 Деревья поведения в сравнении с иерархическими машинами состояния
  • 3.9.2 Основные свойства деревьев поведения
  • 3.9.3 Построение дерева поведения
  • 3.9.4 Селекторы и последовательности
  • 3.9.5 Настройка поведения с помощью декораторов (мета - поведения)
  • 3.10 Программирование с использованием деревьев поведения и ROS
  • 3.10.1 Установка библиотеки pi_trees
  • 3.10.2 Основные компоненты библиотеки pi_trees
  • 3.10.3 Классы дерева поведения, специфичные для ROS
  • 3.10.4 Пример патрульного бота с использованием деревьев поведения
  • 3.10.5 Робот для очистки дома с использованием деревьев поведения.
  • 3.10.6 Параллельные задачи
  • 3.10.7 Добавление и удаление задач
  • Термины
Powered by GitBook
On this page

3.10.6 Параллельные задачи

Previous3.10.5 Робот для очистки дома с использованием деревьев поведения.Next3.10.7 Добавление и удаление задач

Last updated 5 years ago

Was this helpful?

CtrlK

Was this helpful?

Иногда мы хотим, чтобы робот работал над двумя или более задачами одновременно. Библиотека pi_trees включает в себя тип параллельных задач для обработки этих ситуаций. Существует два вида параллельных задач. Тип ParallelAll возвращает «УСПЕХ», если все одновременно выполняемые задачи завершаются успешно. Тип ParallelOne возвращает «УСПЕХ» сразу же после успешного выполнения любой из задач.

Пример сценария называется parallel_tree.py, в каталоге rbx2_tasks/nodes показан тип задачи ParallelAll. В этом сценарии первая задача печатает данное сообщение по одному слову за раз. Второе задание считает до 10. Попробуйте вот этот скрипт:

$ rosrun rbx2_tasks parallel_tree.py

Вы должны увидеть следующие выходные данные:

Структура дерева поведения

--> ПЕЧАТАТЬ И СЧИТАТЬ

--> НАПЕЧАТАТЬ_СООБЩЕНИЕ

--> СЧИТАТЬ ДО 10

Take

1 me 2

to 3

your 4

leader!

5

6

7

8

9

10

Обратите внимание, что и задача сообщения, и задача подсчета выполняются до завершения работы скрипта, но выходные данные чередуются между этими двумя задачами, так как они выполняются параллельно.

Давайте взглянем на основную часть кода:

class ParallelExample(): 
    def __init__(self): 
        # Корневой узел
        BEHAVE = Sequence("behave") 
 
        # Сообщение для печати
        message =  "Take me to your leader!"
         
        # Как высоко задача подсчета должна досчитать
        n_count = 10 
 
        # Создаем задачу PrintMessage, как определено далее в сценарии
        PRINT_MESSAGE = PrintMessage("PRINT_MESSAGE", message) 
          
        # Создаем задачу Count(), также определенную позже в сценарии
        COUNT_TO_10 = Count("COUNT_TO_10", n_count) 
         
        # Инициализация параллельной задачи ParallelAll
        PARALLEL_DEMO = ParallelAll(“PRINT_AND_COUNT”) 
         
        # Добавляем эти две подзадачи в параллельную задачу
        PARALLEL_DEMO.add_child(PRINT_MESSAGE) 
        PARALLEL_DEMO.add_child(COUNT_TO_10) 
         
        # Добавляем параллельную задачу в корневую задачу
        BEHAVE.add_child(PARALLEL_DEMO) 
         
        # Отображаем дерево поведения
        print "Behavior Tree Structure" 
        print_tree(BEHAVE) 
         
        # Инициализация общего состояния
        status = None 
             
        # Запускаем дерево
        while not status == TaskStatus.SUCCESS: 
            status = BEHAVE.run() 
            time.sleep(0.1)

Построение дерева поведения, показанного выше, должно быть достаточно понятным из-за встроенных комментариев. Обратите внимание, что задачи PrintMessage() и Count() определены позже в сценарии и довольно просты, поэтому мы не будем отображать их здесь.

Если вы измените значение параметра сценария parallel_tree.py так, чтобы задача ParallelAll в строке 19 была заменена задачей ParallelOne, выходные данные должны выглядеть следующим образом:

Структура дерева поведения

--> ПЕЧАТАТЬ И СЧИТАТЬ

--> НАПЕЧАТАТЬ_СООБЩЕНИЕ

--> СЧИТАТЬ ДО 10

Отведите

1 меня 2

к 3

вашему 4

руководителю!

Теперь сценарий завершится, как только одна из задач завершится. В этом случае задача «НАПЕЧАТАТЬ_СООБЩЕНИЕ» завершается до выполнения задачи «СЧИТАТЬ_ДО_10», поэтому мы не видим чисел 5-10.