16 #include "nav2_behavior_tree/behavior_tree_engine.hpp"
23 #include "rclcpp/rclcpp.hpp"
24 #include "behaviortree_cpp/json_export.h"
25 #include "behaviortree_cpp/utils/shared_library.h"
26 #include "nav2_behavior_tree/json_utils.hpp"
27 #include "nav2_behavior_tree/utils/loop_rate.hpp"
29 namespace nav2_behavior_tree
33 const std::vector<std::string> & plugin_libraries,
34 const nav2::LifecycleNode::SharedPtr node)
36 BT::SharedLibrary loader;
37 for (
const auto & p : plugin_libraries) {
38 factory_.registerFromPlugin(loader.getOSName(p));
42 clock_ = node->get_clock();
46 BT::ReactiveSequence::EnableException(
false);
47 BT::ReactiveFallback::EnableException(
false);
53 std::function<
void()> onLoop,
54 std::function<
bool()> cancelRequested,
55 std::chrono::milliseconds loopTimeout)
58 BT::NodeStatus result = BT::NodeStatus::RUNNING;
62 while (rclcpp::ok() && result == BT::NodeStatus::RUNNING) {
63 if (cancelRequested()) {
65 return BtStatus::CANCELED;
68 result = tree->tickOnce();
72 if (!loopRate.sleep()) {
73 RCLCPP_DEBUG_THROTTLE(
74 rclcpp::get_logger(
"BehaviorTreeEngine"),
76 "Behavior Tree tick rate %0.2f was exceeded!",
77 1.0 / (loopRate.period().count() * 1.0e-9));
80 }
catch (
const std::exception & ex) {
82 rclcpp::get_logger(
"BehaviorTreeEngine"),
83 "Behavior tree threw exception: %s. Exiting with failure.", ex.what());
84 return BtStatus::FAILED;
87 return (result == BT::NodeStatus::SUCCESS) ? BtStatus::SUCCEEDED : BtStatus::FAILED;
92 const std::string & xml_string,
93 BT::Blackboard::Ptr blackboard)
95 return factory_.createTreeFromText(xml_string, blackboard);
100 const std::string & file_path,
101 BT::Blackboard::Ptr blackboard)
103 return factory_.createTreeFromFile(file_path, blackboard);
107 const std::string & bt_file)
109 if(bt_file.empty()) {
110 RCLCPP_ERROR(rclcpp::get_logger(
"BehaviorTreeEngine"),
111 "Error: Empty BT file passed to extractBehaviorTreeID");
114 tinyxml2::XMLDocument doc;
115 if (doc.LoadFile(bt_file.c_str()) != tinyxml2::XML_SUCCESS) {
116 RCLCPP_ERROR(rclcpp::get_logger(
"BehaviorTreeEngine"),
"Error: Could not open or parse file %s",
120 tinyxml2::XMLElement * rootElement = doc.RootElement();
122 RCLCPP_ERROR(rclcpp::get_logger(
"BehaviorTreeEngine"),
"Error: Root element not found in %s",
126 tinyxml2::XMLElement * btElement = rootElement->FirstChildElement(
"BehaviorTree");
128 RCLCPP_ERROR(rclcpp::get_logger(
"BehaviorTreeEngine"),
129 "Error: <BehaviorTree> element not found in %s", bt_file.c_str());
132 const char * idValue = btElement->Attribute(
"ID");
134 return std::string(idValue);
136 RCLCPP_ERROR(rclcpp::get_logger(
"BehaviorTreeEngine"),
137 "Error: ID attribute not found on <BehaviorTree> element in %s",
145 const std::string & tree_id,
146 BT::Blackboard::Ptr blackboard)
148 return factory_.createTree(tree_id, blackboard);
153 const std::string & file_path)
155 factory_.registerBehaviorTreeFromFile(file_path);
161 uint16_t server_port)
164 groot_monitor_ = std::make_unique<BT::Groot2Publisher>(*tree, server_port);
167 BT::RegisterJsonDefinition<builtin_interfaces::msg::Time>();
168 BT::RegisterJsonDefinition<std_msgs::msg::Header>();
174 if (groot_monitor_) {
175 groot_monitor_.reset();
BT::Tree createTree(const std::string &tree_id, BT::Blackboard::Ptr blackboard)
Function to create a BT from a BehaviorTree ID.
BehaviorTreeEngine(const std::vector< std::string > &plugin_libraries, nav2::LifecycleNode::SharedPtr node)
A constructor for nav2_behavior_tree::BehaviorTreeEngine.
void addGrootMonitoring(BT::Tree *tree, uint16_t server_port)
Add Groot2 monitor to publish BT status changes.
void resetGrootMonitor()
Reset groot monitor.
BT::Tree createTreeFromFile(const std::string &file_path, BT::Blackboard::Ptr blackboard)
Function to create a BT from an XML file.
void registerTreeFromFile(const std::string &file_path)
Function to register a BT from an XML file.
BT::Tree createTreeFromText(const std::string &xml_string, BT::Blackboard::Ptr blackboard)
Function to create a BT from a XML string.
void haltAllActions(BT::Tree &tree)
Function to explicitly reset all BT nodes to initial state.
std::string extractBehaviorTreeID(const std::string &file_or_id)
Extract BehaviorTree ID from BT file path or BT ID.
BtStatus run(BT::Tree *tree, std::function< void()> onLoop, std::function< bool()> cancelRequested, std::chrono::milliseconds loopTimeout=std::chrono::milliseconds(10))
Function to execute a BT at a specific rate.