> For the complete documentation index, see [llms.txt](https://m1807873.gitbook.io/ros-by-example-vol-2-indigo/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://m1807873.gitbook.io/ros-by-example-vol-2-indigo/3.9.5-nastroika-povedeniya-s-pomoshyu-dekoratorov-meta-povedeniya.md).

# 3.9.5 Настройка поведения с помощью декораторов (мета - поведения)

Из предыдущего параграфа мы убедились в том, что селекторов и последовательностей не всегда достаточно, чтобы получить от нашего робота то поведение, которое нам нужно. Существует несколько способов добавить большую гибкость к дереву поведения, включая использование так называемых «декораторов». Мы будем использовать термин «декоратор» или «мета-поведение» довольно свободно для обозначения поведения или функции, единственная роль которых заключается в изменении результата другого поведения или задачи.&#x20;

Для нашего первого примера рассмотрим мета-поведение «Игнорировать неудачу», которое изменяет свое дочернее поведение(-я), возвращая «УСПЕХ», даже если исходный результат – «НЕУДАЧА». Мета-поведение «Игнорировать неудачу» — это как раз то, что нам нужно, чтобы наша последовательность патрулей работала так, как мы хотим, используя ее для изменения каждой навигационной задачи. Наше дерево поведения теперь выглядит так:

* ПОВЕДЕНИЕ
* СТОЯТЬ СПОКОЙНО
* ПРОВЕРИТЬ БАТАРЕЮ
* ЗАРЯЖАТЬСЯ
* НАПРАВИТЬСЯ К ДОК-СТАНЦИИ
* ЗАРЯДИТЬСЯ
* ПАТРУЛИРОВАТЬ
* ИГНОРИРОВАТЬ НЕУДАЧУ
* ТОЧКА МАРШРУТА\_0
* ИГНОРИРОВАТЬ НЕУДАЧУ
* ТОЧКА МАРШРУТА\_1
* ИГНОРИРОВАТЬ НЕУДАЧУ
* ТОЧКА МАРШРУТА\_2
* ИГНОРИРОВАТЬ НЕУДАЧУ
* ТОЧКА МАРШРУТА\_3

Или в форме графа:

![](https://596823033-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M8R5mFg_bmybGIyKwmo%2F-M8ea1fHCxdpfujFVCSx%2F-M8efMXK8CVUahNDyN2D%2F%D0%B3%D1%80%D0%B0%D1%84_2.png?alt=media\&token=135e5f56-9672-4d3c-a9ed-1e7da2fe7c32)

Иной способ перебора последовательности действий при игнорировании сбоев — это просто определить новый тип последовательности со встроенным свойством игнорировать сбой. Библиотека «pi\_trees» включает в себя Итератор составного поведения (Iterator), которое делает именно это.&#x20;

Другим часто используемым мета-поведением является Декоратор цикла (Loop decorator), который принимает один параметр, указывающий количество итераций, и выполняет свое дочернее поведение(-я) заданное количество раз перед завершением. Мы могли бы использовать декоратор цикла вокруг нашего поведения «ПАТРУЛИРОВАТЬ», чтобы ограничить количество патрулей до определенного числа.&#x20;

Ничто не мешает Вам создавать любое количество мета-поведений для использования в Вашем дереве поведения. Некоторые примеры включают в себя:&#x20;

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