ROS2行为树(C++行为树)BehaviorTree.CPP完全图形化开发,完美支持ROS2话题通信

  • 版本: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的安装

在这里插入图片描述

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
    在这里插入图片描述
  • 点击连接
    在这里插入图片描述
  • 即可实时监视行为树
    在这里插入图片描述
  • 7
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小羊君爱摸鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值