行为树 --- [7] BehaviorTree.CPP 4.x版本的编译及使用

news2024/9/27 12:12:42

根据BehaviorTree.CPP的官方介绍,3.x版本已经不再维护了,建议使用4.x版本,
在这里插入图片描述
4.x版本和3.x版本的区别可以看这里 — https://www.behaviortree.dev/migration

本文介绍4.x版本的编译及使用,环境是Debian 10.5,编译器是GCC 8.3.0


一 下载4.x版本

本文写作时,4.x最新版本是4.0.1,首先进入其github地址https://github.com/BehaviorTree/BehaviorTree.CPP,
在这里插入图片描述
然后点击tags,在新页面里点击4.0.1对应的zip包,如下,
在这里插入图片描述


二 搭建工程

下载完成后拷贝到Linux环境下,然后搭建一个工程环境,如下,
在这里插入图片描述
这里在test001目录下使用了软链接来指向BehaviorTree.CPP源码目录,这样的好处是:如果有多个工程,那么BehaviorTree.CPP源码目录就只需要一份就可以了,每个工程只需要一个软链接来指向这个源码目录就行了。

CMakeLists.txt内容如下,

cmake_minimum_required(VERSION 3.5.0)
project(demo)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

add_definitions(-Wno-unused-but-set-variable)

set(BTCPP_SHARED_LIBS OFF CACHE BOOL "xxx" FORCE)
set(BTCPP_ENABLE_COROUTINES OFF CACHE BOOL "xxx" FORCE)
set(BTCPP_MANUAL_SELECTOR OFF CACHE BOOL "xxx" FORCE)


add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/BTSourceCode)


include_directories(${CMAKE_CURRENT_SOURCE_DIR}/BTSourceCode/include)

add_executable(demo main.cpp)
target_link_libraries(demo behaviortree_cpp)

target_link_libraries(demo stdc++fs)

可以看出需要开启C++17的支持,另外就是还要链接stdc++fs库,这个和编译器版本有关,如果是10及以上的版本就不需要链接这个库了。还有就是去掉no-unused-but-set-variable的警告。

main.cpp内容如下,

#include "behaviortree_cpp/bt_factory.h"


static const char* xml_text = R"(

 <root BTCPP_format="4" >

     <BehaviorTree ID="MainTree">
        <Sequence name="root">
            <SaySomething     message="hello" />
            <ThinkWhatToSay   text="{the_answer}"/>
            <SaySomething     message="{the_answer}" />
        </Sequence>
     </BehaviorTree>

 </root>
 )";


class ThinkWhatToSay : public BT::SyncActionNode
{
public:
  ThinkWhatToSay(const std::string& name, const BT::NodeConfig& config) :
    BT::SyncActionNode(name, config)
  {}

  // This Action simply write a value in the port "text"
  BT::NodeStatus tick() override
  {
    setOutput("text", "The answer is 42");
    return BT::NodeStatus::SUCCESS;
  }

  // A node having ports MUST implement this STATIC method
  static BT::PortsList providedPorts()
  {
    return {BT::OutputPort<std::string>("text")};
  }
};


class SaySomething : public BT::SyncActionNode
{
  public:
    SaySomething(const std::string& name, const BT::NodeConfig& config)
      : BT::SyncActionNode(name, config)
    {
    }

    // You must override the virtual function tick()
    BT::NodeStatus tick() override
    {
        auto msg = getInput<std::string>("message");
        if (!msg)
        {
            throw BT::RuntimeError( "missing required input [message]: ", msg.error() );
        }

        std::cout << "Robot says: " << msg.value() << std::endl;
        return BT::NodeStatus::SUCCESS;
    }

    // It is mandatory to define this static method.
    static BT::PortsList providedPorts()
    {
        return{ BT::InputPort<std::string>("message") };
    }
};


int main()
{

  BT::BehaviorTreeFactory factory;


  factory.registerNodeType<ThinkWhatToSay>("ThinkWhatToSay");
  factory.registerNodeType<SaySomething>("SaySomething");


  auto tree = factory.createTreeFromText(xml_text);

  tree.tickWhileRunning();

  return 0;
}

需要注意的是xml里要加上BTCPP_format="4"这个属性。


三 编译及使用

开启终端,cd到build目录下,然后执行如下命令,

