Nav2 Navigation Stack - rolling  main
ROS 2 Navigation Stack
docking_server.hpp
1 // Copyright (c) 2024 Open Navigation LLC
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 OPENNAV_DOCKING__DOCKING_SERVER_HPP_
16 #define OPENNAV_DOCKING__DOCKING_SERVER_HPP_
17 
18 #include <functional>
19 #include <memory>
20 #include <mutex>
21 #include <optional>
22 #include <string>
23 #include <vector>
24 
25 #include "rclcpp/rclcpp.hpp"
26 #include "nav2_ros_common/lifecycle_node.hpp"
27 #include "nav2_ros_common/node_utils.hpp"
28 #include "nav2_ros_common/simple_action_server.hpp"
29 #include "nav2_util/twist_publisher.hpp"
30 #include "nav2_util/odometry_utils.hpp"
31 #include "opennav_docking/controller.hpp"
32 #include "opennav_docking/utils.hpp"
33 #include "opennav_docking/types.hpp"
34 #include "opennav_docking/dock_database.hpp"
35 #include "opennav_docking/navigator.hpp"
36 #include "opennav_docking/parameter_handler.hpp"
37 #include "opennav_docking_core/charging_dock.hpp"
38 #include "nav2_ros_common/tf2_factories.hpp"
39 
40 namespace opennav_docking
41 {
47 {
48 public:
51 
56  explicit DockingServer(const rclcpp::NodeOptions & options = rclcpp::NodeOptions());
57 
61  ~DockingServer() = default;
62 
67  void stashDockData(bool use_dock_id, Dock * dock, bool successful);
68 
73  void publishDockingFeedback(uint16_t state);
74 
81  Dock * generateGoalDock(std::shared_ptr<const DockRobot::Goal> goal);
82 
88  void doInitialPerception(Dock * dock, geometry_msgs::msg::PoseStamped & dock_pose);
89 
98  bool approachDock(Dock * dock, geometry_msgs::msg::PoseStamped & dock_pose, bool backward);
99 
104  void rotateToDock(const geometry_msgs::msg::PoseStamped & dock_pose);
105 
111  bool waitForCharge(Dock * dock);
112 
119  bool resetApproach(const geometry_msgs::msg::PoseStamped & staging_pose, bool backward);
120 
131  bool getCommandToPose(
132  geometry_msgs::msg::Twist & cmd, const geometry_msgs::msg::PoseStamped & pose,
133  double linear_tolerance, double angular_tolerance, bool is_docking, bool backward);
134 
140  virtual geometry_msgs::msg::PoseStamped getRobotPoseInFrame(const std::string & frame);
141 
148  template<typename ActionT>
150  typename std::shared_ptr<const typename ActionT::Goal> goal,
151  const typename nav2::SimpleActionServer<ActionT>::SharedPtr & action_server);
152 
159  template<typename ActionT>
161  typename nav2::SimpleActionServer<ActionT>::SharedPtr & action_server,
162  const std::string & name);
163 
170  template<typename ActionT>
172  typename nav2::SimpleActionServer<ActionT>::SharedPtr & action_server,
173  const std::string & name);
174 
180  nav2::CallbackReturn on_configure(const rclcpp_lifecycle::State & state) override;
181 
187  nav2::CallbackReturn on_activate(const rclcpp_lifecycle::State & state) override;
188 
194  nav2::CallbackReturn on_deactivate(const rclcpp_lifecycle::State & state) override;
195 
201  nav2::CallbackReturn on_cleanup(const rclcpp_lifecycle::State & state) override;
202 
208  nav2::CallbackReturn on_shutdown(const rclcpp_lifecycle::State & state) override;
209 
213  void publishZeroVelocity();
214 
215 protected:
219  void dockRobot();
220 
224  void undockRobot();
225 
226  // Parameter handler
227  std::unique_ptr<opennav_docking::ParameterHandler> param_handler_;
228  Parameters * params_;
229 
230  // Maximum number of times the robot will return to staging pose and retry docking
231  int num_retries_;
232 
233  // This is a class member so it can be accessed in publish feedback
234  rclcpp::Time action_start_time_;
235 
236  std::unique_ptr<nav2_util::TwistPublisher> vel_publisher_;
237  std::unique_ptr<nav2_util::OdomSmoother> odom_sub_;
238  typename DockingActionServer::SharedPtr docking_action_server_;
239  typename UndockingActionServer::SharedPtr undocking_action_server_;
240 
241  std::unique_ptr<DockDatabase> dock_db_;
242  std::unique_ptr<Navigator> navigator_;
243  std::unique_ptr<Controller> controller_;
244  std::string curr_dock_type_;
245 
246  nav2::TransformBuffer::SharedPtr tf2_buffer_;
247  nav2::TransformListener::SharedPtr tf2_listener_;
248 };
249 
250 } // namespace opennav_docking
251 
252 #endif // OPENNAV_DOCKING__DOCKING_SERVER_HPP_
A lifecycle node wrapper to enable common Nav2 needs such as manipulating parameters.
An action server wrapper to make applications simpler using Actions.
An action server which implements charger docking node for AMRs.
virtual geometry_msgs::msg::PoseStamped getRobotPoseInFrame(const std::string &frame)
Get the robot pose (aka base_frame pose) in another frame.
bool resetApproach(const geometry_msgs::msg::PoseStamped &staging_pose, bool backward)
Reset the robot for another approach by controlling back to staging pose.
void dockRobot()
Main action callback method to complete docking request.
nav2::CallbackReturn on_deactivate(const rclcpp_lifecycle::State &state) override
Deactivate member variables.
nav2::CallbackReturn on_cleanup(const rclcpp_lifecycle::State &state) override
Reset member variables.
bool approachDock(Dock *dock, geometry_msgs::msg::PoseStamped &dock_pose, bool backward)
Use control law and dock perception to approach the charge dock.
void doInitialPerception(Dock *dock, geometry_msgs::msg::PoseStamped &dock_pose)
Do initial perception, up to a timeout.
void publishDockingFeedback(uint16_t state)
Publish feedback from a docking action.
DockingServer(const rclcpp::NodeOptions &options=rclcpp::NodeOptions())
A constructor for opennav_docking::DockingServer.
bool checkAndWarnIfCancelled(typename nav2::SimpleActionServer< ActionT >::SharedPtr &action_server, const std::string &name)
Checks and logs warning if action canceled.
nav2::CallbackReturn on_shutdown(const rclcpp_lifecycle::State &state) override
Called when in shutdown state.
bool checkAndWarnIfPreempted(typename nav2::SimpleActionServer< ActionT >::SharedPtr &action_server, const std::string &name)
Checks and logs warning if action preempted.
bool getCommandToPose(geometry_msgs::msg::Twist &cmd, const geometry_msgs::msg::PoseStamped &pose, double linear_tolerance, double angular_tolerance, bool is_docking, bool backward)
Run a single iteration of the control loop to approach a pose.
bool waitForCharge(Dock *dock)
Wait for charging to begin.
Dock * generateGoalDock(std::shared_ptr< const DockRobot::Goal > goal)
Generate a dock from action goal.
~DockingServer()=default
A destructor for opennav_docking::DockingServer.
nav2::CallbackReturn on_activate(const rclcpp_lifecycle::State &state) override
Activate member variables.
void getPreemptedGoalIfRequested(typename std::shared_ptr< const typename ActionT::Goal > goal, const typename nav2::SimpleActionServer< ActionT >::SharedPtr &action_server)
Gets a preempted goal if immediately requested.
nav2::CallbackReturn on_configure(const rclcpp_lifecycle::State &state) override
Configure member variables.
void publishZeroVelocity()
Publish zero velocity at terminal condition.
void rotateToDock(const geometry_msgs::msg::PoseStamped &dock_pose)
Perform a pure rotation to dock orientation.
void undockRobot()
Main action callback method to complete undocking request.
void stashDockData(bool use_dock_id, Dock *dock, bool successful)
Called at the conclusion of docking actions. Saves relevant docking data for later undocking action.
Definition: types.hpp:33