ros2 nav2 行为树插件引擎原理和应用

2023-05-16

Nav2 行为树插件引擎原理和应用

本文由一个简单的例子作为切入点,对Nav2行为树插件引擎的原理进行分析。

文章目录

  • Nav2 行为树插件引擎原理和应用
    • 一个完整应用demo
      • Groot行为树设计和监视器
        • 安装
        • 使用Groot实时监视行为树
      • 行为树运行库
      • 行为树插件引擎
      • 自定义action包
        • 自定义Ros action
        • 行为树action叶节点插件
        • ROS2 action服务节点
    • 行为树action与ROS2 action相结合实现功能和逻辑的解耦

一个完整应用demo

一个完整的应用demo包含以下工程和工具

  • Groot行为树设计器和监视器
  • 行为树运行库
  • 行为树插件引擎
  • 一个行为树action叶节点插件
  • ROS2 action服务节点

Groot行为树设计和监视器

BehaviorTree.CPP具有结构简单易懂,和灵活等优点,非常适合做机器人的业务逻辑,可以从github中获取到源代码。

Groot是一套用于设计行为树以及实时监测行为树状态的辅助工具。通过Groot可以非常方便的实现拖拽式的编程以及快速定位到业务逻辑上的问题。

新版本的BehaviorTree.CPP及其Groot工具提供很多有用的特性,这是ROS2 dashing 所不具备的,所以建议从最新源代码安装。

安装

BehaviorTree.CPP依赖libzmq3-dev库,这是一个通讯库,如果没有安装libzmq3-dev,虽然可以编译通过Groot和BehaviorTree.CPP,但是却会阉割掉Groot实时监视功能。

$ sudo apt-get install libzmq3-dev libboost-dev
$ git clone https://github.com.cnpmjs.org/BehaviorTree/Groot.git

编译和安装Groot

$ cd Groot
$ git submodule update --init --recursive
$ mkdir build
$ cd build
$ cmake ..
$ make

使用Groot实时监视行为树

用于支持Groot实时监控的,实际是一个基于ZMQ实现的loggerBT::PublisherZMQ,Groot支持的logger包括:

  • BT::StdCoutLogger
  • BT::MinitraceLogger
  • BT::FileLogger
  • BT::PublisherZMQ

开启Groot实时监视功能需要通过下面3个步骤

  1. 在行为树应用程序中初始化ZMQ日志用于支持Groot实时监控
BT::PublisherZMQ publisher_zmq(pTree);

其中,BT::PublisherZMQ的构造原型:

PublisherZMQ(const BT::Tree& tree,
             unsigned max_msg_per_second = 25,
             unsigned publisher_port = 1666,
             unsigned server_port = 1667);

对于其他三个参数max_msg_per_second, publisher_portserver_port一般不用修改,采用默认构造即可,如果想要自定义其他端口,则Groot实时监控端也要相应修改。

  1. 运行Groot,再初始化界面选择Monitor,然后点击Start按钮

在这里插入图片描述

  1. 进入Monitor模式的主界面,输入运行行为树的host的ip地址,ServerPort
    在这里插入图片描述

如果端口和IP没有问题,并且行为树已经在运行,则会从目标端接收行为树结构并实时显示当前执行状态。否则右侧的行为树显示区域会一直空白。

在这里插入图片描述

行为树运行库

行为树运行库需要在tx2平台上运行,方便起见,直接使用已经搭建好开发环境的容器tx2-ros2-dev进行开发

从gitbub下载最新的行为树源代码

$ cd ~/workspace
$ git clone https://github.com.cnpmjs.org/BehaviorTree/BehaviorTree.CPP.git

tx2-ros2-dev容器中编译和安装BehaviorTree.CPP

$ cd BehaviorTree.CPP
$ git submodule update --init --recursive
$ mkdir build
$ cd build
$ cmake -DCMAKE_TOOLCHAIN_FILE=~/workspace/ros2/toolchain.cmake ..
$ make install

执行完make install之后,构建生成头文件和运行库将会安装到/home/admin/workspace/ros2/install

