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

Иногда мы хотим, чтобы робот работал над двумя или более задачами одновременно. Библиотека 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.

Last updated