Nav2 Navigation Stack - lyrical  lyrical
ROS 2 Navigation Stack
bt_action_server.hpp
1 // Copyright (c) 2020 Sarthak Mittal
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 #ifndef NAV2_BEHAVIOR_TREE__BT_ACTION_SERVER_HPP_
16 #define NAV2_BEHAVIOR_TREE__BT_ACTION_SERVER_HPP_
17 
18 #include <chrono>
19 #include <functional>
20 #include <memory>
21 #include <string>
22 #include <vector>
23 
24 #include "geometry_msgs/msg/pose_stamped.hpp"
25 #include "nav2_behavior_tree/behavior_tree_engine.hpp"
26 #include "nav2_behavior_tree/ros_topic_logger.hpp"
27 #include "nav2_ros_common/lifecycle_node.hpp"
28 #include "nav2_ros_common/simple_action_server.hpp"
29 
30 namespace nav2_behavior_tree
31 {
36 template<class ActionT, class NodeT>
38 {
39 public:
41 
42  typedef std::function<bool (typename ActionT::Goal::ConstSharedPtr)> OnGoalReceivedCallback;
43  typedef std::function<void ()> OnLoopCallback;
44  typedef std::function<void (typename ActionT::Goal::ConstSharedPtr)> OnPreemptCallback;
45  typedef std::function<void (typename ActionT::Result::SharedPtr,
46  nav2_behavior_tree::BtStatus &)> OnCompletionCallback;
47 
51  explicit BtActionServer(
52  const typename NodeT::WeakPtr & parent,
53  const std::string & action_name,
54  const std::vector<std::string> & plugin_lib_names,
55  const std::string & default_bt_xml_filename,
56  OnGoalReceivedCallback on_goal_received_callback,
57  OnLoopCallback on_loop_callback,
58  OnPreemptCallback on_preempt_callback,
59  OnCompletionCallback on_completion_callback,
60  const std::vector<std::string> & search_directories = std::vector<std::string>{});
61 
66 
73  bool on_configure();
74 
79  bool on_activate();
80 
85  bool on_deactivate();
86 
91  bool on_cleanup();
92 
98  void setGrootMonitoring(const bool enable, const unsigned server_port);
99 
106  bool loadBehaviorTree(
107  const std::string & bt_xml_filename_or_id = "");
108 
113  BT::Blackboard::Ptr getBlackboard() const
114  {
115  return blackboard_;
116  }
117 
122  std::string getCurrentBTFilenameOrID() const
123  {
124  return current_bt_file_or_id_;
125  }
126 
131  std::string getDefaultBTFilenameOrID() const
132  {
133  return default_bt_xml_filename_or_id_;
134  }
135 
140  const std::shared_ptr<const typename ActionT::Goal> acceptPendingGoal()
141  {
142  return action_server_->accept_pending_goal();
143  }
144 
149  {
150  action_server_->terminate_pending_goal();
151  }
152 
157  const std::shared_ptr<const typename ActionT::Goal> getCurrentGoal() const
158  {
159  return action_server_->get_current_goal();
160  }
161 
166  const std::shared_ptr<const typename ActionT::Goal> getPendingGoal() const
167  {
168  return action_server_->get_pending_goal();
169  }
170 
174  void publishFeedback(typename std::shared_ptr<typename ActionT::Feedback> feedback)
175  {
176  action_server_->publish_feedback(feedback);
177  }
178 
179  void preemptCurrentNavigator()
180  {
181  muxer_preemption_requested_ = true;
182  }
183 
188  const BT::Tree & getTree() const
189  {
190  return tree_;
191  }
192 
198  void haltTree()
199  {
200  tree_.haltTree();
201  }
202 
208  void setInternalError(uint16_t error_code, const std::string & error_msg);
209 
213  void resetInternalError(void);
214 
220  bool populateInternalError(typename std::shared_ptr<typename ActionT::Result> result);
221 
222 protected:
226  void executeCallback();
227 
233  void populateErrorCode(typename std::shared_ptr<typename ActionT::Result> result);
234 
238  void cleanErrorCodes();
239 
240  // Action name
241  std::string action_name_;
242 
243  // Our action server implements the template action
244  typename ActionServer::SharedPtr action_server_;
245 
246  // Behavior Tree to be executed when goal is received
247  BT::Tree tree_;
248 
249  // The blackboard shared by all of the nodes in the tree
250  BT::Blackboard::Ptr blackboard_;
251 
252  // The XML file that contains the Behavior Tree to create
253  std::string current_bt_file_or_id_;
254  std::string default_bt_xml_filename_or_id_;
255  std::vector<std::string> search_directories_;
256 
257  // The wrapper class for the BT functionality
258  std::unique_ptr<nav2_behavior_tree::BehaviorTreeEngine> bt_;
259 
260  // Libraries to pull plugins (BT Nodes) from
261  std::vector<std::string> plugin_lib_names_;
262 
263  // Error code name prefixes
264  std::vector<std::string> error_code_name_prefixes_;
265 
266  // A regular, non-spinning ROS node that we can use for calls to the action client
267  nav2::LifecycleNode::SharedPtr client_node_;
268 
269  // Parent node
270  typename NodeT::WeakPtr node_;
271 
272  // Clock
273  rclcpp::Clock::SharedPtr clock_;
274 
275  // Logger
276  rclcpp::Logger logger_{rclcpp::get_logger("BtActionServer")};
277 
278  // To publish BT logs
279  std::unique_ptr<RosTopicLogger> topic_logger_;
280 
281  // Duration for each iteration of BT execution
282  std::chrono::milliseconds bt_loop_duration_;
283 
284  // Default timeout value while waiting for response from a server
285  std::chrono::milliseconds default_server_timeout_;
286 
287  // Default timeout value when cancelling actions during node halt
288  std::chrono::milliseconds default_cancel_timeout_;
289 
290  // The timeout value for waiting for a service to response
291  std::chrono::milliseconds wait_for_service_timeout_;
292 
293  // should the BT be reloaded even if the same xml filename is requested?
294  bool always_reload_bt_ = false;
295 
296  // Whether to log BT transitions to IDLE state
297  bool log_idle_ = true;
298 
299  // Parameters for Groot2 monitoring
300  bool enable_groot_monitoring_ = false;
301  int groot_server_port_ = 1667;
302 
303  // User-provided callbacks
304  OnGoalReceivedCallback on_goal_received_callback_;
305  OnLoopCallback on_loop_callback_;
306  OnPreemptCallback on_preempt_callback_;
307  OnCompletionCallback on_completion_callback_;
308 
309  // internal error tracking (IOW not behaviorTree blackboard errors)
310  uint16_t internal_error_code_;
311  std::string internal_error_msg_;
312 
313  std::atomic_bool muxer_preemption_requested_{false};
314 };
315 
316 } // namespace nav2_behavior_tree
317 
318 #include <nav2_behavior_tree/bt_action_server_impl.hpp> // NOLINT(build/include_order)
319 #endif // NAV2_BEHAVIOR_TREE__BT_ACTION_SERVER_HPP_
An action server wrapper to make applications simpler using Actions.
An action server that uses behavior tree to execute an action.
BtActionServer(const typename NodeT::WeakPtr &parent, const std::string &action_name, const std::vector< std::string > &plugin_lib_names, const std::string &default_bt_xml_filename, OnGoalReceivedCallback on_goal_received_callback, OnLoopCallback on_loop_callback, OnPreemptCallback on_preempt_callback, OnCompletionCallback on_completion_callback, const std::vector< std::string > &search_directories=std::vector< std::string >{})
A constructor for nav2_behavior_tree::BtActionServer class.
bool on_cleanup()
Resets member variables.
void setGrootMonitoring(const bool enable, const unsigned server_port)
Enable (or disable) Groot2 monitoring of BT.
const std::shared_ptr< const typename ActionT::Goal > acceptPendingGoal()
Wrapper function to accept pending goal if a preempt has been requested.
bool loadBehaviorTree(const std::string &bt_xml_filename_or_id="")
Replace current BT with another one.
void haltTree()
Function to halt the current tree. It will interrupt the execution of RUNNING nodes by calling their ...
BT::Blackboard::Ptr getBlackboard() const
Getter function for BT Blackboard.
bool populateInternalError(typename std::shared_ptr< typename ActionT::Result > result)
populate result with internal error code and error_msg if not NONE
bool on_deactivate()
Deactivates action server.
const std::shared_ptr< const typename ActionT::Goal > getCurrentGoal() const
Wrapper function to get current goal.
~BtActionServer()
A destructor for nav2_behavior_tree::BtActionServer class.
const BT::Tree & getTree() const
Getter function for the current BT tree.
bool on_configure()
Configures member variables Initializes action server for, builds behavior tree from xml file,...
const std::shared_ptr< const typename ActionT::Goal > getPendingGoal() const
Wrapper function to get pending goal.
void terminatePendingGoal()
Wrapper function to terminate pending goal if a preempt has been requested.
std::string getDefaultBTFilenameOrID() const
Getter function for default BT XML filename or ID.
void publishFeedback(typename std::shared_ptr< typename ActionT::Feedback > feedback)
Wrapper function to publish action feedback.
void resetInternalError(void)
reset internal error code and message
void executeCallback()
Action server callback.
void cleanErrorCodes()
Setting BT error codes to success. Used to clean blackboard between different BT runs.
void populateErrorCode(typename std::shared_ptr< typename ActionT::Result > result)
updates the action server result to the highest priority error code posted on the blackboard
bool on_activate()
Activates action server.
std::string getCurrentBTFilenameOrID() const
Getter function for current BT XML filename.
void setInternalError(uint16_t error_code, const std::string &error_msg)
Set internal error code and message.