bt_flatbuffer_helper.h
Go to the documentation of this file.
1 #ifndef BT_FLATBUFFER_HELPER_H
2 #define BT_FLATBUFFER_HELPER_H
3 
5 #include "BT_logger_generated.h"
6 
7 namespace BT
8 {
9 typedef std::array<uint8_t, 12> SerializedTransition;
10 
12 {
13  switch (type)
14  {
27  }
29 }
30 
32 {
33  switch (type)
34  {
43  }
45 }
46 
48 {
49  switch (direction)
50  {
57  }
59 }
60 
62  const BT::Tree& tree)
63 {
64  std::vector<flatbuffers::Offset<Serialization::TreeNode>> fb_nodes;
65 
66  applyRecursiveVisitor(tree.rootNode(), [&](BT::TreeNode* node) {
67  std::vector<uint16_t> children_uid;
68  if (auto control = dynamic_cast<BT::ControlNode*>(node))
69  {
70  children_uid.reserve(control->children().size());
71  for (const auto& child : control->children())
72  {
73  children_uid.push_back(child->UID());
74  }
75  }
76  else if (auto decorator = dynamic_cast<BT::DecoratorNode*>(node))
77  {
78  const auto& child = decorator->child();
79  children_uid.push_back(child->UID());
80  }
81 
82  std::vector<flatbuffers::Offset<Serialization::PortConfig>> ports;
83  for (const auto& it : node->config().input_ports)
84  {
85  ports.push_back(Serialization::CreatePortConfigDirect(builder, it.first.c_str(),
86  it.second.c_str()));
87  }
88  for (const auto& it : node->config().output_ports)
89  {
90  ports.push_back(Serialization::CreatePortConfigDirect(builder, it.first.c_str(),
91  it.second.c_str()));
92  }
93 
95  builder, node->UID(), builder.CreateVector(children_uid),
96  convertToFlatbuffers(node->status()), builder.CreateString(node->name().c_str()),
97  builder.CreateString(node->registrationName().c_str()),
98  builder.CreateVector(ports));
99 
100  fb_nodes.push_back(tn);
101  });
102 
103  std::vector<flatbuffers::Offset<Serialization::NodeModel>> node_models;
104 
105  for (const auto& node_it : tree.manifests)
106  {
107  const auto& manifest = node_it.second;
108  std::vector<flatbuffers::Offset<Serialization::PortModel>> port_models;
109 
110  for (const auto& port_it : manifest.ports)
111  {
112  const auto& port_name = port_it.first;
113  const auto& port = port_it.second;
114  auto port_model = Serialization::CreatePortModel(
115  builder, builder.CreateString(port_name.c_str()),
116  convertToFlatbuffers(port.direction()),
117  builder.CreateString(demangle(port.type()).c_str()),
118  builder.CreateString(port.description().c_str()));
119  port_models.push_back(port_model);
120  }
121 
122  auto node_model = Serialization::CreateNodeModel(
123  builder, builder.CreateString(manifest.registration_ID.c_str()),
124  convertToFlatbuffers(manifest.type), builder.CreateVector(port_models));
125 
126  node_models.push_back(node_model);
127  }
128 
129  auto behavior_tree = Serialization::CreateBehaviorTree(
130  builder, tree.rootNode()->UID(), builder.CreateVector(fb_nodes),
131  builder.CreateVector(node_models));
132 
133  builder.Finish(behavior_tree);
134 }
135 
139 inline SerializedTransition SerializeTransition(uint16_t UID, Duration timestamp,
140  NodeStatus prev_status, NodeStatus status)
141 {
142  using namespace std::chrono;
144  int64_t usec = duration_cast<microseconds>(timestamp).count();
145  int64_t t_sec = usec / 1000000;
146  int64_t t_usec = usec % 1000000;
147 
148  flatbuffers::WriteScalar(&buffer[0], t_sec);
149  flatbuffers::WriteScalar(&buffer[4], t_usec);
150  flatbuffers::WriteScalar(&buffer[8], UID);
151 
152  flatbuffers::WriteScalar(&buffer[10],
153  static_cast<int8_t>(convertToFlatbuffers(prev_status)));
154  flatbuffers::WriteScalar(&buffer[11],
155  static_cast<int8_t>(convertToFlatbuffers(status)));
156 
157  return buffer;
158 }
159 
160 } // namespace BT
161 
162 #endif // BT_FLATBUFFER_HELPER_H
BT
Definition: ex01_wrap_legacy.cpp:29
BT::demangle
std::string demangle(char const *name)
Definition: demangle_util.h:72
BT::PortDirection::INOUT
@ INOUT
BT::TreeNode::UID
uint16_t UID() const
Definition: tree_node.cpp:117
BT::NodeType
NodeType
Enumerates the possible types of nodes.
Definition: basic_types.h:22
BT::NodeType::DECORATOR
@ DECORATOR
flatbuffers::FlatBufferBuilder
Helper class to hold data needed in creation of a FlatBuffer. To serialize data, you typically call o...
Definition: flatbuffers.h:1442
BT::NodeType::CONDITION
@ CONDITION
Serialization::PortDirection::INPUT
@ INPUT
Serialization::NodeType
NodeType
Definition: BT_logger_generated.h:63
BT::TreeNode
Abstract base class for Behavior Tree Nodes.
Definition: tree_node.h:55
BT::Tree
Struct used to store a tree. If this object goes out of scope, the tree is destroyed.
Definition: bt_factory.h:125
BT::NodeType::SUBTREE
@ SUBTREE
BT::DecoratorNode
Definition: decorator_node.h:8
manifest
string manifest
bt_factory.h
BT::NodeConfiguration::input_ports
PortsRemapping input_ports
Definition: tree_node.h:50
Serialization::PortDirection
PortDirection
Definition: BT_logger_generated.h:98
BT::TreeNode::config
const NodeConfiguration & config() const
Definition: tree_node.cpp:127
BT::PortDirection::OUTPUT
@ OUTPUT
BT::NodeConfiguration::output_ports
PortsRemapping output_ports
Definition: tree_node.h:51
BT::SerializeTransition
SerializedTransition SerializeTransition(uint16_t UID, Duration timestamp, NodeStatus prev_status, NodeStatus status)
Definition: bt_flatbuffer_helper.h:139
BT::TreeNode::registrationName
const std::string & registrationName() const
registrationName is the ID used by BehaviorTreeFactory to create an instance.
Definition: tree_node.cpp:122
Serialization::NodeStatus
NodeStatus
Definition: BT_logger_generated.h:32
BT::PortDirection
PortDirection
Definition: basic_types.h:48
BT::SerializedTransition
std::array< uint8_t, 12 > SerializedTransition
Definition: bt_flatbuffer_helper.h:9
BT::TreeNode::status
NodeStatus status() const
Definition: tree_node.cpp:84
Serialization::NodeStatus::SUCCESS
@ SUCCESS
BT::NodeType::UNDEFINED
@ UNDEFINED
BT::NodeStatus::FAILURE
@ FAILURE
Serialization::CreateTreeNode
flatbuffers::Offset< TreeNode > CreateTreeNode(flatbuffers::FlatBufferBuilder &_fbb, uint16_t uid=0, flatbuffers::Offset< flatbuffers::Vector< uint16_t >> children_uid=0, Serialization::NodeStatus status=Serialization::NodeStatus::IDLE, flatbuffers::Offset< flatbuffers::String > instance_name=0, flatbuffers::Offset< flatbuffers::String > registration_name=0, flatbuffers::Offset< flatbuffers::Vector< flatbuffers::Offset< Serialization::PortConfig >>> port_remaps=0)
Definition: BT_logger_generated.h:459
BT::NodeType::ACTION
@ ACTION
minitrace::buffer
static raw_event_t * buffer
Definition: minitrace.cpp:54
BT::CreateFlatbuffersBehaviorTree
void CreateFlatbuffersBehaviorTree(flatbuffers::FlatBufferBuilder &builder, const BT::Tree &tree)
Definition: bt_flatbuffer_helper.h:61
BT::Duration
std::chrono::high_resolution_clock::duration Duration
Definition: basic_types.h:371
Serialization::NodeType::CONTROL
@ CONTROL
BT_logger_generated.h
Serialization::CreateBehaviorTree
flatbuffers::Offset< BehaviorTree > CreateBehaviorTree(flatbuffers::FlatBufferBuilder &_fbb, uint16_t root_uid=0, flatbuffers::Offset< flatbuffers::Vector< flatbuffers::Offset< Serialization::TreeNode >>> nodes=0, flatbuffers::Offset< flatbuffers::Vector< flatbuffers::Offset< Serialization::NodeModel >>> node_models=0)
Definition: BT_logger_generated.h:660
Serialization::PortDirection::INOUT
@ INOUT
Serialization::NodeType::SUBTREE
@ SUBTREE
BT::PortDirection::INPUT
@ INPUT
BT::applyRecursiveVisitor
void applyRecursiveVisitor(const TreeNode *root_node, const std::function< void(const TreeNode *)> &visitor)
Definition: behavior_tree.cpp:18
Serialization::NodeStatus::RUNNING
@ RUNNING
Serialization::NodeType::DECORATOR
@ DECORATOR
BT::TreeNode::name
const std::string & name() const
Name of the instance, not the type.
Definition: tree_node.cpp:101
BT::NodeStatus::SUCCESS
@ SUCCESS
BT::NodeStatus::RUNNING
@ RUNNING
Serialization::NodeType::UNDEFINED
@ UNDEFINED
Serialization::CreateNodeModel
flatbuffers::Offset< NodeModel > CreateNodeModel(flatbuffers::FlatBufferBuilder &_fbb, flatbuffers::Offset< flatbuffers::String > registration_name=0, Serialization::NodeType type=Serialization::NodeType::UNDEFINED, flatbuffers::Offset< flatbuffers::Vector< flatbuffers::Offset< Serialization::PortModel >>> ports=0)
Definition: BT_logger_generated.h:564
BT::NodeType::CONTROL
@ CONTROL
BT::convertToFlatbuffers
Serialization::PortDirection convertToFlatbuffers(BT::PortDirection direction)
Definition: bt_flatbuffer_helper.h:47
BT::Tree::rootNode
TreeNode * rootNode() const
Definition: bt_factory.h:181
BT::NodeStatus::IDLE
@ IDLE
Serialization::PortDirection::OUTPUT
@ OUTPUT
Serialization::NodeStatus::FAILURE
@ FAILURE
Serialization::NodeStatus::IDLE
@ IDLE
Serialization::NodeType::ACTION
@ ACTION
Serialization::NodeType::CONDITION
@ CONDITION
BT::NodeStatus
NodeStatus
Definition: basic_types.h:35
flatbuffers::FlatBufferBuilder::CreateVector
Offset< Vector< T > > CreateVector(const T *v, size_t len)
Serialize an array into a FlatBuffer vector.
Definition: flatbuffers.h:2097
flatbuffers::FlatBufferBuilder::CreateString
Offset< String > CreateString(const char *str, size_t len)
Store a string in the buffer, which can contain any binary data.
Definition: flatbuffers.h:1921
BT::convertToFlatbuffers
Serialization::NodeType convertToFlatbuffers(BT::NodeType type)
Definition: bt_flatbuffer_helper.h:11
Serialization::CreatePortModel
flatbuffers::Offset< PortModel > CreatePortModel(flatbuffers::FlatBufferBuilder &_fbb, flatbuffers::Offset< flatbuffers::String > port_name=0, Serialization::PortDirection direction=Serialization::PortDirection::INPUT, flatbuffers::Offset< flatbuffers::String > type_info=0, flatbuffers::Offset< flatbuffers::String > description=0)
Definition: BT_logger_generated.h:261


behaviortree_cpp_v3
Author(s): Michele Colledanchise, Davide Faconti
autogenerated on Wed Jun 26 2024 02:51:19