Behaviortree.cpp4.5配置笔记

系统: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查看的日志文件

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值