- 版本:Ubuntu 22.04.2 LTS
- ROS2-Humble
一、介绍
- 最近我在进行机器人导航方面的工作时,接触到了BehaviorTree.CPP行为树。尽管nav2内置的行为树功能相当不错,但遇到了一个问题:它使用的是较旧的BehaviorTree.CPP版本,缺乏实时监视行为树的能力。尽管新版的BehaviorTree.CPP也提供了ROS2支持,但最近缺乏维护者,并且无法顺利编译。
- 为了解决这个问题,我使用Python开发了一个图形化界面,它能够通过图形化方式创建行为树节点,并支持ROS2话题通信。通过我开发的图形化界面,用户可以轻松创建行为树节点,并与ROS2进行交互。
- 图形化写得很垃,但能用,至于有多垃看代码就知道了[狗头],有想法的可以和我私信一起优化优化。
- 关于BehaviorTree.CPP行为树的相关基础可以看官方文档,也可以看我的文章。
二、BehaviorTree.CPP及其Groot2的安装
2.1 BehaviorTree.CPP的安装
- BehaviorTree.CPP是c++的行为树,安装方法如下:
cd ~
git clone https://github.com/BehaviorTree/BehaviorTree.CPP.git
cd BehaviorTree.CPP
mkdir build
cd build
cmake ..
make
sudo make install
- 安装完BehaviorTree.CPP后,你应该可以在
/usr/local/include
下找到behaviortree_cpp的依赖库
2.2 Groot2的安装
- 下载Groot2的.run安装包
- 放到~的位置,运行以下命令:
cd ~
chmod +x Groot2-1.0.1-linux-installer.run
./Groot2-1.0.1-linux-installer.run
- 根据提示一路next就行了
- 安装完成后,输入:
cd ~/Groot2/bin
./groot2
- 就可以看到Groot2的界面了
三、图形化界面的使用
- 克隆项目并打开
cd ~
git clone -b rmdev https://gitee.com/xiaoyangjun123456/ros2_bt_build.git
code .
- 创建工作空间
cd ~
mkdir -p ros2_ws/src
cd ./ros2_ws
- 在vscode中的终端cd到你的工作空间
- 运行python
python3 ~/ros2_bt_build/run.py
-
一定要确保在工作空间的路径下运行的python脚本
-
运行后会出现丑丑的图形化界面。。。
-
点击重新创建行为树后会在你的工作空间下的/src新建一个功能包:ROS2_bt,如果之前创建过了则会覆盖你创建的功能包(慎重)
-
接下来是添加行为树节点,输入节点名字后,点击创建一个新的行为树节点。
-
然后会弹出这个窗口,点击新建端口
-
节点的端口有四种类型:输入端口input、输出端口output、ROS2话题发布端口rospub、ROS2话题订阅端口rossub
-
端口映射的格式为:{映射名字}。
相同的端口映射共享相同的值
。 -
主题的消息类型:如果你想发布或订阅自定义消息类型,则在此做修改。
-
我们创建了两个输入端口,一个输出端口,一个话题发布端,一个话题接收端,其中,话题接收端为自定义的消息类型(
仅做演示用,功能包中没有这个自定义消息类型,测试的时候删去
):
-
填完相关信息后点击创建,会自动更新功能包的代码
-
再创建一个节点,用于接收HP节点的输出(
端口映射和HP节点的输出是一样的
)
-
尝试编译一下(在你的工作空间路径下):
. install/setup.bash
colcon build --packages-select ROS2_bt
- 编译通过
四、修改代码
- 在vscode中找到mynode.h
- ctrl+F直接查找//实现功能
- 在//实现功能的下面来实现节点的功能
- //HP叶节点
BT::NodeStatus tick() override
{
//实现功能
sentry_interfaces::msg::RobotHP other_hp_value;
std::string my_HP_pub_value="100";
std::string HP_max_value;
std::string HP_min_value;
std::string my_HP_value="100";
//通过话题通信得到其他人的生命值
getInput("other_HP",other_hp_value);
//得到生命最小值,赋值给HP_min_value
getInput("HP_min",HP_min_value);
//得到生命最大值,赋值给HP_max_value
getInput("HP_max",HP_max_value);
//输出
std::cout << "生命最小值:" <<HP_min_value<< std::endl;
std::cout << "生命最大值:"<<HP_max_value<< std::endl;
std::cout<<"敌方1号机器人的生命值:"<<other_hp_value.enermy_hp[1]<<std::endl;
//向其他行为树节点输出自己的生命值
setOutput("my_HP",my_HP_value);
//向其他ROS节点输出自己的生命值(话题通信)
setOutput("my_HP_pub",my_HP_pub_value);
return BT::NodeStatus::SUCCESS;
}
- //hp_get叶节点
BT::NodeStatus tick() override
{
//实现功能
std::string GetHP_value;
getInput("GetHP",GetHP_value);
std::cout<<"机器人的生命值:"<<GetHP_value<<std::endl;
return BT::NodeStatus::SUCCESS;
}
- 尝试编译一下(在你的工作空间路径下):
. install/setup.bash
colcon build --packages-select ROS2_bt
五、Groot2可视化编辑行为树
- 打开Groot2
cd ~/Groot2/bin
./groot2
- 点击左上角导入文件
- 找到功能包下的bt_tree.xml
- 进入编辑界面
- 左下角的models里的蓝色部分就是你创建的行为树节点
- 我们可以把节点拖到树中进行编辑,
ROS2DecoratorNode是一定要有的,因为那是ROS到行为树节点的一个映射
,我们还可以在这个界面给机器人的HP_max和HP_min赋值。
- 编辑完成后,点击左上角的保存
- 至此,行为树搭建完毕
六、运行和监视
6.1行为树运行测试
- 在你的工作空间目录下运行:
ros2 run ROS2_bt ROS2_bt
- 我们可以看到
6.2话题订阅测试
- 开启一个新终端,输入:
ros2 topic list
- 可以看到订阅和发布的两个节点
- 输入
. install/setup.bash
ros2 topic echo /my_HP_pub
- 可以看到
正是代码中发布的话题消息
6.3话题订阅测试
- 向订阅的主题发布自定义话题消息,可以看到,敌方一号机器人的生命值为20
ros2 topic pub /other_HP sentry_interfaces/msg/RobotHP "{mate_hp: [1, 2, 3, 4, 5, 6, 7, 8], enermy_hp: [10, 20, 30, 40, 50, 60, 70, 80]}"
- 可以看到确实被改为了20
6.4可视化监视
- 点击左上角切换到监视模式
- 将端口改为1667
- 点击连接
- 即可实时监视行为树