Nav2 Navigation Stack - lyrical  lyrical
ROS 2 Navigation Stack
waypoint_follower.hpp
1 // Copyright (c) 2019 Samsung Research America
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_WAYPOINT_FOLLOWER__WAYPOINT_FOLLOWER_HPP_
16 #define NAV2_WAYPOINT_FOLLOWER__WAYPOINT_FOLLOWER_HPP_
17 
18 #include <memory>
19 #include <string>
20 #include <vector>
21 #include <mutex>
22 
23 #include "rclcpp_action/rclcpp_action.hpp"
24 #include "pluginlib/class_loader.hpp"
25 #include "pluginlib/class_list_macros.hpp"
26 #include "geographic_msgs/msg/geo_pose.hpp"
27 #include "nav2_ros_common/lifecycle_node.hpp"
28 #include "nav2_msgs/action/navigate_to_pose.hpp"
29 #include "nav2_msgs/action/follow_waypoints.hpp"
30 #include "nav2_msgs/msg/waypoint_status.hpp"
31 #include "nav_msgs/msg/path.hpp"
32 #include "nav2_ros_common/simple_action_server.hpp"
33 #include "nav2_ros_common/node_utils.hpp"
34 #include "nav2_util/string_utils.hpp"
35 #include "nav2_msgs/action/follow_gps_waypoints.hpp"
36 #include "nav2_ros_common/service_client.hpp"
37 #include "nav2_core/waypoint_task_executor.hpp"
38 #include "nav2_waypoint_follower/parameter_handler.hpp"
39 
40 #include "robot_localization/srv/from_ll.hpp"
41 #include "nav2_ros_common/tf2_factories.hpp"
42 #include "tf2_geometry_msgs/tf2_geometry_msgs.hpp"
43 
44 namespace nav2_waypoint_follower
45 {
46 
47 enum class ActionStatus
48 {
49  UNKNOWN = 0,
50  PROCESSING = 1,
51  FAILED = 2,
52  SUCCEEDED = 3
53 };
54 
55 struct GoalStatus
56 {
57  ActionStatus status;
58  int error_code;
59  std::string error_msg;
60 };
61 
68 {
69 public:
70  using ActionT = nav2_msgs::action::FollowWaypoints;
71  using ClientT = nav2_msgs::action::NavigateToPose;
73  using ActionClient = nav2::ActionClient<ClientT>;
74 
75  // Shorten the types for GPS waypoint following
76  using ActionTGPS = nav2_msgs::action::FollowGPSWaypoints;
78 
83  explicit WaypointFollower(const rclcpp::NodeOptions & options = rclcpp::NodeOptions());
88 
89 protected:
97  nav2::CallbackReturn on_configure(const rclcpp_lifecycle::State & state) override;
103  nav2::CallbackReturn on_activate(const rclcpp_lifecycle::State & state) override;
109  nav2::CallbackReturn on_deactivate(const rclcpp_lifecycle::State & state) override;
115  nav2::CallbackReturn on_cleanup(const rclcpp_lifecycle::State & state) override;
121  nav2::CallbackReturn on_shutdown(const rclcpp_lifecycle::State & state) override;
122 
136  template<typename T, typename V, typename Z>
137  void followWaypointsHandler(const T & action_server, const V & feedback, const Z & result);
138 
145  template<typename T>
146  bool goalReceived(std::shared_ptr<const typename T::Goal> goal);
147 
152 
161 
166  void resultCallback(const rclcpp_action::ClientGoalHandle<ClientT>::WrappedResult & result);
167 
172  void goalResponseCallback(const rclcpp_action::ClientGoalHandle<ClientT>::SharedPtr & goal);
173 
181  std::vector<geometry_msgs::msg::PoseStamped> convertGPSPosesToMapPoses(
182  const std::vector<geographic_msgs::msg::GeoPose> & gps_poses);
183 
184 
193  template<typename T>
194  std::vector<geometry_msgs::msg::PoseStamped> getLatestGoalPoses(const T & action_server);
195 
196  // Common vars used for both GPS and cartesian point following
197  std::vector<int> failed_ids_;
198 
199  // Our action server
200  typename ActionServer::SharedPtr xyz_action_server_;
201  ActionClient::SharedPtr nav_to_pose_client_;
202  rclcpp::CallbackGroup::SharedPtr callback_group_;
203  rclcpp::executors::SingleThreadedExecutor callback_group_executor_;
204  std::shared_future<rclcpp_action::ClientGoalHandle<ClientT>::SharedPtr> future_goal_handle_;
205 
206  // Our action server for GPS waypoint following
207  typename ActionServerGPS::SharedPtr gps_action_server_;
208  nav2::ServiceClient<robot_localization::srv::FromLL>::SharedPtr from_ll_to_map_client_;
209 
210  GoalStatus current_goal_status_;
211 
212  // Task Execution At Waypoint Plugin
213  pluginlib::ClassLoader<nav2_core::WaypointTaskExecutor>
214  waypoint_task_executor_loader_;
215  pluginlib::UniquePtr<nav2_core::WaypointTaskExecutor>
216  waypoint_task_executor_;
217 
218  // Parameter Handler
219  std::unique_ptr<nav2_waypoint_follower::ParameterHandler> param_handler_;
220  Parameters * params_;
221 };
222 
223 } // namespace nav2_waypoint_follower
224 
225 #endif // NAV2_WAYPOINT_FOLLOWER__WAYPOINT_FOLLOWER_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 that uses behavior tree for navigating a robot to its goal position.
nav2::CallbackReturn on_deactivate(const rclcpp_lifecycle::State &state) override
Deactivates action server.
bool goalReceived(std::shared_ptr< const typename T::Goal > goal)
Goal received callbacks to validate a new goal before acceptance. Rejects goals with empty waypoint l...
nav2::CallbackReturn on_shutdown(const rclcpp_lifecycle::State &state) override
Called when in shutdown state.
void resultCallback(const rclcpp_action::ClientGoalHandle< ClientT >::WrappedResult &result)
Action client result callback.
~WaypointFollower()
A destructor for nav2_waypoint_follower::WaypointFollower class.
WaypointFollower(const rclcpp::NodeOptions &options=rclcpp::NodeOptions())
A constructor for nav2_waypoint_follower::WaypointFollower class.
void goalResponseCallback(const rclcpp_action::ClientGoalHandle< ClientT >::SharedPtr &goal)
Action client goal response callback.
nav2::CallbackReturn on_cleanup(const rclcpp_lifecycle::State &state) override
Resets member variables.
nav2::CallbackReturn on_configure(const rclcpp_lifecycle::State &state) override
Configures member variables.
void followGPSWaypointsCallback()
send robot through each of GPS point , which are converted to map frame first then using a client to ...
std::vector< geometry_msgs::msg::PoseStamped > convertGPSPosesToMapPoses(const std::vector< geographic_msgs::msg::GeoPose > &gps_poses)
given some gps_poses, converts them to map frame using robot_localization's service fromLL....
void followWaypointsHandler(const T &action_server, const V &feedback, const Z &result)
Templated function to perform internal logic behind waypoint following, Both GPS and non GPS waypoint...
void followWaypointsCallback()
Action server callbacks.
std::vector< geometry_msgs::msg::PoseStamped > getLatestGoalPoses(const T &action_server)
get the latest poses on the action server goal. If they are GPS poses, convert them to the global car...
nav2::CallbackReturn on_activate(const rclcpp_lifecycle::State &state) override
Activates action server.