3.10.7 Добавление и удаление задач

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

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

Last updated