AutoAPMS
Streamlining behaviors in ROS 2
Loading...
Searching...
No Matches
tree_document.hpp
1// Copyright 2024 Robin Müller
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15#pragma once
16
17#include <tinyxml2.h>
18
19#include <functional>
20#include <iterator>
21#include <set>
22#include <string>
23#include <type_traits>
24#include <vector>
25
26#include "auto_apms_behavior_tree_core/definitions.hpp"
27#include "auto_apms_behavior_tree_core/node/node_manifest.hpp"
28#include "auto_apms_behavior_tree_core/node/node_registration_loader.hpp"
29#include "auto_apms_behavior_tree_core/node/node_registration_options.hpp"
30#include "auto_apms_behavior_tree_core/tree/script.hpp"
31#include "behaviortree_cpp/bt_factory.h"
32#include "behaviortree_cpp/tree_node.h"
33#include "rclcpp/rclcpp.hpp"
34
36{
37class SubTree;
38}
39
41{
42
43class TreeResource;
44class NodeModelType;
45
140class TreeDocument : private tinyxml2::XMLDocument
141{
142 using XMLElement = tinyxml2::XMLElement;
143
144 inline static const std::string LOGGER_NAME = "tree_document";
145
146public:
147 static inline const char BTCPP_FORMAT_ATTRIBUTE_NAME[] = "BTCPP_format";
148 static inline const char BTCPP_FORMAT_DEFAULT_VERSION[] = "4";
149 static inline const char ROOT_ELEMENT_NAME[] = "root";
150 static inline const char ROOT_TREE_ATTRIBUTE_NAME[] = "main_tree_to_execute";
151 static inline const char TREE_ELEMENT_NAME[] = "BehaviorTree";
152 static inline const char SUBTREE_ELEMENT_NAME[] = "SubTree";
153 static inline const char TREE_NAME_ATTRIBUTE_NAME[] = "ID";
154 static inline const char TREE_NODE_MODEL_ELEMENT_NAME[] = "TreeNodesModel";
155 static inline const char NODE_INSTANCE_NAME_ATTRIBUTE_NAME[] = "name";
156 static inline const char INCLUDE_ELEMENT_NAME[] = "include";
157 static inline const char INCLUDE_PATH_ATTRIBUTE_NAME[] = "path";
158 static inline const char INCLUDE_ROS_PKG_ATTRIBUTE_NAME[] = "ros_pkg";
159
160 class TreeElement;
161
175 {
176 public:
178 using PortValues = std::map<std::string, std::string>;
180 using DeepApplyCallback = std::function<bool(NodeElement &)>;
182 using ConstDeepApplyCallback = std::function<bool(const NodeElement &)>;
183
184 protected:
190 explicit NodeElement(TreeDocument * doc_ptr, XMLElement * ele_ptr);
191
192 public:
197 NodeElement(const NodeElement & ele) = default;
198
210 NodeElement & operator=(const NodeElement & other);
211
220 bool operator==(const NodeElement & other) const;
221
222 bool operator!=(const NodeElement & other) const;
223
238 NodeElement insertNode(const std::string & name, const NodeElement * before_this = nullptr);
239
254 const std::string & name, const NodeRegistrationOptions & registration_options,
255 const NodeElement * before_this = nullptr);
256
270 template <class T>
271 typename std::enable_if_t<std::is_base_of_v<NodeModelType, T> && !std::is_same_v<model::SubTree, T>, T> insertNode(
272 const NodeElement * before_this = nullptr);
273
289 template <class SubTreeT>
290 typename std::enable_if_t<std::is_same_v<model::SubTree, SubTreeT>, model::SubTree> insertNode(
291 const std::string & tree_name, const NodeElement * before_this = nullptr);
292
311 template <class SubTreeT>
312 typename std::enable_if_t<std::is_same_v<model::SubTree, SubTreeT>, model::SubTree> insertNode(
313 const TreeElement & tree, const NodeElement * before_this = nullptr);
314
327 model::SubTree insertSubTreeNode(const std::string & tree_name, const NodeElement * before_this = nullptr);
328
344 model::SubTree insertSubTreeNode(const TreeElement & tree, const NodeElement * before_this = nullptr);
345
366 const TreeElement & tree, const NodeElement * before_this = nullptr, bool auto_register_nodes = true);
367
390 const TreeDocument & doc, const std::string & tree_name, const NodeElement * before_this = nullptr,
391 bool auto_register_nodes = true);
392
416 const TreeDocument & doc, const NodeElement * before_this = nullptr, bool auto_register_nodes = true);
417
438 const std::string & tree_str, const std::string & tree_name, const NodeElement * before_this = nullptr);
439
459 NodeElement insertTreeFromString(const std::string & tree_str, const NodeElement * before_this = nullptr);
460
481 const std::string & path, const std::string & tree_name, const NodeElement * before_this = nullptr);
482
502 NodeElement insertTreeFromFile(const std::string & path, const NodeElement * before_this = nullptr);
503
534 const TreeResource & resource, const std::string & tree_name, const NodeElement * before_this = nullptr,
535 bool auto_register_nodes = true);
536
568 const TreeResource & resource, const NodeElement * before_this = nullptr, bool auto_register_nodes = true);
569
574 bool hasChildren() const;
575
576 // clang-format off
598 const std::string & registration_name = "", const std::string & instance_name = "",
599 bool deep_search = false) const;
600
601 // clang-format off
623 template <class T>
624 typename std::enable_if_t<std::is_base_of_v<NodeModelType, T>, T> getFirstNode(
625 const std::string & instance_name = "", bool deep_search = false) const;
626
627 // clang-format off
649 const std::string & registration_name = "", const std::string & instance_name = "",
650 bool deep_search = false);
651
652 // clang-format off
674 template <class T>
675 typename std::enable_if_t<std::is_base_of_v<NodeModelType, T>, NodeElement &> removeFirstChild(
676 const std::string & instance_name = "", bool deep_search = false);
677 // clang-format on
678
684
693 const std::vector<std::string> & getPortNames() const;
694
706 PortValues getPorts() const;
707
721 NodeElement & setPorts(const PortValues & port_values);
722
731
742 NodeElement & setConditionalScript(BT::PreCond type, const Script & script);
743
750 NodeElement & setConditionalScript(BT::PostCond type, const Script & script);
751
757 virtual NodeElement & setName(const std::string & instance_name);
758
763 virtual std::string getRegistrationName() const;
764
769 virtual std::string getName() const;
770
775 std::string getFullyQualifiedName() const;
776
785 const TreeDocument & getParentDocument() const;
786
794 XMLElement * getXMLElement();
795
813 const std::vector<NodeElement> deepApplyConst(ConstDeepApplyCallback apply_callback) const;
814
830 std::vector<NodeElement> deepApply(DeepApplyCallback apply_callback);
831
839 {
840 friend class NodeElement;
841
842 public:
843 using iterator_category = std::forward_iterator_tag;
844 using value_type = NodeElement;
845 using difference_type = std::ptrdiff_t;
846 using pointer = value_type *;
847 using reference = value_type;
848
851
853 value_type operator*() const;
854
857
860
861 bool operator==(const ChildIterator & other) const;
862 bool operator!=(const ChildIterator & other) const;
863
864 private:
865 ChildIterator(TreeDocument * doc_ptr, tinyxml2::XMLElement * current);
866
867 TreeDocument * doc_ptr_;
868 tinyxml2::XMLElement * current_;
869 };
870
875 ChildIterator begin() const;
876
881 ChildIterator end() const;
882
883 private:
884 NodeElement insertBeforeImpl(const NodeElement * before_this, XMLElement * add_this);
885
886 static void deepApplyImpl(
887 const NodeElement & parent, ConstDeepApplyCallback apply_callback, std::vector<NodeElement> & vec);
888
889 static void deepApplyImpl(NodeElement & parent, DeepApplyCallback apply_callback, std::vector<NodeElement> & vec);
890
891 protected:
895 tinyxml2::XMLElement * ele_ptr_;
896
897 private:
898 std::vector<std::string> port_names_;
899 PortValues port_default_values_;
900 };
901
911 {
912 friend class TreeDocument;
913
914 protected:
920 explicit TreeElement(TreeDocument * doc_ptr, XMLElement * ele_ptr);
921
922 public:
927 TreeElement(const TreeElement & ele) = default;
928
938 TreeElement & operator=(const TreeElement & other);
939
945 TreeElement & setName(const std::string & tree_name) override;
946
951 std::string getName() const override;
952
961
973
979 BT::Result verify() const;
980
991 std::string writeToString(bool remove_whitespace = false) const;
992
998 const std::string & registration_name = "", const std::string & instance_name = "", bool deep_search = false);
999
1004 template <class T>
1005 typename std::enable_if_t<std::is_base_of_v<NodeModelType, T>, TreeElement &> removeFirstChild(
1006 const std::string & instance_name = "", bool deep_search = false);
1007
1013
1014 /* Not supported methods for TreeElement instances */
1015
1016 const std::vector<std::string> & getPortNames() = delete;
1017 PortValues getPorts() = delete;
1018 NodeElement & setPorts() = delete;
1019 NodeElement & resetPorts() = delete;
1020 NodeElement & setConditionalScript() = delete;
1021 };
1022
1034 const std::string & format_version = BTCPP_FORMAT_DEFAULT_VERSION,
1035 NodeRegistrationLoader::SharedPtr tree_node_loader = NodeRegistrationLoader::make_shared());
1036
1037 TreeDocument(const TreeDocument & other) = delete;
1038
1039 virtual ~TreeDocument() = default;
1040
1064 TreeDocument & mergeTreeDocument(const XMLDocument & other, bool adopt_root_tree = false);
1065
1090 const TreeDocument & other, bool adopt_root_tree = false, bool auto_register_nodes = true);
1091
1115 TreeDocument & mergeString(const std::string & tree_str, bool adopt_root_tree = false);
1116
1141 TreeDocument & mergeFile(const std::string & path, bool adopt_root_tree = false);
1142
1173 const TreeResource & resource, bool adopt_root_tree = false, bool auto_register_nodes = true);
1174
1195 TreeDocument & mergeTree(const TreeElement & tree, bool make_root_tree = false, bool auto_register_nodes = true);
1196
1204 TreeElement newTree(const std::string & tree_name);
1205
1223 TreeElement newTree(const TreeElement & other, bool auto_register_nodes = true);
1224
1247 const TreeDocument & other, const std::string & tree_name = "", bool auto_register_nodes = true);
1248
1266 TreeElement newTreeFromString(const std::string & tree_str, const std::string & tree_name = "");
1267
1285 TreeElement newTreeFromFile(const std::string & path, const std::string & tree_name = "");
1286
1315 const TreeResource & resource, const std::string & tree_name = "", bool auto_register_nodes = true);
1316
1322 bool hasTreeName(const std::string & tree_name) const;
1323
1331 TreeElement getTree(const std::string & tree_name);
1332
1340 TreeDocument & setRootTreeName(const std::string & tree_name);
1341
1346 bool hasRootTreeName() const;
1347
1354 std::string getRootTreeName() const;
1355
1363
1377 TreeDocument & removeTree(const std::string & tree_name);
1378
1391 TreeDocument & removeTree(const TreeElement & tree);
1392
1397 std::vector<std::string> getAllTreeNames() const;
1398
1411 const std::string & node_namespace,
1412 const std::string & sep = _AUTO_APMS_BEHAVIOR_TREE_CORE__NODE_NAMESPACE_DEFAULT_SEP);
1413
1426 virtual TreeDocument & registerNodes(const NodeManifest & tree_node_manifest, bool override = false);
1427
1434 std::set<std::string> getRegisteredNodeNames(bool include_native = true) const;
1435
1448 NodeManifest getRequiredNodeManifest(const std::string & tree_name = "") const;
1449
1458
1466 static NodeModelMap getNodeModel(tinyxml2::XMLDocument & doc, const NodeManifest & manifest);
1467
1477 NodeModelMap getNodeModel(bool include_native = false) const;
1478
1484 BT::Result verify() const;
1485
1493 std::string writeToString(bool remove_whitespace = false) const;
1494
1503 void writeToFile(const std::string & path, bool remove_whitespace = false) const;
1504
1511 TreeDocument & reset(bool unregister_nodes = true);
1512
1513private:
1514 template <typename ReturnT, typename DocumentT>
1515 static ReturnT getXMLElementForTreeWithNameImpl(DocumentT & doc, const std::string & tree_name);
1516
1517 const XMLElement * getXMLElementForTreeWithName(const std::string & tree_name) const;
1518
1519 XMLElement * getXMLElementForTreeWithName(const std::string & tree_name);
1520
1528 TreeDocument & mergeFileImpl(const std::string & path, bool adopt_root_tree, std::set<std::string> & include_stack);
1529
1537 TreeDocument & mergeTreeDocumentImpl(
1538 const XMLDocument & other, bool adopt_root_tree, std::set<std::string> & include_stack);
1539
1540 const std::map<std::string, std::string> all_node_classes_package_map_;
1541 const std::set<std::string> native_node_names_;
1542 std::string format_version_;
1543 NodeRegistrationLoader::SharedPtr tree_node_loader_ptr_;
1544
1545protected:
1546 NodeManifest registered_nodes_manifest_;
1547 BT::BehaviorTreeFactory factory_;
1548 rclcpp::Logger logger_;
1549 rclcpp::Node::WeakPtr ros_node_wptr_;
1550 rclcpp::CallbackGroup::WeakPtr tree_node_waitables_callback_group_wptr_;
1551 rclcpp::executors::SingleThreadedExecutor::WeakPtr tree_node_waitables_executor_wptr_;
1552 bool only_non_ros_nodes_ = false;
1553};
1554
1555// #####################################################################################################################
1556// ################################ DEFINITIONS ##############################################
1557// #####################################################################################################################
1558
1560template <typename T, typename = void>
1561struct has_static_method_registrationOptions : std::false_type
1562{
1563};
1564
1565template <typename T>
1566struct has_static_method_registrationOptions<
1567 T, typename std::enable_if_t<std::is_same_v<decltype(T::registrationOptions()), NodeRegistrationOptions>>>
1568: std::true_type
1569{
1570};
1572
1573template <class T>
1574inline typename std::enable_if_t<std::is_base_of_v<NodeModelType, T> && !std::is_same_v<model::SubTree, T>, T>
1576{
1577 // Determine if overload for automatically trying to register the node can be used. Models for native nodes don't
1578 // implement the required static method, thus the other overload must be used.
1579 if constexpr (has_static_method_registrationOptions<T>::value) {
1580 NodeElement ele = insertNode(T::name(), T::registrationOptions(), before_this);
1581 return T(ele.doc_ptr_, ele.ele_ptr_);
1582 } else {
1583 NodeElement ele = insertNode(T::name(), before_this);
1584 return T(ele.doc_ptr_, ele.ele_ptr_);
1585 }
1586}
1587
1588template <class T>
1589inline typename std::enable_if_t<std::is_same_v<model::SubTree, T>, model::SubTree>
1590TreeDocument::NodeElement::insertNode(const std::string & tree_name, const NodeElement * before_this)
1591{
1592 return insertSubTreeNode(tree_name, before_this);
1593}
1594
1595template <class T>
1596inline typename std::enable_if_t<std::is_same_v<model::SubTree, T>, model::SubTree>
1597TreeDocument::NodeElement::insertNode(const TreeElement & tree, const NodeElement * before_this)
1598{
1599 return insertSubTreeNode(tree, before_this);
1600}
1601
1602template <class T>
1603inline typename std::enable_if_t<std::is_base_of_v<NodeModelType, T>, T> core::TreeDocument::NodeElement::getFirstNode(
1604 const std::string & instance_name, bool deep_search) const
1605{
1606 const NodeElement ele = getFirstNode(T::name(), instance_name, deep_search);
1607 return T(ele.doc_ptr_, ele.ele_ptr_);
1608}
1609
1610template <class T>
1611inline typename std::enable_if_t<std::is_base_of_v<NodeModelType, T>, TreeDocument::NodeElement &>
1612core::TreeDocument::NodeElement::removeFirstChild(const std::string & instance_name, bool deep_search)
1613{
1614 return removeFirstChild(T::name(), instance_name, deep_search);
1615}
1616
1617template <class T>
1618inline typename std::enable_if_t<std::is_base_of_v<NodeModelType, T>, TreeDocument::TreeElement &>
1619TreeDocument::TreeElement::removeFirstChild(const std::string & instance_name, bool deep_search)
1620{
1621 NodeElement::removeFirstChild<T>(instance_name, deep_search);
1622 return *this;
1623}
1624
1625} // namespace auto_apms_behavior_tree::core
1626
1627// Include after TreeDocument is fully defined to provide complete type for model::SubTree
1628// which is forward declared above but used as return type in insertSubTreeNode methods.
1629#include "auto_apms_behavior_tree_core/node/node_model_type.hpp"
Data structure for information about which behavior tree node plugin to load and how to configure the...
Abstract base for all automatically generated behavior tree node model classes to be used in interact...
Class that encapsulates behavior tree script expressions.
Definition script.hpp:30
Forward iterator for traversing the first-level children of a node.
ChildIterator & operator++()
Pre-increment: advance to the next sibling element.
value_type operator*() const
Dereference the iterator to obtain a NodeElement handle for the current child.
Handle for a single node of a TreeDocument.
std::enable_if_t< std::is_base_of_v< NodeModelType, T >, T > getFirstNode(const std::string &instance_name="", bool deep_search=false) const
Get the first node with a particular instance name.
const TreeDocument & getParentDocument() const
Get a const view of this node's parent tree document.
const std::vector< std::string > & getPortNames() const
Get the names of the data ports implemented by the node represented by this element.
virtual std::string getRegistrationName() const
Get the name of this node given during registration representing its dynamic type.
XMLElement * getXMLElement()
Get a pointer to the underlying tinyxml2::XMLElement of this node.
std::function< bool(const NodeElement &)> ConstDeepApplyCallback
Callback invoked for every node found under another node. It cannot modify the current node.
NodeElement & resetPorts()
Delete all currently specified port values and reset with the defaults.
NodeElement(const NodeElement &ele)=default
Copy constructor for a node element.
std::function< bool(NodeElement &)> DeepApplyCallback
Callback invoked for every node found under another node. It may modify the current node.
NodeElement & setPorts(const PortValues &port_values)
Populate the the node's data ports.
std::enable_if_t< std::is_same_v< model::SubTree, SubTreeT >, model::SubTree > insertNode(const TreeElement &tree, const NodeElement *before_this=nullptr)
Add a subtree node for a specific tree element to the children of this node.
virtual NodeElement & setName(const std::string &instance_name)
Assign a name for this specific node instance.
NodeElement insertTreeFromResource(const TreeResource &resource, const std::string &tree_name, const NodeElement *before_this=nullptr, bool auto_register_nodes=true)
Concatenate a tree from one of the installed package's behavior tree resources and add its first chil...
NodeElement(TreeDocument *doc_ptr, XMLElement *ele_ptr)
Protected constructor intended for internal use only.
NodeElement insertTreeFromDocument(const TreeDocument &doc, const std::string &tree_name, const NodeElement *before_this=nullptr, bool auto_register_nodes=true)
Concatenate a tree from a document and add its first child node to the children of this node.
std::map< std::string, std::string > PortValues
Mapping of port names and its respective value encoded as string.
const std::vector< NodeElement > deepApplyConst(ConstDeepApplyCallback apply_callback) const
Recursively apply a callback to this node's children.
TreeDocument * doc_ptr_
Pointer to the tree document that created the tree this node belongs to.
ChildIterator end() const
Get a past-the-end iterator for the children of this node.
virtual std::string getName() const
Get the name of this node given to this specific instance by the developer.
PortValues getPorts() const
Assemble the values given to each data port implemented by this node.
NodeElement & setConditionalScript(BT::PreCond type, const Script &script)
Specify a script that is evaluated before this node is ticked.
NodeElement insertTreeFromString(const std::string &tree_str, const std::string &tree_name, const NodeElement *before_this=nullptr)
Concatenate a tree from a document created from a string and add its first child node to the children...
std::enable_if_t< std::is_base_of_v< NodeModelType, T >, NodeElement & > removeFirstChild(const std::string &instance_name="", bool deep_search=false)
Remove the first node with a particular instance name.
tinyxml2::XMLElement * ele_ptr_
Pointer to the corresponding XMLElement of the base document.
std::string getFullyQualifiedName() const
Create a string that uniquely identifies this node considering its registration and its instance name...
model::SubTree insertSubTreeNode(const std::string &tree_name, const NodeElement *before_this=nullptr)
Add a subtree node for a specific tree element to the children of this node.
bool hasChildren() const
Determine whether any children have been given to this node.
NodeElement insertTree(const TreeElement &tree, const NodeElement *before_this=nullptr, bool auto_register_nodes=true)
Concatenate a tree and add its first child node to the children of this node.
std::enable_if_t< std::is_same_v< model::SubTree, SubTreeT >, model::SubTree > insertNode(const std::string &tree_name, const NodeElement *before_this=nullptr)
Add a subtree node for a specific tree element to the children of this node.
bool operator==(const NodeElement &other) const
Determine if two node elements refer to the same node.
NodeElement getFirstNode(const std::string &registration_name="", const std::string &instance_name="", bool deep_search=false) const
Get the first node with a particular registration and instance name.
ChildIterator begin() const
Get an iterator to the first child of this node.
NodeElement insertNode(const std::string &name, const NodeElement *before_this=nullptr)
Add a new node to the children of this node.
NodeElement & removeFirstChild(const std::string &registration_name="", const std::string &instance_name="", bool deep_search=false)
Remove the first node with a particular registration and instance name.
NodeElement insertTreeFromFile(const std::string &path, const std::string &tree_name, const NodeElement *before_this=nullptr)
Concatenate a tree from a document created from a file and add its first child node to the children o...
NodeElement & removeChildren()
Recursively remove all children of this node element.
NodeElement & operator=(const NodeElement &other)
Replace this node with another.
std::vector< NodeElement > deepApply(DeepApplyCallback apply_callback)
Recursively apply a callback to this node's children.
Handle for a single behavior tree of a TreeDocument.
TreeElement & removeFirstChild(const std::string &registration_name="", const std::string &instance_name="", bool deep_search=false)
TreeElement(TreeDocument *doc_ptr, XMLElement *ele_ptr)
Protected constructor intended to be used only by certain factory methods of TreeDocument.
std::string getName() const override
Get the name of the behavior tree.
std::string writeToString(bool remove_whitespace=false) const
Write this behavior tree to an XML encoded in a string.
BT::Result verify() const
Verify that this behavior tree is structured correctly and can be created successfully.
NodeManifest getRequiredNodeManifest() const
Assemble the node manifest that is required for successfully creating an instance of this tree.
TreeElement & makeRoot()
Set this behavior tree as the root tree of the parent document.
TreeElement & operator=(const TreeElement &other)
Replace the behavior tree represented by this element with another.
TreeElement & setName(const std::string &tree_name) override
Set the name of the behavior tree.
TreeElement(const TreeElement &ele)=default
Copy constructor for a tree element.
std::enable_if_t< std::is_base_of_v< NodeModelType, T >, TreeElement & > removeFirstChild(const std::string &instance_name="", bool deep_search=false)
TreeElement getRootTree()
Get the corresponding behavior tree element for the root tree of this document.
std::string getRootTreeName() const
Get the name of this document's root tree.
TreeDocument & mergeTreeDocument(const XMLDocument &other, bool adopt_root_tree=false)
Merge another tree document with this one.
TreeDocument & mergeString(const std::string &tree_str, bool adopt_root_tree=false)
Create a tree document from a string and merge it with this one.
TreeElement newTreeFromFile(const std::string &path, const std::string &tree_name="")
Create a new behavior tree inside this document with the content of one found inside the XML file.
TreeDocument & applyNodeNamespace(const std::string &node_namespace, const std::string &sep=_AUTO_APMS_BEHAVIOR_TREE_CORE__NODE_NAMESPACE_DEFAULT_SEP)
Prepend a namespace to all nodes associated with this document.
std::string writeToString(bool remove_whitespace=false) const
Write the XML of this tree document to a string.
BT::Result verify() const
Verify that all behavior trees of this document are structured correctly and can be created successfu...
std::set< std::string > getRegisteredNodeNames(bool include_native=true) const
Get the names of all nodes that are known to this document.
TreeDocument & mergeResource(const TreeResource &resource, bool adopt_root_tree=false, bool auto_register_nodes=true)
Merge the behavior trees from one of the installed package's behavior tree resources.
TreeDocument & reset(bool unregister_nodes=true)
Clear this document and reset it to its initial state.
TreeElement newTreeFromString(const std::string &tree_str, const std::string &tree_name="")
Create a new behavior tree inside this document with the content of one found inside the XML string.
void writeToFile(const std::string &path, bool remove_whitespace=false) const
Write the XML of this tree document to a file.
TreeElement newTreeFromDocument(const TreeDocument &other, const std::string &tree_name="", bool auto_register_nodes=true)
Create a new behavior tree inside this document with the content of one found inside another tree doc...
TreeElement getTree(const std::string &tree_name)
Get the corresponding behavior tree element for a tree inside this document.
virtual TreeDocument & registerNodes(const NodeManifest &tree_node_manifest, bool override=false)
Load behavior tree node plugins and register them with the internal behavior tree factory.
TreeDocument & setRootTreeName(const std::string &tree_name)
Define the root tree of this document.
bool hasTreeName(const std::string &tree_name) const
Determine if this document contains a behavior tree with a particular name.
TreeDocument & mergeFile(const std::string &path, bool adopt_root_tree=false)
Create a tree document from a file and merge it with this one.
NodeManifest getRequiredNodeManifest(const std::string &tree_name="") const
Assemble the node manifest that is required for successfully creating an instance of any of the docum...
std::vector< std::string > getAllTreeNames() const
Get the names of all behavior trees inside this document.
TreeDocument & addNodeModel(NodeModelMap model_map)
Add a behavior tree node model element to the document by parsing the contents of model_map.
TreeElement newTreeFromResource(const TreeResource &resource, const std::string &tree_name="", bool auto_register_nodes=true)
Create a new behavior tree inside this document with the content of one the trees found inside a part...
TreeDocument & mergeTree(const TreeElement &tree, bool make_root_tree=false, bool auto_register_nodes=true)
Merge an existing behavior tree with this tree document.
bool hasRootTreeName() const
Determine if this document specifies which of its trees is the root tree.
TreeDocument & removeTree(const std::string &tree_name)
Remove a particular behavior tree from this document.
TreeDocument(const std::string &format_version=BTCPP_FORMAT_DEFAULT_VERSION, NodeRegistrationLoader::SharedPtr tree_node_loader=NodeRegistrationLoader::make_shared())
Create a an empty tree document.
static NodeModelMap getNodeModel(tinyxml2::XMLDocument &doc, const NodeManifest &manifest)
Convert a behavior tree node model document to the corresponding data structure.
TreeElement newTree(const std::string &tree_name)
Create a new behavior tree inside this document.
Class containing behavior tree resource data.
Subtree behavior tree node model.
Core API for AutoAPMS's behavior tree implementation.
Definition behavior.hpp:32
Models for all available behavior tree nodes.
std::map< std::string, NodeModel > NodeModelMap
Mapping of node registration names and their implementation details.
Parameters for loading and registering a behavior tree node class from a shared library using e....