3.9.5 Настройка поведения с помощью декораторов (мета - поведения)
Из предыдущего параграфа мы убедились в том, что селекторов и последовательностей не всегда достаточно, чтобы получить от нашего робота то поведение, которое нам нужно. Существует несколько способов добавить большую гибкость к дереву поведения, включая использование так называемых «декораторов». Мы будем использовать термин «декоратор» или «мета-поведение» довольно свободно для обозначения поведения или функции, единственная роль которых заключается в изменении результата другого поведения или задачи.
Для нашего первого примера рассмотрим мета-поведение «Игнорировать неудачу», которое изменяет свое дочернее поведение(-я), возвращая «УСПЕХ», даже если исходный результат – «НЕУДАЧА». Мета-поведение «Игнорировать неудачу» — это как раз то, что нам нужно, чтобы наша последовательность патрулей работала так, как мы хотим, используя ее для изменения каждой навигационной задачи. Наше дерево поведения теперь выглядит так:
ПОВЕДЕНИЕ
СТОЯТЬ СПОКОЙНО
ПРОВЕРИТЬ БАТАРЕЮ
ЗАРЯЖАТЬСЯ
НАПРАВИТЬСЯ К ДОК-СТАНЦИИ
ЗАРЯДИТЬСЯ
ПАТРУЛИРОВАТЬ
ИГНОРИРОВАТЬ НЕУДАЧУ
ТОЧКА МАРШРУТА_0
ИГНОРИРОВАТЬ НЕУДАЧУ
ТОЧКА МАРШРУТА_1
ИГНОРИРОВАТЬ НЕУДАЧУ
ТОЧКА МАРШРУТА_2
ИГНОРИРОВАТЬ НЕУДАЧУ
ТОЧКА МАРШРУТА_3
Или в форме графа:
Иной способ перебора последовательности действий при игнорировании сбоев — это просто определить новый тип последовательности со встроенным свойством игнорировать сбой. Библиотека «pi_trees» включает в себя Итератор составного поведения (Iterator), которое делает именно это.
Другим часто используемым мета-поведением является Декоратор цикла (Loop decorator), который принимает один параметр, указывающий количество итераций, и выполняет свое дочернее поведение(-я) заданное количество раз перед завершением. Мы могли бы использовать декоратор цикла вокруг нашего поведения «ПАТРУЛИРОВАТЬ», чтобы ограничить количество патрулей до определенного числа.
Ничто не мешает Вам создавать любое количество мета-поведений для использования в Вашем дереве поведения. Некоторые примеры включают в себя:
Ограничение количества запускаемых действий;
Ограничение частоты, с которой поведение может быть запущено с помощью таймера;
Временная деактивация поведения;
Селектор, который пробует дочерние задачи в случайном порядке.
Last updated
Was this helpful?