文件(pkg)结构:
include----
demo:(自定义的)
- tree_node.h:
所有树的节点的类声明,继承官方库的各种节点类型(RosActionNode/RosServiceNode等类)
输入输出port的变量名称
tick函数声明
req和res函数的声明 - tree_xml.h:
整棵树的逻辑,节点的顺序
输入输出port的变量所带的参数
节点的名字,即注册的时候输入的
建立的服务名和server名,即定义函数时建立的,此处与自定义的服务建立连接
behaviortree_ros:(官方库)
- bt_action_node.h:RosActionNode类的封装
- bt_service_node.h:RosServiceNode类的封装
src----
- tree_node.cpp:定义各个在node.h声明的与节点有关函数,如res/req/tick/result 等函数
- server.cpp:server执行的内容,以及建立一个server+名称,与树节点独立
- action.cpp:action执行的内容,以及建立一个action+名称,与树节点独立
- bh_tree.cpp:注册各个节点(类型在node.h里找),创建树(类型在xml.h里)
msg/action/srv----
msg:
与决策树相关的数据类型
action:
action 文件内容组成分为三部分:请求目标值、最终响应结果、连续反馈,三者之间使用分割示例内容如下:
#目标值
int32 num
---
#最终结果
int32 result
---
#连续反馈
float64 progress_bar
行为树的种类
树的种类2
BehaviorTree.CPP
廖总的树教程
行为树种类详细教程
tree的模块化编程
ssh通信
开机自启
source和export的差别
BT::NodeStatus status = BT::NodeStatus::IDLE
初始化状态为空闲IDLE- 订阅收到的消息要处理的话需要等到spin或者spinonce的时候才调用消息回调处理函数,spin是不会执行下面的内容,会一直卡在那里,而spinonce是会一直执行下去,但是只执行一次,所以需要经常放在循环里面。spin/spinonce
- 自定义节点的名字:
class SayRuntimePort : public BT::SyncActionNode
要会继承,以及确定好input和output的内容,学会就定义该节点里的各个action函数,然后xml里面写的时候才可以生效 - xml的树书写方式