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