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/node_options.hpp"
26 #include "rclcpp/time.hpp"
27 #include "nav2_ros_common/lifecycle_node.hpp"
28 #include "nav2_ros_common/node_utils.hpp"
29 #include "nav2_ros_common/simple_action_server.hpp"
30 #include "nav2_util/twist_publisher.hpp"
31 #include "nav2_util/odometry_utils.hpp"
32 #include "opennav_docking/controller.hpp"
33 #include "opennav_docking/utils.hpp"
34 #include "opennav_docking/types.hpp"
35 #include "opennav_docking/dock_database.hpp"
36 #include "opennav_docking/navigator.hpp"
37 #include "opennav_docking/parameter_handler.hpp"
38 #include "opennav_docking_core/charging_dock.hpp"
39 #include "nav2_ros_common/tf2_factories.hpp"
40 
41 namespace opennav_docking
42 {
48 {
49 public:
52 
57  explicit DockingServer(const rclcpp::NodeOptions & options = rclcpp::NodeOptions());
58 
62  ~DockingServer() = default;
63 
68  void stashDockData(bool use_dock_id, Dock * dock, bool successful);
69 
74  void publishDockingFeedback(uint16_t state);
75 
82  Dock * generateGoalDock(std::shared_ptr<const DockRobot::Goal> goal);
83 
89  void doInitialPerception(Dock * dock, geometry_msgs::msg::PoseStamped & dock_pose);
90 
99  bool approachDock(Dock * dock, geometry_msgs::msg::PoseStamped & dock_pose, bool backward);
100 
105  void rotateToDock(const geometry_msgs::msg::PoseStamped & dock_pose);
106 
112  bool waitForCharge(Dock * dock);
113 
120  bool resetApproach(const geometry_msgs::msg::PoseStamped & staging_pose, bool backward);
121 
132  bool getCommandToPose(
133  geometry_msgs::msg::Twist & cmd, const geometry_msgs::msg::PoseStamped & pose,
134  double linear_tolerance, double angular_tolerance, bool is_docking, bool backward);
135 
141  virtual geometry_msgs::msg::PoseStamped getRobotPoseInFrame(const std::string & frame);
142 
149  template<typename ActionT>
151  typename std::shared_ptr<const typename ActionT::Goal> goal,
152  const typename nav2::SimpleActionServer<ActionT>::SharedPtr & action_server);
153 
160  template<typename ActionT>
162  typename nav2::SimpleActionServer<ActionT>::SharedPtr & action_server,
163  const std::string & name);
164 
171  template<typename ActionT>
173  typename nav2::SimpleActionServer<ActionT>::SharedPtr & action_server,
174  const std::string & name);
175 
181  nav2::CallbackReturn on_configure(const rclcpp_lifecycle::State & state) override;
182 
188  nav2::CallbackReturn on_activate(const rclcpp_lifecycle::State & state) override;
189 
195  nav2::CallbackReturn on_deactivate(const rclcpp_lifecycle::State & state) override;
196 
202  nav2::CallbackReturn on_cleanup(const rclcpp_lifecycle::State & state) override;
203 
209  nav2::CallbackReturn on_shutdown(const rclcpp_lifecycle::State & state) override;
210 
214  void publishZeroVelocity();
215 
216 protected:
220  void dockRobot();
221 
225  void undockRobot();
226 
227  // Parameter handler
228  std::unique_ptr<opennav_docking::ParameterHandler> param_handler_;
229  Parameters * params_;
230 
231  // Maximum number of times the robot will return to staging pose and retry docking
232  int num_retries_;
233 
234  // This is a class member so it can be accessed in publish feedback
235  rclcpp::Time action_start_time_;
236 
237  std::unique_ptr<nav2_util::TwistPublisher> vel_publisher_;
238  std::unique_ptr<nav2_util::OdomSmoother> odom_sub_;
239  typename DockingActionServer::SharedPtr docking_action_server_;
240  typename UndockingActionServer::SharedPtr undocking_action_server_;
241 
242  std::unique_ptr<DockDatabase> dock_db_;
243  std::unique_ptr<Navigator> navigator_;
244  std::unique_ptr<Controller> controller_;
245  std::string curr_dock_type_;
246 
247  nav2::TransformBuffer::SharedPtr tf2_buffer_;
248  nav2::TransformListener::SharedPtr tf2_listener_;
249 };
250 
251 } // namespace opennav_docking
252 
253 #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