BonsaiライブラリでゲームとロボティクスのAIロジックに秩序を

ゲームや自律ロボットの複雑なNPCの動作を有限状態機械(FSM)でプログラミングしようとしたことがある人なら、この絶望感を理解できるでしょう。最初はシンプルです:3つの状態(「巡回」「追跡」「攻撃」)と少数の遷移。しかしプロジェクトは成長します。体力チェック、背後からの攻撃への反応、カバーへの退避、武器のリロードなどが現れます。突然、遷移グラフはスパゲッティ状の絡まりに変わり、新しいアクションを1つ追加すると、既存の半分以上の接続が壊れてしまいます。
ゲーム開発では、長い間Behavior Treesという形でこの痛みへの解決策を見つけてきました。Halo 2やUnreal Engineによって普及しました。今日では、このコンセプトはロボティクスや自律システムで積極的に使用されています。
最近、Bonsaiを見つけました—Rustで書かれた軽量で高速なビヘイビアツリーの実装で、作者がPythonバインディングも追加しています。
Behavior Treeを平易な言葉で説明すると
学術的な用語を脇に置いて考えると、ビヘイビアツリーとは、エージェントの世界への反応を定義する階層的なルール構造です。このアプローチの主な利点はモジュール性です。各ノードは独立しており、親に3つのステータスのいずれかを返します:
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
長時間実行タスクの問題
ビヘイビアツリーは定期的に、そして遅延なくポーリングされなければいけません。内部のノードがスレッドを0.5秒間ブロックした場合(例えば、重いパスファインディングやセンサーへのネットワークリクエストなど)、システム全体が凍りつきます。
Bonsaiの作者は、 Runningステータスとメッセージチャネルを通じてこの問題を解決しました。長時間実行される同期または非同期タスクはバックグラウンドスレッドに移動されます。ツリーノードは、チャネルから完了またはエラー信号が届くまで、各ティックで単に Runningを返します。リポジトリには、非同期モードでのドローン制御を示す明確なasync droneの例があります。
こんな場面で使えます
リポジトリのタグにROS2、Bevy、Unreal Engineが含まれているのは偶然ではありません。Bonsaiがあなたの助けになる典型的なシナリオを以下に示します:
- Bevyやその他のRustエンジンでのゲーム。敵AI、味方、procedural eventsの実装に。
- ロボティクスとドローン。決定論的なナビゲーションアルゴリズム、障害物回避、ミッション実行の構築に。
- 複雑な分岐を持つバックエンドパイプライン。再試行、タイムアウト、並行ブランチを含むタスクチェーンがある場合、Behavior Treeで組み立てる方が、ネストされた
matchやtry/catch文を構築するより便利なことが多いです。
メリットとデメリット
このプロジェクトは、そのミニマリズムで心地よい印象を残します。オーバーロードされた抽象化はなく、コードはクリーンで、ロジックの決定論性によりデバッグが予測可能です。
欠点としては、READMEのドキュメント自体がかなり簡潔です。並行ノード( WhileAll、 After)のすべてのニュアンスを理解するには、 examples/フォルダとテストを確認する必要があります。また、ビジュアルツリーエディタが標準で用意されていないため、コードでツリーを構築する必要があります。
重量級の依存関係なしで、RustまたはPythonでエージェントロジックのための明確で高速で予測可能なツールが必要な場合、Bonsaiは確かにGitHubでのスターと、あなたのサイドプロジェクトでのテストに値します。
関連プロジェクト