系统:ubuntu 22.04.3 LTS(在ubuntu18.04上只是无法与Groot2连接,但不影响Behaviortree.cpp的使用)
我的c++环境:cmake version 3.23.0、gcc/g++ version 11.4.0(g++版本过低无法正常编译,请升级你的g++版本)
1、拉取Behaviortree.cpp(官方链接点这里)
git clone https://github.com/BehaviorTree/BehaviorTree.CPP.git
2、下载所需依赖(缺少什么就下载什么)
sudo apt-get update
sudo apt-get sqlite3
sudo apt-get install libzmq3-dev libboost-dev
sudo apt-get install libboost-coroutine-dev # 需要用到协程
3、编译项目
cd BehaviorTree.cpp
mkdir build;cd build
cmake ..
4、构建软件项目
make
5、用管理员权限将编译好的软件安装到系统中的标准位置
sudo make install
Behaviortree.cpp下载完毕,后续就可以使用它来写自己的行为树工程
与Groot2连接(这个只是可以可视化bt的tick行为,并不影响bt)
1、安装依赖
sudo apt-get install qtbase5-dev libqt5svg5-dev libzmq3-dev libdw-dev
2、下载Groot2(官网链接点这里)
备注:在main里想要连接到Groot2进行可视化需要加以下代码
#include "behaviortree_cpp/loggers/groot2_publisher.h"
#include "behaviortree_cpp/loggers/bt_file_logger_v2.h"
#include "behaviortree_cpp/loggers/bt_sqlite_logger.h"
#include "behaviortree_cpp/loggers/bt_cout_logger.h"
int main(){
...
BT::StdCoutLogger cout_logger(tree);
#Connecting a tree to Groot2
BT::Groot2Publisher publisher(tree);
#保存BT的日志文件
BT::FileLogger2 file_logger(tree, "./xxx.btlog");
BT::SqliteLogger sqlite_logger(tree, "./xxx.db3");
...
return 0;
}
可以运行的时候查看tick过程(端口号要设置:1667),也可以后续直接打开btlog或db3查看tick过程
附上一个简单的例子:
simple_bt.cpp
#include <iostream>
#include <chrono>
#include "behaviortree_cpp/action_node.h"
#include "behaviortree_cpp/xml_parsing.h"
#include "behaviortree_cpp/bt_factory.h"
#include "behaviortree_cpp/loggers/groot2_publisher.h"
#include "behaviortree_cpp/loggers/bt_file_logger_v2.h"
#include "behaviortree_cpp/loggers/bt_sqlite_logger.h"
#include "behaviortree_cpp/loggers/bt_cout_logger.h"
using namespace std::chrono_literals;
class ApproachObject : public BT::SyncActionNode
{
public:
explicit ApproachObject(const std::string &name) : BT::SyncActionNode(name, {})
{
}
BT::NodeStatus tick() override
{
std::this_thread::sleep_for(2s);
std::cout << "Approach Object: " << this->name() << std::endl;
std::this_thread::sleep_for(2s);
return BT::NodeStatus::FAILURE;
}
};
BT::NodeStatus CheckBattery()
{
std::this_thread::sleep_for(2s);
std::cout << "Battery OK" << std::endl;
std::this_thread::sleep_for(2s);
return BT::NodeStatus::SUCCESS;
}
class GripperInterface
{
public:
GripperInterface() : _open(true) {}
BT::NodeStatus open()
{
_open = true;
std::this_thread::sleep_for(2s);
std::cout << "Gripper open" << std::endl;
std::this_thread::sleep_for(2s);
return BT::NodeStatus::SUCCESS;
}
BT::NodeStatus close()
{
_open = false;
std::this_thread::sleep_for(2s);
std::cout << "Gripper close" << std::endl;
std::this_thread::sleep_for(2s);
return BT::NodeStatus::SUCCESS;
}
private:
bool _open;
};
#include "behaviortree_cpp/loggers/bt_sqlite_logger.h"
int main()
{
BT::BehaviorTreeFactory factory;
factory.registerNodeType<ApproachObject>("ApproachObject");
factory.registerSimpleCondition("检查电池", std::bind(CheckBattery));
GripperInterface gripper;
factory.registerSimpleAction(
"打开抓手",
std::bind(&GripperInterface::open, &gripper));
factory.registerSimpleAction(
"CloseGripper",
std::bind(&GripperInterface::close, &gripper));
//Create Tree
auto tree = factory.createTreeFromFile("./../bt_tree.xml");
//save XML file
//std::string xml_models = BT::writeTreeNodesModelXML(factory);
BT::StdCoutLogger cout_logger(tree);
//connect the Groot2Publisher
BT::Groot2Publisher publisher(tree);
BT::FileLogger2 file_logger(tree, "./bt_trce.btlog");
BT::SqliteLogger sqlite_logger(tree, "./generated_log.db3");
// helper function to print the tree
BT::printTreeRecursively(tree.rootNode());
// //execute the tree
// tree.tickWhileRunning();
std::cout << "\nTree will run indefinitively. Press CTRL-C to stop\n";
// while(true) {
// std::this_thread::sleep_for(0.1s);
// tree.tickWhileRunning();
// }
// std::this_thread::sleep_for(0.1s);
tree.tickWhileRunning();
return 0;
}
CMakeList.txt
cmake_minimum_required(VERSION 3.10.2)
project(simple_bt)
set(CMAKE_CXX_SaTANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
find_package(behaviortree_cpp)
add_executable(${PROJECT_NAME} "simple_bt.cpp")
target_link_libraries(${PROJECT_NAME} BT::behaviortree_cpp)
bt_tree.xml
<root BTCPP_format="4" >
<BehaviorTree ID="MainTree">
<Sequence name="root_sequence">
<检查电池 name="电池充满"/>
<打开抓手 name="open_gripper"/>
<ApproachObject name="approach_object"/>
<CloseGripper name="close_gripper"/>
</Sequence>
</BehaviorTree>
</root>
编译该项目,就可以得到
btlog和db3文件就是可以用Groot2查看的日志文件