行为树插件引擎

行为树插件引擎可以动态加载xml行为树描述文件和叶节点插件,从而实现在运行时加载叶节点和构造行为树。

动态加载叶节点的关键函数:

void BT::BehaviorTreeFactory::registerFromPlugin(const std::string &file_path);

其中file_path为叶节点插件动态库的路径如/home/nvidia/sysctrl/libWaitActionBtNode.so

动态加载叶节点代码如下:

BehaviorTreeEngine::BehaviorTreeEngine(const std::vector<std::string> & plugin_libraries)
{
    BT::SharedLibrary loader;
    for (const auto& p : plugin_libraries) {
        factory_.registerFromPlugin(loader.getOsName(p));
    }
}

动态构建行为树函数原型:

void BT::XMLParser::loadFromText(const std::string& xml_text);
void BT::XMLParser::loadFromFile(const std::string& filename);

BehaviorTree.CPP支持从文件和xml文本字符串构建行为树。

构建代码如下:

BT::Tree
BehaviorTreeEngine::buildTreeFromText(
  const std::string & xml_string,
  BT::Blackboard::Ptr blackboard)
{
    BT::XMLParser p(factory_);
    p.loadFromText(xml_string);
    return p.instantiateTree(blackboard);
}

自定义action包

自定义的action插件包含以下内容:

  • 自定义的action消息
  • 用于动态加载的叶节点插件
  • 用于提供功能实现的ros2action服务节点

自定义Ros action

创建一个ROS2 package wait_action

在包目录中创建自定义action文件action/Wait.action

其内容如下:

builtin_interfaces/Duration time
---
builtin_interfaces/Duration total_elapsed_time
---
builtin_interfaces/Duration time_left

修改package.xml文件,添加以下内容

<buildtool_depend>rosidl_default_generators</buildtool_depend>
<depend>action_msgs</depend>
<exec_depend>rosidl_default_runtime</exec_depend>
<member_of_group>rosidl_interface_packages</member_of_group>

修改CMakeLists.txt文件,添加以下内容

find_package(rclcpp_action REQUIRED)
find_package(builtin_interfaces REQUIRED)
find_package(rosidl_default_generators REQUIRED)
rosidl_generate_interfaces(${PROJECT_NAME}
	"action/wait.action"
	)
ament_export_dependencies(rosidl_default_runtime)

行为树action叶节点插件

构成一个Action叶节点插件的要素如下:

  • ActionClient ROS2节点
  • 使用BT_REGISTER_NODES宏,导出一个Action构造器。
#include <wait_action/action/Wait.hpp>

class WaitAction: public BtActionNode<wait_action::action::Wait>;
    
BT_REGISTER_NODES(factory)
{
    BT::NodeBuilder builder = []
        (const std::string & strName, const BT::NodeConfiguration & config)
    {
        return std::make_unique<WaitAction>(strName, "wait", config);
    };
    
    factory.registerBuilder<WaitAction>("wait", builder);
}

CMakeLists.txt增加如下内容

add_library(WaitActionBtNode SHARED src/WaitAction.cpp)
rosidl_target_interfaces(WaitActionBtNode ${PROJECT_NAME} "rosidl_typesupport_cpp")
target_compile_definitions(WaitActionBtNode PUBLIC BT_PLUGIN_EXPORT)
ament_target_dependencies(WaitActionBtNode
	rclcpp
	rclcpp_action
	behavior_tree_engine
	)

注意:编译插件时,要定义宏BT_PLUGIN_EXPORT,否则生成的插件无法被动态加载,原因参照这篇文章。

拓展

除了action之外,还有conditioncontroldecorator插件,请自行探索

ROS2 action服务节点

行为树action叶节点本身是一个ROS2 action client节点,其只是调用具体的功能,本身并不实现具体功能,ROS2 action服务节点为行为树action叶节点提供服务。

#include <wait_action::action::Wait.hpp>

class WaitActSrv: public ActionServerNode<wait_action::action::Wait>;

