Nav2 Navigation Stack - lyrical  lyrical
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 
80  Dock * generateGoalDock(std::shared_ptr<const DockRobot::Goal> goal);
81 
87  void doInitialPerception(Dock * dock, geometry_msgs::msg::PoseStamped & dock_pose);
88 
97  bool approachDock(Dock * dock, geometry_msgs::msg::PoseStamped & dock_pose, bool backward);
98 
103  void rotateToDock(const geometry_msgs::msg::PoseStamped & dock_pose);
104 
110  bool waitForCharge(Dock * dock);
111 
118  bool resetApproach(const geometry_msgs::msg::PoseStamped & staging_pose, bool backward);
119 
130  bool getCommandToPose(
131  geometry_msgs::msg::Twist & cmd, const geometry_msgs::msg::PoseStamped & pose,
132  double linear_tolerance, double angular_tolerance, bool is_docking, bool backward);
133 
139  virtual geometry_msgs::msg::PoseStamped getRobotPoseInFrame(const std::string & frame);
140 
147  template<typename ActionT>
149  typename std::shared_ptr<const typename ActionT::Goal> goal,
150  const typename nav2::SimpleActionServer<ActionT>::SharedPtr & action_server);
151 
158  template<typename ActionT>
160  typename nav2::SimpleActionServer<ActionT>::SharedPtr & action_server,
161  const std::string & name);
162 
169  template<typename ActionT>
171  typename nav2::SimpleActionServer<ActionT>::SharedPtr & action_server,
172  const std::string & name);
173 
179  nav2::CallbackReturn on_configure(const rclcpp_lifecycle::State & state) override;
180 
186  nav2::CallbackReturn on_activate(const rclcpp_lifecycle::State & state) override;
187 
193  nav2::CallbackReturn on_deactivate(const rclcpp_lifecycle::State & state) override;
194 
200  nav2::CallbackReturn on_cleanup(const rclcpp_lifecycle::State & state) override;
201 
207  nav2::CallbackReturn on_shutdown(const rclcpp_lifecycle::State & state) override;
208 
212  void publishZeroVelocity();
213 
214 protected:
218  void dockRobot();
219 
223  void undockRobot();
224 
225  // Parameter handler
226  std::unique_ptr<opennav_docking::ParameterHandler> param_handler_;
227  Parameters * params_;
228 
229  // Maximum number of times the robot will return to staging pose and retry docking
230  int num_retries_;
231 
232  // This is a class member so it can be accessed in publish feedback
233  rclcpp::Time action_start_time_;
234 
235  std::unique_ptr<nav2_util::TwistPublisher> vel_publisher_;
236  std::unique_ptr<nav2_util::OdomSmoother> odom_sub_;
237  typename DockingActionServer::SharedPtr docking_action_server_;
238  typename UndockingActionServer::SharedPtr undocking_action_server_;
239 
240  std::unique_ptr<DockDatabase> dock_db_;
241  std::unique_ptr<Navigator> navigator_;
242  std::unique_ptr<Controller> controller_;
243  std::string curr_dock_type_;
244 
245  nav2::TransformBuffer::SharedPtr tf2_buffer_;
246  nav2::TransformListener::SharedPtr tf2_listener_;
247 };
248 
249 } // namespace opennav_docking
250 
251 #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