# ros2_bt_build **Repository Path**: xiaoyangjun123456/ros2_bt_build ## Basic Information - **Project Name**: ros2_bt_build - **Description**: C++行为树BehaviorTree.CPP图形化开发封装,支持发布和订阅ROS2话题 - **Primary Language**: C++ - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2023-07-26 - **Last Updated**: 2024-02-18 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 最近更新: - 2023.7.26 ROS节点可以发布或订阅自定义消息类型,并写了详细的使用文档 - 2023.7.25 修复读取xml文件失败的bug,且成功在行为树之间传递自定义消息类型,胜利在望 - 2023.7.19 🐏了 - 2023.7.17 修复了与navigation2的V3版本冲突的问题 - 2023.7.15 完全能用了,但ROS节点只能发布或订阅string类型的消息 - 2023.7.14 第一次提交代码,能通过编译,能用但不多 # 行为树的安装 ``` git clone https://github.com/BehaviorTree/BehaviorTree.CPP.git cd BehaviorTree.CPP mkdir build cd build cmake .. make sudo make install ``` # 介绍 - 最近我在进行机器人导航方面的工作时,接触到了BehaviorTree.CPP行为树。尽管nav2内置的行为树功能相当不错,但遇到了一个问题:它使用的是较旧的BehaviorTree.CPP版本,缺乏实时监视行为树的能力。尽管新版的BehaviorTree.CPP也提供了ROS2支持,但最近缺乏维护者,并且无法顺利编译。 - 为了解决这个问题,我使用Python开发了一个图形化界面,它能够通过图形化方式创建行为树节点,并支持ROS2话题通信。通过我开发的图形化界面,用户可以轻松创建行为树节点,并与ROS2进行交互。 - 关于BehaviorTree.CPP行为树的相关基础可以看[官方文档](https://www.behaviortree.dev/docs/intro) # 相关基础 ## 1. 节点 - 区别于ROS中的Node,这里的节点相当于树的分叉点,是行为树功能执行的基本单位 - 行为树执行时,执行一个节点,该节点中的tick()函数会向父节点返回: - SUCCESS 成功 - FAILURE 失败 - RUNNING 运行中,等待 - 分类 - 行为树节点 - 树干节点:有子节点 - 控制节点:多个子节点 - 修饰器节点:一个子节点 - 叶节点:没有子节点 - 条件节点 - 行为节点 ## 2. 树干节点 - 有子节点的节点 - 控制类节点:ConditionNode - 序列执行:Sequence - 按照顺序依次执行子节点 - 子节点中有一个返回错误,则中断执行,并向父节点返回FAILURE - [回退:Fallbacks](https://www.behaviortree.dev/docs/nodes-library/FallbackNode) - 尝试不同的策略,直到找到一种“有效”的策略 - [修饰器类节点:DecoratorNode](https://www.behaviortree.dev/docs/nodes-library/DecoratorNode) - 只有一个子节点 - 分类: - 反向Inverter:如果子节点返回SUCCESS,则该节点返回FAILURE;如果子节点返回FAILURE,则该节点返回SUCCESS; - 强制成功:如果子节点返回RUNNING,则返回RUNNING,否则返回SUCCESS - 强制失败:如果子节点返回RUNNING,则返回RUNNING,否则返回FAILURE - 重复:重复执行N次,如果全都返回SUCCESS,则返回SUCCESS,只要有一次FAILURE,就会中断子节点的执行,返回FAILURE - 延时:延时几ms后执行子节点 - 子树等 ## 3. 叶节点 - 没有任何子节点的节点,是实际的命令 - 行为节点: - 同步节点:SyncActionNode - 执行的时候会堵塞树的执行,直到返回SUCCESS或FAILURE - 异步节点:asynActionNode - 执行的时候不会堵塞树的执行,而是返回RUNNING # 4. 端口和黑板 - 端口:相当于节点的毛孔,用来输出和输入 - 黑板:端口的值加上{}就是端口映射,相同端口映射的端口共享相同的值 # 使用教程 - [详细教程](http://t.csdn.cn/TV4db) - cd到需要创建行为树的工作空间 - 在工作空间执行run.py - 点击“重新创建行为树”,在工作空间下创建一个行为树功能包 - 如果已经创建过行为树,则会清空之前的所有更改 - 点击“创建一个新的行为树节点”,为行为树创建节点,点击后会跳出新窗口,有以下信息: - 端口类型: - input:行为树节点的输入端口 - output:行为树节点的输出端口 - rospub:行为树节点发布主题(从ROS节点映射) - rossub:行为树节点订阅主题(从ROS节点映射) - 节点名称/话题名称 - 节点/需要订阅或发布的主题的名称 - 端口初值/映射 - 初值直接输入即可 - 映射值格式:{映射值} - 行为树的输出端口是通过映射和输入端口关联的,只要端口映射的值相同,端口的内容将会共享