Как навести порядок в логике игрового и робототехнического ИИ с библиотекой Bonsai

18 авг 2026
954
39
8
3 недели

Bonsai

Каждый, кто хоть раз пытался запрограммировать поведение сложного NPC для игры или автономного робота на конечных автоматах (FSM), знает этот момент отчаяния. Сначала всё просто: три состояния («патрулирование», «преследование», «атака») и пяток переходов. Но проект растёт. Появляются проверки здоровья, реакция на выстрелы из-за спины, поиск укрытий, перезарядка оружия. Внезапно граф переходов превращается в клубок спагетти, где добавление одного нового действия ломает половину старых связей.

Геймдев давно нашёл лекарство от этой боли в виде деревьев поведения (Behavior Trees). Их популяризировали в своё время Halo 2 и Unreal Engine. Сегодня эту концепцию активно используют в робототехнике и автономных системах.

Недавно я наткнулся на Bonsai — лёгкую и быструю реализацию деревьев поведения на Rust, к которой автор прикрутил ещё и Python-биндинги.

Что такое Behavior Tree человеческим языком

Если отбросить академическую терминологию, дерево поведения — это иерархическая структура правил, определяющая реакцию агента на мир. Главная прелесть подхода заключается в модульности. Каждый узел изолирован и возвращает родительскому элементу один из трёх статусов:

Реклама
  • Success (действие выполнено успешно)
  • Failure (действие провалилось)
  • Running (действие ещё выполняется)

Родительский узел решает, кого вызывать следующим, опираясь на этот результат.

В Bonsai логика собирается из нескольких базовых типов узлов:

// Выполняет A, затем B. Если A падает, цепочка прерывается
Sequence([A, B])

// Пробует A. Если падает, пробует B
Select([A, B])

// Классическое ветвление
If(condition, A, B)

// Выполняет A и B параллельно, ожидая завершения обоих
WhenAll([A, B])

// Запускает параллельно и ждет первого завершившегося
Race([A, B])

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

Как устроен Bonsai под капотом

Bonsai написан на чистом Rust без лишнего оверхеда. Для подключения в проект достаточно добавить зависимость в Cargo.toml:

[dependencies]
bonsai-bt = "*"

Если вы работаете в связке с Python (например, для прототипирования или скриптинга роботов на ROS), пакет ставится через pip:

pip install bonsai-bt

Проблема долгих задач

Дерево поведения должно опрашиваться регулярно и без задержек. Если какой-то узел внутри заблокирует поток на полсекунды (скажем, выполняя тяжёлый расчет пути или сетевой запрос к датчику), вся система замрёт.

Автор Bonsai решил этот вопрос через статус Running и каналы сообщений. Длительные синхронные или асинхронные задачи выносятся в фоновые потоки. Узел дерева просто возвращает Running на каждом тике, пока из канала не придёт сигнал о завершении или ошибке. В репозитории есть наглядный пример async drone, показывающий управление дроном в асинхронном режиме.

Где это пригодится

В тегах репозитория неспроста соседствуют ROS2, Bevy и Unreal Engine. Вот типичные сценарии, где Bonsai экономит нервы:

  1. Игры на Bevy или других Rust-движках. Для реализации ИИ противников, союзников или процедурных событий.
  2. Робототехника и дроны. Построение детерминированных алгоритмов навигации, обхода препятствий и выполнения миссий.
  3. Бэкенд-пайплайны со сложным ветвлением. Если у вас есть цепочка задач с повторами, таймаутами и параллельными ветками, собирать её через Behavior Tree часто удобнее, чем городить вложенные match и try/catch.

Плюсы и минусы

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

Из минусов: документация в самом README довольно краткая. Чтобы разобраться во всех тонкостях параллельных узлов (WhileAll, After), придётся заглянуть в папку examples/ и тесты. Визуального редактора деревьев здесь тоже нет из коробки, поэтому собирать дерево придётся кодом.

Если вам нужен понятный, быстрый и предсказуемый инструмент для логики агентов на Rust или Python без тяжеловесных зависимостей, Bonsai определённо заслуживает звезду на GitHub и тест в пет-проекте.

🍪 Мы используем файлы cookie и сервис аналитики Яндекс.Метрика, чтобы сайт работал лучше. Продолжая пользоваться devtrends.ru, вы соглашаетесь с обработкой данных согласно Политике конфиденциальности.