3.10.7 Добавление и удаление задач
Last updated
Was this helpful?
Last updated
Was this helpful?
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 за исключением того, что на последовательных циклах через сценарий задача подсчета будет опущена, а затем появится снова, и так далее.
Нетрудно представить себе дерево поведения, в котором узлы или ветви добавляются или отсекаются на основе опыта робота, чтобы лучше адаптироваться к существующим условиям. Например, можно добавить или удалить целые ветви дерева в зависимости от того, в какой комнате находится робот, или переключить его поведение с уборки на патрулирование, просто обрезав одну ветвь дерева и добавив другую.