cmake .. && make

编译成功后,运行demo,

./build/demo

输出如下,
在这里插入图片描述


四 小结

用下来感觉还是3.x版本用的顺手一点,目前3.x最新版本是3.8,而4.x版本的CMakeLists.txt更加合理一点,但是要求使用C++17。用户可以根据自己项目需要来选择使用哪个版本。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/97367.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

笔试强训(四十七)

目录一、选择题二、编程题2.1 合唱团2.1.1 题目2.1.2 题解2.2 马戏团2.2.1 题目2.2.2 题解一、选择题 &#xff08;1&#xff09;对于IP地址130.63.160.2&#xff0c;MASK为255.255.255.0&#xff0c;子网号为&#xff08;B&#xff09; A.160.2 B.160 C.63.160 D.130.63.160 …

学Python好找工作吗?需要满足Python岗位哪些要求?

学Python好找工作吗&#xff1f;需要满足哪些要求&#xff1f;随着Python的火爆&#xff0c;国内Python的岗位也随之增多&#xff0c;只要技术能力强项目经验充足&#xff0c;找到工作不是问题。即使是一些二线城市&#xff0c;Python的薪资待遇也比较好。 一、学Python好找工作…

学习编程的中小学生越来越多,是盲目追风,还是确有其用?!

首先&#xff0c;中小学生为什么要学习编程?未来社会&#xff0c;随姜信息技术和人工智能的发展&#xff0c;越来越多行业的工作离不开编程。美国前总统奥巴马就呼吁:“如果我们想让美国保持地位&#xff0c;就需要年轻代的美国人掌握这种(编程)工具和技术,它将改变我们所有的…

最简单的canvas基础+实践,确定不进来看看嘛

前言 怎么突然提到 canvas 呢❓其实是因为工作中有一个小需求&#xff0c;就是给特定的区域做水印&#x1f624;&#xff0c;思来想去&#x1f60e;就选择使用 canvas 去做&#xff0c;简单效果如下&#xff1a; 实现思路&#x1f937;‍♂️&#xff1a;封装一个全局指令&am…

新装的Ubuntu无法连接有线(无有线标志)

解决方法 1、lspci命令&#xff08;查看网卡型号&#xff09; labhlab:~$ lspci 00:00.0 Host bridge: Intel Corporation Device 4660 (rev 02) 00:01.0 PCI bridge: Intel Corporation Device 460d (rev 02) 00:06.0 PCI bridge: Intel Corporation Device 464d (rev 02) 0…

【图像增强】局部对比度增强的CLAHE算法直方图增强【含Matlab源码 1341期】

⛄一、简介 基于matlab局部对比度增强的CLAHE算法直方图增强 ⛄二、部分源代码 %% tic %% 清空工作区与变量 clc; clear; for image_number1:1 imageNamestrcat(num2str(image_number),‘.jpg’); img imread(imageName); %% 在LAB空间进行去雾 % RGB转LAB transform mak…

【数据结构】堆(一)——堆的实现

作者&#xff1a;一个喜欢猫咪的的程序员 专栏&#xff1a;《数据结构》 喜欢的话&#xff1a;世间因为少年的挺身而出&#xff0c;而更加瑰丽。 ——《人民日报》 目录 堆的概念及结构&#xff1a; 堆的实现思路&#xff1a;&#xff08;我…

【教学类-23-01】20221217《不会写学号的中班幼儿的学号描字贴》(中班描字)

成品样式&#xff1a; 每个孩子3页A4横板&#xff0c;供6次书写 打印样式&#xff1a; 背景需求&#xff1a; 前期进行6次的Python学具教学活动&#xff0c;对中3班幼儿书写学号和名字的情况评估&#xff1a; 筛选出10位需要练习学号的幼儿。 学号、名字需要持续性、强化性练…

科技改变世界,科技改变世界杯

2022年11月20日&#xff0c;2022年卡塔尔世界杯&#xff08;英语&#xff1a;FIFA World Cup Qatar 2022&#xff09;在充满阿拉伯风情的开幕式中拉开了帷幕。 相比以往世界杯&#xff0c;今年卡塔尔世界杯在赛场上加设的黑科技&#xff0c;让我们在赛场上反复领略到了各种剧情…

机器学习100天(四):004 数据预处理之类别特征编码

