Nav2 Navigation Stack - lyrical  lyrical
ROS 2 Navigation Stack
bt_navigator.cpp
1 // Copyright (c) 2018 Intel Corporation
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 #include "nav2_bt_navigator/bt_navigator.hpp"
16 
17 #include <memory>
18 #include <string>
19 #include <utility>
20 #include <vector>
21 
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"
27 
28 #include "nav2_behavior_tree/plugins_list.hpp"
29 
30 using nav2::declare_parameter_if_not_declared;
31 
32 namespace nav2_bt_navigator
33 {
34 
35 BtNavigator::BtNavigator(rclcpp::NodeOptions options)
36 : nav2::LifecycleNode("bt_navigator", "",
37  options.automatically_declare_parameters_from_overrides(true)),
38  class_loader_("nav2_core", "nav2_core::NavigatorBase")
39 {
40  RCLCPP_INFO(get_logger(), "Creating");
41 }
42 
44 {
45 }
46 
47 nav2::CallbackReturn
48 BtNavigator::on_configure(const rclcpp_lifecycle::State & state)
49 {
50  RCLCPP_INFO(get_logger(), "Configuring");
51 
52  tf_ = nav2::create_transform_buffer(this);
53  tf_->setUsingDedicatedThread(true);
54  tf_listener_ = nav2::create_transform_listener(*tf_, this, true);
55 
56  global_frame_ = this->declare_or_get_parameter("global_frame", std::string("map"));
57  robot_frame_ = this->declare_or_get_parameter("robot_base_frame", std::string("base_link"));
58  transform_tolerance_ = this->declare_or_get_parameter("transform_tolerance", 0.1);
59  odom_topic_ = this->declare_or_get_parameter("odom_topic", std::string("odom"));
60  filter_duration_ = this->declare_or_get_parameter("filter_duration", 0.3);
61 
62  // Libraries to pull plugins (BT Nodes) from
63  std::vector<std::string> plugin_lib_names;
64  plugin_lib_names = nav2_util::split(nav2::details::BT_BUILTIN_PLUGINS, ';');
65 
66  auto user_defined_plugins =
67  this->declare_or_get_parameter("plugin_lib_names", std::vector<std::string>{});
68  // append user_defined_plugins to plugin_lib_names
69  plugin_lib_names.insert(
70  plugin_lib_names.end(), user_defined_plugins.begin(),
71  user_defined_plugins.end());
72 
73  nav2_core::FeedbackUtils feedback_utils;
74  feedback_utils.tf = tf_;
75  feedback_utils.global_frame = global_frame_;
76  feedback_utils.robot_frame = robot_frame_;
77  feedback_utils.transform_tolerance = transform_tolerance_;
78 
79  // Odometry smoother object for getting current speed
80  auto node = shared_from_this();
81  odom_smoother_ = std::make_shared<nav2_util::OdomSmoother>(node, filter_duration_, odom_topic_);
82 
83  // Navigator defaults
84  const std::vector<std::string> default_navigator_ids = {
85  "navigate_to_pose",
86  "navigate_through_poses"
87  };
88  const std::vector<std::string> default_navigator_types = {
89  "nav2_bt_navigator::NavigateToPoseNavigator",
90  "nav2_bt_navigator::NavigateThroughPosesNavigator"
91  };
92 
93  std::vector<std::string> navigator_ids;
94  navigator_ids = this->declare_or_get_parameter("navigators", default_navigator_ids);
95  if (navigator_ids == default_navigator_ids) {
96  for (size_t i = 0; i < default_navigator_ids.size(); ++i) {
97  declare_parameter_if_not_declared(
98  node, default_navigator_ids[i] + ".plugin",
99  rclcpp::ParameterValue(default_navigator_types[i]));
100  }
101  }
102 
103  // Load navigator plugins
104  for (size_t i = 0; i != navigator_ids.size(); i++) {
105  try {
106  std::string navigator_type = nav2::get_plugin_type_param(node, navigator_ids[i]);
107  RCLCPP_INFO(
108  get_logger(), "Creating navigator id %s of type %s",
109  navigator_ids[i].c_str(), navigator_type.c_str());
110  navigators_.push_back(class_loader_.createUniqueInstance(navigator_type));
111  if (!navigators_.back()->on_configure(
112  node, plugin_lib_names, feedback_utils,
113  &plugin_muxer_, odom_smoother_))
114  {
115  return nav2::CallbackReturn::FAILURE;
116  }
117  } catch (const std::exception & ex) {
118  RCLCPP_FATAL(
119  get_logger(), "Failed to create navigator id %s."
120  " Exception: %s", navigator_ids[i].c_str(), ex.what());
121  on_cleanup(state);
122  return nav2::CallbackReturn::FAILURE;
123  }
124  }
125 
126  return nav2::CallbackReturn::SUCCESS;
127 }
128 
129 nav2::CallbackReturn
130 BtNavigator::on_activate(const rclcpp_lifecycle::State & state)
131 {
132  RCLCPP_INFO(get_logger(), "Activating");
133  for (size_t i = 0; i != navigators_.size(); i++) {
134  if (!navigators_[i]->on_activate()) {
135  on_deactivate(state);
136  return nav2::CallbackReturn::FAILURE;
137  }
138  }
139 
140  // create bond connection
141  createBond();
142 
143  return nav2::CallbackReturn::SUCCESS;
144 }
145 
146 nav2::CallbackReturn
147 BtNavigator::on_deactivate(const rclcpp_lifecycle::State & /*state*/)
148 {
149  RCLCPP_INFO(get_logger(), "Deactivating");
150  for (size_t i = 0; i != navigators_.size(); i++) {
151  if (!navigators_[i]->on_deactivate()) {
152  return nav2::CallbackReturn::FAILURE;
153  }
154  }
155 
156  // destroy bond connection
157  destroyBond();
158 
159  return nav2::CallbackReturn::SUCCESS;
160 }
161 
162 nav2::CallbackReturn
163 BtNavigator::on_cleanup(const rclcpp_lifecycle::State & /*state*/)
164 {
165  RCLCPP_INFO(get_logger(), "Cleaning up");
166 
167  // Reset the listener before the buffer
168  tf_listener_.reset();
169  tf_.reset();
170 
171  for (size_t i = 0; i != navigators_.size(); i++) {
172  if (!navigators_[i]->on_cleanup()) {
173  return nav2::CallbackReturn::FAILURE;
174  }
175  }
176 
177  navigators_.clear();
178  RCLCPP_INFO(get_logger(), "Completed Cleaning up");
179  return nav2::CallbackReturn::SUCCESS;
180 }
181 
182 nav2::CallbackReturn
183 BtNavigator::on_shutdown(const rclcpp_lifecycle::State & /*state*/)
184 {
185  RCLCPP_INFO(get_logger(), "Shutting down");
186  return nav2::CallbackReturn::SUCCESS;
187 }
188 
189 } // namespace nav2_bt_navigator
190 
191 #include "rclcpp_components/register_node_macro.hpp"
192 
193 // Register the component with class_loader.
194 // This acts as a sort of entry point, allowing the component to be discoverable when its library
195 // is being loaded into a running process.
196 RCLCPP_COMPONENTS_REGISTER_NODE(nav2_bt_navigator::BtNavigator)
void destroyBond()
Destroy bond connection to lifecycle manager.
nav2::LifecycleNode::SharedPtr shared_from_this()
Get a shared pointer of this.
ParameterT declare_or_get_parameter(const std::string &parameter_name, const ParameterDescriptor &parameter_descriptor=ParameterDescriptor())
Declares or gets a parameter with specified type (not value). If the parameter is already declared,...
void createBond()
Create bond connection to lifecycle manager.
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.