#behavior-tree #cpp #robust

behaviortree-rs

BehaviorTree.CPP的Rust实现,一个健壮的行为树库

7个版本

0.2.5-alpha32024年8月23日
0.2.5-alpha12024年6月6日
0.2.2 2024年3月1日

机器学习 类别中排名第 340

Download history 43/week @ 2024-04-29 146/week @ 2024-05-06 62/week @ 2024-05-13 87/week @ 2024-05-20 29/week @ 2024-05-27 127/week @ 2024-06-03 37/week @ 2024-06-10 13/week @ 2024-06-17 29/week @ 2024-07-01 10/week @ 2024-07-08 34/week @ 2024-07-29 79/week @ 2024-08-05 20/week @ 2024-08-12

每月下载量 133

MIT 许可证

140KB
3K SLoC

behaviortree-rs

BehaviorTree.CPP的Rust实现,仍处于开发中。以下是可以找到的功能表。

使用方法

要在behaviortree-rs中创建自己的节点,您需要使用提供的属性宏来转换您的structimpl块。您还需要为每种节点类型实现某些函数,以及实现一些可选函数的选项。

创建节点

要创建自己的节点,请使用#[bt_node(...)]宏。宏的参数是要创建的节点类型。bt_node宏会修改您的结构体,添加字段和方法实现。

例如,以下节点定义

use behaviortree_rs::bt_node;

#[bt_node(SyncActionNode)]
struct DummyActionNode {}

#[bt_node(SyncActionNode)]
impl DummyActionNode {
// Implementations go here
}

当然,您可以将自己的字段添加到结构体中,这些字段将被包含在生成的结构体中。当您添加字段时,您可以选择在节点构造函数中定义它们,或者具有默认值,在实例化节点时无法修改。

#[bt_node(SyncActionNode)]
struct DummyActionNode {
foo: String,
bar: u32
}

如果您不想在初始化时手动设置字段,请添加#[bt(default)]属性。只需写下#[bt(default)]即可调用<类型>::default(),这仅当指定的类型实现了Default特质时才有效。要指定显式的默认值:#[bt(default = "10")]。注意值被引号包围,因此引号内的文本将被评估为Rust代码。可提供的有效默认选项有

// Function calls
#[bt(default = "String::from(10)")]

// Variables
#[bt(default = "foo")]

// Paths (like enums)
#[bt(default = "NodeStatus::Idle")]

// Literals
#[bt(default = "10")]

实践中的示例

use behaviortree_rs::bt_node;

#[bt_node(SyncActionNode)]
struct DummyActionNode {
#[bt(default = "NodeStatus::Success")]
foo: NodeStatus,
#[bt(default)] // defaults to empty String
bar: String
}

节点函数

use behaviortree_rs::prelude::*;

#[bt_node(SyncActionNode)]
struct DummyActionStruct {}

#[bt_node(
SyncActionNode,
ports = ports,
tick = tick,
)]
impl DummyActionStruct {
async fn tick(&mut self) -> NodeResult {
// Some implementation
// ...

// You must return a `NodeStatus` (i.e. Failure, Success, Running, or Skipped)
// Or an Err
Ok(NodeStatus::Success)
}

fn ports() -> PortsList {
define_ports!(
// No default value
input_port!("foo"),
// With default value
input_port!("bar", 16)
)
}
}

依赖关系

~2.7-8.5MB
~74K SLoC