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

根据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。用户可以根据自己项目需要来选择使用哪个版本。

© 版权声明
THE END
喜欢就支持一下吧
点赞273 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容