int main(int argc, char **argv)
{
    rclcpp::init(argc, argv);
    
    auto wait_act_srv = std::make_shared<WaitActSrv>();
    
    rclcpp::spin(wait_act_srv);
    
    rclcpp::shutdown();
    
    return 0;
}

修改CMakeLists.txt添加如下内容:

add_executable(WaitActionServerNode src/WaitActionServerNode.cpp)
rosidl_target_interfaces(WaitActionServerNode ${PROJECT_NAME} "rosidl_typesupport_cpp")
ament_target_dependencies(WaitActionServerNode
	rclcpp
	rclcpp_action)

行为树action与ROS2 action相结合实现功能和逻辑的解耦

一般的ROS2中一个action的执行步骤可以概括如下:

  1. 一个Action包含3个成员:Goal,Feedback和Result。
  2. Client向Server节点发起一个Goal请求,并等待Server应答结果。
  3. Client在收到Server回复的Goal后,进入到Action执行状态,并向Server发出一个Result请求,并等待Server返回Result。
  4. 由于Server执行Action可能会比较耗时,所以会定期的发布Feedback话题以便Client及时获知当前Action执行状态。
  5. 当Server执行完Action后,会返回Result,Client端收到Result即完成了一个Action传输流程。

而在Nav2行为树引擎中结合了行为树和ROS2 action机制

在这里插入图片描述
其流程概括如下:

  1. 行为树控制业务逻辑,Action Server 提供具体功能的实现。
  2. 行为树加载完成后,业务逻辑从Root节点陆续执行子节点,
  3. 运行到Wait Action叶节点时,通过ROS2的Action机制,使得提供相应服务实现的Action节点执行服务。
  4. Action服务节点执行过程中,行为树对应的叶节点处于“运行中”状态。
  5. 当Action服务节点执行完成,行为树对应的叶节点运行完,并继续按照行为树运行。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ros2 nav2 行为树插件引擎原理和应用 的相关文章

  • 学习总结:C++中STL的数据结构

    1 STL介绍 STL xff08 Standard Template Library xff09 xff0c 即标准模板库 xff0c 是一个具有工业强度的 xff0c 高效的C 43 43 程序库 它被容纳于C 43 43 标准程序库