机器学习100天,今天讲的是:数据预处理之类别特征编码。 在上一节,我们对特征 X 的 NaN 值进行了平均数插值处理。 我们打开 X,查看第一列特征,国家这一列: 发现这一列特征都是字符串,例如:法国、德国、韩国。 大部分机器学习模型,字符串类别特征是不能用来直接进行…

极简TS语法入门

@关于TypeScript 微软/大项目:诸位,都按我定义好的类型撸码,谁也别TM瞎搞!哥也没时间跟你们浪费口舌了,凡瞎**搞的让丫连编译都通不过!(内心:不把C++的一点基因伸到前端被窝去你们当我微软是真软啊…)各种装X大厂:收到!立马装起来!什么?研发成本?这个我们不考虑的…

LeetCode刷题复盘笔记—一文搞懂动态规划之5. 最长回文子串问题(动态规划系列第二十五篇)

今日主要总结一下动态规划的一道题目&#xff0c;5. 最长回文子串 题目&#xff1a;5. 最长回文子串 Leetcode题目地址 题目描述&#xff1a; 给你一个字符串 s&#xff0c;找到 s 中最长的回文子串。 如果字符串的反序与原始字符串相同&#xff0c;则该字符串称为回文字符串…

Java项目:SSM失物招领网站信息管理系统

作者主页&#xff1a;源码空间站2022 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 本项目为后台管理系统&#xff0c;分为管理员与用户两种角色&#xff1b; 管理员角色包含以下功能&#xff1a; 管理员登录,修改个人信息,用户…

零编程基础小白学习python应该看的python入门书籍

Python作为目前的大势&#xff0c;是很多人转行的首选&#xff0c;会python的人工资通常都比较高。Python在人工智能、大数据、自动化运维、全栈开发方面有着得天独厚的优势。随着Python继续占领编程语言主流的趋势&#xff0c;全国各城市的招聘职位和薪资均会大幅度上涨。另外…

使用java访问HDFS

文章目录利用Java编写程序访问HDFS1、创建Maven项目2、添加相关依赖3、创建日志属性文件4、启动集群HDFS服务5、在HDFS上创建文件利用Java编写程序访问HDFS 1、创建Maven项目 创建Maven项目 - HDFSDemo 单击【Create】按钮 2、添加相关依赖 在pom.xml文件里添加hadoop和…

【问答篇】Java 基础篇面试题(二)

每天进步一点~ 01、问&#xff1a;PreparedStatement与Statement的区别&#xff1f; 答&#xff1a; PreparedStatement是预编译语句执行者&#xff0c;数据库对sql语句进行预编译&#xff1b;Statement是执行时对sql语句进行编译 Statement存在sql注入的问题&#xff0c;Prep…

25.读写文件

到目前为止&#xff0c;我们讨论了如何处理数据&#xff0c; 以及如何构建、训练和测试深度学习模型。 然而&#xff0c;有时我们希望保存训练的模型&#xff0c; 以备将来在各种环境中使用&#xff08;比如在部署中进行预测&#xff09;。 此外&#xff0c;当运行一个耗时较…

English Learning - L1-3 从此没有不会的表达(上) 2022.12.12 周一

English Learning - L1-3 从此没有不会的表达&#xff08;上&#xff09; 2022.12.12 周一4 名词性从句名词性从句的类型4.1 各种从句的变身4.1.1 陈述句的变身一个严肃的问题&#xff1a;为什么要加 that ?那什么情况下&#xff0c;that 是可以省略的&#xff1f;特殊动词4.1…

Okhttp源码分析实践(三)【WebDemo的简单实现】

我们继续深入探索okhttp的知识点和面。本章,我们一起来实现一些简单的服务端Demo API,至于为什么,其实之前也说过,一方面是为了使我们之前所学的http的基础知识得到实践运用,另外一方面,是为了我们之后自己编写实现okhttp时,避免不了肯定要做很多API测试,免费的测试api…

vue3 provide与inject进行状态管理

vue3 provide与inject进行状态管理 一、数据仓库准备 在store–>新建index.js文件&#xff0c;作为仓库数据 状态集中管理数据实现响应式ref reactive—>对象中存储状态msg,age,counter import {reactive} from vue const store{//数据state:reactive({msg:"Hello …