15 #include "nav2_bt_navigator/bt_navigator.hpp"
22 #include "nav2_util/geometry_utils.hpp"
23 #include "nav2_ros_common/node_utils.hpp"
24 #include "nav2_util/string_utils.hpp"
25 #include "nav2_util/robot_utils.hpp"
26 #include "nav2_behavior_tree/bt_utils.hpp"
28 #include "nav2_behavior_tree/plugins_list.hpp"
30 using nav2::declare_parameter_if_not_declared;
32 namespace nav2_bt_navigator
36 : nav2::LifecycleNode(
"bt_navigator",
"",
37 options.automatically_declare_parameters_from_overrides(true)),
38 class_loader_(
"nav2_core",
"nav2_core::NavigatorBase")
40 RCLCPP_INFO(get_logger(),
"Creating");
50 RCLCPP_INFO(get_logger(),
"Configuring");
52 tf_ = std::make_shared<tf2_ros::Buffer>(get_clock());
53 auto timer_interface = std::make_shared<tf2_ros::CreateTimerROS>(
54 get_node_base_interface(), get_node_timers_interface());
55 tf_->setCreateTimerInterface(timer_interface);
56 tf_->setUsingDedicatedThread(
true);
57 tf_listener_ = std::make_shared<tf2_ros::TransformListener>(*tf_,
this,
true);
66 std::vector<std::string> plugin_lib_names;
67 plugin_lib_names = nav2_util::split(nav2::details::BT_BUILTIN_PLUGINS,
';');
69 auto user_defined_plugins =
72 plugin_lib_names.insert(
73 plugin_lib_names.end(), user_defined_plugins.begin(),
74 user_defined_plugins.end());
77 feedback_utils.tf = tf_;
78 feedback_utils.global_frame = global_frame_;
79 feedback_utils.robot_frame = robot_frame_;
80 feedback_utils.transform_tolerance = transform_tolerance_;
84 odom_smoother_ = std::make_shared<nav2_util::OdomSmoother>(node, filter_duration_, odom_topic_);
87 const std::vector<std::string> default_navigator_ids = {
89 "navigate_through_poses"
91 const std::vector<std::string> default_navigator_types = {
92 "nav2_bt_navigator::NavigateToPoseNavigator",
93 "nav2_bt_navigator::NavigateThroughPosesNavigator"
96 std::vector<std::string> navigator_ids;
98 if (navigator_ids == default_navigator_ids) {
99 for (
size_t i = 0; i < default_navigator_ids.size(); ++i) {
100 declare_parameter_if_not_declared(
101 node, default_navigator_ids[i] +
".plugin",
102 rclcpp::ParameterValue(default_navigator_types[i]));
107 for (
size_t i = 0; i != navigator_ids.size(); i++) {
109 std::string navigator_type = nav2::get_plugin_type_param(node, navigator_ids[i]);
111 get_logger(),
"Creating navigator id %s of type %s",
112 navigator_ids[i].c_str(), navigator_type.c_str());
113 navigators_.push_back(class_loader_.createUniqueInstance(navigator_type));
114 if (!navigators_.back()->on_configure(
115 node, plugin_lib_names, feedback_utils,
116 &plugin_muxer_, odom_smoother_))
118 return nav2::CallbackReturn::FAILURE;
120 }
catch (
const std::exception & ex) {
122 get_logger(),
"Failed to create navigator id %s."
123 " Exception: %s", navigator_ids[i].c_str(), ex.what());
125 return nav2::CallbackReturn::FAILURE;
129 return nav2::CallbackReturn::SUCCESS;
135 RCLCPP_INFO(get_logger(),
"Activating");
136 for (
size_t i = 0; i != navigators_.size(); i++) {
139 return nav2::CallbackReturn::FAILURE;
146 return nav2::CallbackReturn::SUCCESS;
152 RCLCPP_INFO(get_logger(),
"Deactivating");
153 for (
size_t i = 0; i != navigators_.size(); i++) {
155 return nav2::CallbackReturn::FAILURE;
162 return nav2::CallbackReturn::SUCCESS;
168 RCLCPP_INFO(get_logger(),
"Cleaning up");
171 tf_listener_.reset();
174 for (
size_t i = 0; i != navigators_.size(); i++) {
176 return nav2::CallbackReturn::FAILURE;
181 RCLCPP_INFO(get_logger(),
"Completed Cleaning up");
182 return nav2::CallbackReturn::SUCCESS;
188 RCLCPP_INFO(get_logger(),
"Shutting down");
189 return nav2::CallbackReturn::SUCCESS;
194 #include "rclcpp_components/register_node_macro.hpp"
void destroyBond()
Destroy bond connection to lifecycle manager.
nav2::LifecycleNode::SharedPtr shared_from_this()
Get a shared pointer of this.
void createBond()
Create bond connection to lifecycle manager.
ParamType declare_or_get_parameter(const std::string ¶meter_name, const ParamType &default_value, const ParameterDescriptor ¶meter_descriptor=ParameterDescriptor())
Declares or gets a parameter. If the parameter is already declared, returns its value; otherwise decl...
An action server that uses behavior tree for navigating a robot to its goal position.
nav2::CallbackReturn on_shutdown(const rclcpp_lifecycle::State &state) override
Called when in shutdown state.
nav2::CallbackReturn on_deactivate(const rclcpp_lifecycle::State &state) override
Deactivates action server.
nav2::CallbackReturn on_configure(const rclcpp_lifecycle::State &state) override
Configures member variables.
BtNavigator(rclcpp::NodeOptions options=rclcpp::NodeOptions())
A constructor for nav2_bt_navigator::BtNavigator class.
nav2::CallbackReturn on_cleanup(const rclcpp_lifecycle::State &state) override
Resets member variables.
~BtNavigator()
A destructor for nav2_bt_navigator::BtNavigator class.
nav2::CallbackReturn on_activate(const rclcpp_lifecycle::State &state) override
Activates action server.
Navigator feedback utilities required to get transforms and reference frames.