随机推荐

  • 基于深度学习的移动网络异常检测

    1 文章信息 文章题为 Detection of mobile network abnormality using deep learning models on massive network measurement data xff0c
  • Multilinear Relationship Networks:多任务学习框架

    1 文章信息 文章题为 Learning Multiple Tasks with Multilinear Relationship Networks xff0c 该文章于2017年发表至Advances in neural informat
  • 学校人力资源管理系统——需求分析(一)

    需求分析 一 系统功能 1 通过表的创建过程进行数据的关联和约束 2 插入 修改 删除功能 3 查询功能 二 系统概要设计 本系统共有6个实体 xff0c 分别是教职工 xff0c 部门 xff0c 职称 xff0c 职务 xff0c 学籍
  • vsode 编译报错:main.c:4:10: fatal error: iostream: 没有那个文件或目录

    文档声明 xff1a 以下资料均属于本人在学习过程中产出的学习笔记 xff0c 如果错误或者遗漏之处 xff0c 请多多指正 并且该文档在后期会随着学习的深入不断补充完善 感谢各位的参考查看 笔记资料仅供学习交流使用 xff0c 转载请标明
  • JSON未定义解决办法

    https blog csdn net wanglei9876 article details 41752863 ie6 ie7下JSON parse JSON未定义的解决方法 解决方法一 xff1a var jsons 61 req re
  • datax抽取mongoDB只需要访问隐藏节点源码修改

    背景 由于在mongoDB的业务库数据量较大 且使用方比较多 搜索 业务方和数仓 使得主节点和其他从节点压力很大 为了不影响正常的业务 DBA新增了一台隐藏节点作为搜索和数仓抽取数据用 用datax抽取mongo的数据默认是主节点优先 所以
  • 禁忌搜索算法(Tabu Search)

    一 局部领域搜索 又称 爬山启发式算法 xff0c 从当前的节点开始 xff0c 和周围的邻居节点的值进行比较 如果当前节点是最大的 xff0c 那么返回当前节点 xff0c 作为最大值 即 山峰最高点 xff1b 反之就用最高的邻居节点替
  • Linux基础认识与简单命令的带图示范

    一 Linux的基础认识 Linux全称GUN Linux 是林纳斯 本纳第克特 托瓦兹于1991年10月5日首发 通常公司的服务器都用它是因为GUN是开源组织 xff0c 大家很多都一致Linux是操作系统 xff0c 其实Linux指的
  • MPU6050-扫盲

    文章部分内容转载于 https blog csdn net zmjames2000 article details 88379640 管脚名称说明VCC3 3 5V xff08 内部有稳压芯片 xff09 GND地线SCLMPU6050作为
  • OpenStack 虚拟机修改mac 地址

    查看虚拟机id root 64 controller01 source admin openrc 查看 ip 地址的port id root 64 controller01 neutron port list grep 190 b6c8eb
  • px4 makefile解析

    关于px4的编译的流程 xff0c 首先运行makefile xff0c 执行cmake xff0c 执行完之后再执行make命令 xff0c 完成整个编译流程 编译px4 v2的版本 xff0c 需要执行命令 xff1a make px4
  • px4 CMakeLists.txt解析

    上一篇中提到px4中的Makefile执行make时会调用cmake xff0c 下面对CMakeLists txt做出解析 整个文件分为两个部分 xff0c 前半部分实质是一些初始化工作 后半部分是涉及编译部分 第一部分 xff1a sp
  • px4 rcS脚本分析

    rcS是nuttx系统启动后 xff0c 执行的脚本 xff0c 主要实现对飞控外设以及核心算法模块的启动 先贴一张图 xff0c 这个图已经大致写出了rcS的流程 给出代码分析 有些地方没有分析到 xff0c 还望指正 1 rcS文件 s
  • FreeRTOS进不了任务 卡在SVC_Handler

    网上看的 xff1a 第一次移植FreeRTOS单步调试卡在SVC Handler 汇编上面看SVC Handler后面有个 WEAK xff0c 意思是如果该函数不存在也不报错 xff0c 这意思是SVC Handler不存在 xff0c
  • 学校人力资源管理系统——需求分析(二)

    四 数据字典 1 教 职工信息表 的数据字典如表所示 表1 教职工信息表的数据字典 列名 数据类型 长度 是否可空 说明 职工编号 定长字符串型 xff08 char xff09 6 主键 姓名 定长字符串型 xff08 char xff0
  • IIC通讯总结

    1 IIC简介 IIC全称Inter Integrated Circuit 是由PHILIPS公司在80年代开发的两线式串行总线 xff0c 用于连接微控制器及其外围设备 IIC属于半双工同步通信方式 2 IIC特点 xff08 1 xff
  • Opencv 创建图像时,CV_8UC1,CV_32FC3等参数的含义

    转载链接 xff1a http blog csdn net maweifei article details 51221259 CV lt bit depth gt S U F C lt number of channels gt 1 bi
  • 时间序列聚类方法的研究

    女主宣言 为了保证系统 服务的可靠性和稳定性 xff0c 监控系统日渐成为每个公司 企业的一个必不可少的系统 随着服务 机器等数量越来越多 xff0c 如何分析海量时间序列KPI成为我们在智能运维领域首先需要解决的问题 在众多的时间序列中
  • 基于docker搭建tx2的ROS2交叉编译环境

    基于docker搭建TX2的ROS2交叉编译环境 概述 ROS2官方文档有交叉编译相关说明 本文使用TX2最新官方镜像JetPack4 4版本 xff0c 自带ubuntu18 04 有现成的ubuntu18 04就可以使用apt get
  • ros2 nav2 行为树插件引擎原理和应用

    Nav2 行为树插件引擎原理和应用 本文由一个简单的例子作为切入点 xff0c 对Nav2行为树插件引擎的原理进行分析 文章目录 Nav2 行为树插件引擎原理和应用一个完整应用demoGroot行为树设计和监视器安装使用Groot实时监视行