Nav2 Navigation Stack - lyrical  lyrical
ROS 2 Navigation Stack
planner_error_plugin.hpp
1 // Copyright (c) 2022 Joshua Wallace
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 ERROR_CODES__PLANNER__PLANNER_ERROR_PLUGIN_HPP_
16 #define ERROR_CODES__PLANNER__PLANNER_ERROR_PLUGIN_HPP_
17 
18 #include <string>
19 #include <memory>
20 #include <vector>
21 
22 #include "rclcpp/rclcpp.hpp"
23 #include "geometry_msgs/msg/point.hpp"
24 #include "geometry_msgs/msg/pose_stamped.hpp"
25 
26 #include "nav2_core/global_planner.hpp"
27 #include "nav_msgs/msg/path.hpp"
28 #include "nav2_util/robot_utils.hpp"
29 #include "nav2_ros_common/lifecycle_node.hpp"
30 #include "nav2_costmap_2d/costmap_2d_ros.hpp"
31 #include "nav2_core/planner_exceptions.hpp"
32 #include "nav2_ros_common/tf2_factories.hpp"
33 
34 namespace nav2_system_tests
35 {
36 
38 {
39 public:
40  UnknownErrorPlanner() = default;
41  ~UnknownErrorPlanner() = default;
42 
43  void configure(
44  const nav2::LifecycleNode::WeakPtr &,
45  std::string, nav2::TransformBuffer::SharedPtr,
46  std::shared_ptr<nav2_costmap_2d::Costmap2DROS>) override {}
47 
48  void cleanup() override {}
49 
50  void activate() override {}
51 
52  void deactivate() override {}
53 
54  nav_msgs::msg::Path createPlan(
55  const geometry_msgs::msg::PoseStamped &,
56  const geometry_msgs::msg::PoseStamped &,
57  const std::vector<geometry_msgs::msg::PoseStamped> &,
58  std::function<bool()>) override
59  {
60  throw nav2_core::PlannerException("Unknown Error");
61  }
62 };
63 
65 {
66  nav_msgs::msg::Path createPlan(
67  const geometry_msgs::msg::PoseStamped &,
68  const geometry_msgs::msg::PoseStamped &,
69  const std::vector<geometry_msgs::msg::PoseStamped> &,
70  std::function<bool()>) override
71  {
72  throw nav2_core::StartOccupied("Start Occupied");
73  }
74 };
75 
77 {
78  nav_msgs::msg::Path createPlan(
79  const geometry_msgs::msg::PoseStamped &,
80  const geometry_msgs::msg::PoseStamped &,
81  const std::vector<geometry_msgs::msg::PoseStamped> &,
82  std::function<bool()>) override
83  {
84  throw nav2_core::GoalOccupied("Goal occupied");
85  }
86 };
87 
89 {
90  nav_msgs::msg::Path createPlan(
91  const geometry_msgs::msg::PoseStamped &,
92  const geometry_msgs::msg::PoseStamped &,
93  const std::vector<geometry_msgs::msg::PoseStamped> &,
94  std::function<bool()>) override
95  {
96  throw nav2_core::StartOutsideMapBounds("Start OutsideMapBounds");
97  }
98 };
99 
101 {
102  nav_msgs::msg::Path createPlan(
103  const geometry_msgs::msg::PoseStamped &,
104  const geometry_msgs::msg::PoseStamped &,
105  const std::vector<geometry_msgs::msg::PoseStamped> &,
106  std::function<bool()>) override
107  {
108  throw nav2_core::GoalOutsideMapBounds("Goal outside map bounds");
109  }
110 };
111 
113 {
114  nav_msgs::msg::Path createPlan(
115  const geometry_msgs::msg::PoseStamped &,
116  const geometry_msgs::msg::PoseStamped &,
117  const std::vector<geometry_msgs::msg::PoseStamped> &,
118  std::function<bool()>) override
119  {
120  return nav_msgs::msg::Path();
121  }
122 };
123 
124 
126 {
127  nav_msgs::msg::Path createPlan(
128  const geometry_msgs::msg::PoseStamped &,
129  const geometry_msgs::msg::PoseStamped &,
130  const std::vector<geometry_msgs::msg::PoseStamped> &,
131  std::function<bool()>) override
132  {
133  throw nav2_core::PlannerTimedOut("Planner Timed Out");
134  }
135 };
136 
138 {
139  nav_msgs::msg::Path createPlan(
140  const geometry_msgs::msg::PoseStamped &,
141  const geometry_msgs::msg::PoseStamped &,
142  const std::vector<geometry_msgs::msg::PoseStamped> &,
143  std::function<bool()>) override
144  {
145  throw nav2_core::PlannerTFError("TF Error");
146  }
147 };
148 
150 {
151  nav_msgs::msg::Path createPlan(
152  const geometry_msgs::msg::PoseStamped &,
153  const geometry_msgs::msg::PoseStamped &,
154  const std::vector<geometry_msgs::msg::PoseStamped> &,
155  std::function<bool()>) override
156  {
157  throw nav2_core::NoViapointsGiven("No Via points given");
158  }
159 };
160 
162 {
163  nav_msgs::msg::Path createPlan(
164  const geometry_msgs::msg::PoseStamped &,
165  const geometry_msgs::msg::PoseStamped &,
166  const std::vector<geometry_msgs::msg::PoseStamped> &,
167  std::function<bool()> cancel_checker) override
168  {
169  auto start_time = std::chrono::steady_clock::now();
170  while (rclcpp::ok() &&
171  std::chrono::steady_clock::now() - start_time < std::chrono::seconds(5))
172  {
173  if (cancel_checker()) {
174  throw nav2_core::PlannerCancelled("Planner Cancelled");
175  }
176  rclcpp::sleep_for(std::chrono::milliseconds(100));
177  }
178  throw nav2_core::PlannerException("Cancel is not called in time.");
179  }
180 };
181 
182 } // namespace nav2_system_tests
183 
184 
185 #endif // ERROR_CODES__PLANNER__PLANNER_ERROR_PLUGIN_HPP_
Abstract interface for global planners to adhere to with pluginlib.
void cleanup() override
Method to cleanup resources used on shutdown.
void configure(const nav2::LifecycleNode::WeakPtr &, std::string, nav2::TransformBuffer::SharedPtr, std::shared_ptr< nav2_costmap_2d::Costmap2DROS >) override
void deactivate() override
Method to deactivate planner and any threads involved in execution.
nav_msgs::msg::Path createPlan(const geometry_msgs::msg::PoseStamped &, const geometry_msgs::msg::PoseStamped &, const std::vector< geometry_msgs::msg::PoseStamped > &, std::function< bool()>) override
Method to create the plan from a starting pose, a goal pose, and intermediate viapoints.
void activate() override
Method to active planner and any threads involved in execution.