📊
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.7 Добавление и удаление задач

Previous3.10.6 Параллельные задачиNextТермины

Last updated 5 years ago

Was this helpful?

CtrlK

Was this helpful?

Одной из ключевых особенностей деревьев поведения является возможность добавлять или удалять модели поведения по модульному принципу. Например, предположим, что мы хотим добавить задачу "мытье посуды" к роботу-уборщику дома, когда он находится на кухне. Все, что нам нужно сделать - определить эту новую задачу и добавить ее в наш список задач в верхней части нашего сценария. Нет необходимости беспокоиться о том, как эта новая задача взаимодействует с другими задачами в дереве поведения. Это просто становится еще одной дочерней задачей в итераторе TASK_LIST для кухни.

И наоборот, предположим, что у вашего робота нет док-станции, и вы хотите исключить задачу подзарядки из дерева поведения, но все равно хотите получать уведомления, когда батарея разряжена. Тогда мы можем просто прописать строку, которая добавляет поведение подзарядки к задаче «СТОЯТЬ СПОКОЙНО», а затем добавить новую задачу, которая отправляет нам электронное письмо или кричит о помощи.

Добавление или удаление узлов или даже целых ветвей дерева поведения можно динамически производить даже во время выполнения роботом задач. Пример сценария add_remove_tree.py демонстрирует эту концепцию. Этот сценарий идентичен сценарию parallel_tree.py из предыдущего раздела за исключением того, что в конце чередующихся сквозь дерево циклов мы удаляем задачу подсчета так, чтобы отображались только слова. На следующем цикле мы добавим обратно задачу подсчета. Вот ключевой блок кода, который выполняет эту работу:

remove =  True 
while True:      
    status = BEHAVE.run()      
    time.sleep(0.1)      
    if status == TaskStatus.SUCCESS: 
        BEHAVE.reset() 
        if remove:              
            PARALLEL_DEMO.remove_child(COUNT_WORDS)          
    else:              
        PARALLEL_DEMO.add_child(COUNT_WORDS)          
        remove = not remove

Попробуйте выполнить сценарий с помощью команды:

$ rosrun rbx2_tasks add_remove_tree.py

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

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