行为树其他常用代码

类 Subtree

BT::Tree有一个成员是 std::vector< Subtree::Ptr > subtrees。类BT::Tree::Subtree的成员函数如下:

1
2
3
4
5
6
7
Blackboard::Ptr   blackboard

std::string instance_name

std::vector< TreeNode::Ptr > nodes

std::string tree_ID

instance_name的结果:

1
2
3
subA::5
subB::16
subB::16/SubC::20

其中SubC是子树SubB的子树。

tree_ID是把instance_name的数字去掉了。

emitStateChanged

TreeNode::emitStateChanged()TreeNode 类中的一个方法。它用于发出信号,告知树节点的状态已发生变化。此方法对于在行为树中启用响应式和异步行为至关重要。当节点状态发生变化(例如,从running变为成功或失败)时,系统会调用 emitStateChanged() 来通知树,并可能触发进一步的操作或更新。 类似Qt中的信号和槽的机制。

StdCoutLogger

StdCoutLogger 继承 StatusChangeLogger。这个类可以在终端里打印出行为树的日志,相当于Groot Pro的弱化版,可以用来看节点的状态变化,勉强算一个调试工具。

一般这样用,在createTree之后,tick之前。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
auto tree = factory.createTree("main", maintree_bb);
BT::StdCoutLogger cout_logger(tree);
// cout_logger.setEnabled(false);
while (true)
{
try
{
tree.tickOnce();
}
catch (BT::RuntimeError &error)
{
printf("behavior tree tick Runtime Error: %s \n",
error.what());
break;
}
tree.sleep(std::chrono::milliseconds(100));
}

这样会直接打印日志,另外有两个常用函数:

  • void setEnabled(bool enabled)     相当于打印日志的开关,结合参数会很有用

  • void enableTransitionToIdle(bool enable)