16 #include "nav2_behavior_tree/behavior_tree_engine.hpp"
22 #include "rclcpp/rclcpp.hpp"
23 #include "behaviortree_cpp/json_export.h"
24 #include "behaviortree_cpp/utils/shared_library.h"
25 #include "nav2_behavior_tree/json_utils.hpp"
27 namespace nav2_behavior_tree
31 const std::vector<std::string> & plugin_libraries, rclcpp::Node::SharedPtr node)
33 BT::SharedLibrary loader;
34 for (
const auto & p : plugin_libraries) {
35 factory_.registerFromPlugin(loader.getOSName(p));
39 clock_ = node->get_clock();
43 BT::ReactiveSequence::EnableException(
false);
44 BT::ReactiveFallback::EnableException(
false);
50 std::function<
void()> onLoop,
51 std::function<
bool()> cancelRequested,
52 std::chrono::milliseconds loopTimeout)
54 rclcpp::WallRate loopRate(loopTimeout);
55 BT::NodeStatus result = BT::NodeStatus::RUNNING;
59 while (rclcpp::ok() && result == BT::NodeStatus::RUNNING) {
60 if (cancelRequested()) {
62 return BtStatus::CANCELED;
65 result = tree->tickOnce();
67 if (result == BT::NodeStatus::RUNNING || result == BT::NodeStatus::IDLE) {
71 if (!loopRate.sleep()) {
72 RCLCPP_DEBUG_THROTTLE(
73 rclcpp::get_logger(
"BehaviorTreeEngine"),
75 "Behavior Tree tick rate %0.2f was exceeded!",
76 1.0 / (loopRate.period().count() * 1.0e-9));
79 }
catch (
const BT::NodeExecutionError & ex) {
81 rclcpp::get_logger(
"BehaviorTreeEngine"),
82 "BT Exception at Node: [%s] (Path: %s). Original error: %s. Exiting with failure.",
83 ex.failedNode().registration_name.c_str(),
84 ex.failedNode().node_path.c_str(),
85 ex.originalMessage().c_str());
86 return BtStatus::FAILED;
87 }
catch (
const std::exception & ex) {
89 rclcpp::get_logger(
"BehaviorTreeEngine"),
90 "Behavior tree threw exception: %s. Exiting with failure.", ex.what());
91 return BtStatus::FAILED;
94 return (result == BT::NodeStatus::SUCCESS) ? BtStatus::SUCCEEDED : BtStatus::FAILED;
99 const std::string & xml_string,
100 BT::Blackboard::Ptr blackboard)
102 return factory_.createTreeFromText(xml_string, blackboard);
107 const std::string & file_path,
108 BT::Blackboard::Ptr blackboard)
110 return factory_.createTreeFromFile(file_path, blackboard);
116 uint16_t server_port)
119 groot_monitor_ = std::make_unique<BT::Groot2Publisher>(*tree, server_port);
122 BT::RegisterJsonDefinition<builtin_interfaces::msg::Time>();
123 BT::RegisterJsonDefinition<std_msgs::msg::Header>();
129 if (groot_monitor_) {
130 groot_monitor_.reset();
BehaviorTreeEngine(const std::vector< std::string > &plugin_libraries, rclcpp::Node::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.
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.
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.