15 #ifndef PLANNING__PLANNER_TESTER_HPP_
16 #define PLANNING__PLANNER_TESTER_HPP_
18 #include <gtest/gtest.h>
25 #include "nav2_ros_common/lifecycle_node.hpp"
26 #include "nav2_msgs/action/compute_path_to_pose.hpp"
27 #include "nav_msgs/msg/occupancy_grid.hpp"
28 #include "nav2_msgs/msg/costmap.hpp"
29 #include "nav2_msgs/srv/get_costmap.hpp"
30 #include "nav2_msgs/srv/is_path_valid.hpp"
31 #include "nav2_util/costmap.hpp"
32 #include "nav2_ros_common/node_thread.hpp"
33 #include "geometry_msgs/msg/pose_stamped.hpp"
34 #include "geometry_msgs/msg/transform_stamped.hpp"
35 #include "nav2_planner/planner_server.hpp"
36 #include "nav2_ros_common/tf2_factories.hpp"
38 namespace nav2_system_tests
50 void setCostmapResolution(
double resolution)
52 costmap_ros_->declare_parameter(
"resolution", resolution);
60 std::cout <<
"" << std::endl;
62 std::cout << costmap_ros_->getCostmap()->getCharMap()[i] <<
" ";
64 std::cout <<
"" << std::endl;
69 std::unique_lock<nav2_costmap_2d::Costmap2D::mutex_t> lock(
70 *(costmap_ros_->getCostmap()->getMutex()));
72 nav2_msgs::msg::CostmapMetaData prop;
73 nav2_msgs::msg::Costmap cm = costmap->
get_costmap(prop);
75 costmap_ros_->getCostmap()->resizeMap(
76 prop.size_x, prop.size_y,
77 prop.resolution, prop.origin.position.x, prop.origin.position.x);
79 volatile unsigned char * costmap_ptr = costmap_ros_->getCostmap()->getCharMap();
81 costmap_ptr =
new unsigned char[prop.size_x * prop.size_y];
82 std::copy(cm.data.begin(), cm.data.end(), costmap_ptr);
86 const geometry_msgs::msg::PoseStamped & goal,
87 nav_msgs::msg::Path & path)
89 geometry_msgs::msg::PoseStamped start;
90 if (!nav2_util::getCurrentPose(start, *tf_,
"map",
"base_link", 0.1)) {
94 auto dummy_cancel_checker = []() {
return false;};
95 std::vector<geometry_msgs::msg::PoseStamped> viapoints{start};
96 path = planners_[
"GridBased"]->createPlan(start, goal, viapoints, dummy_cancel_checker);
100 if (!path.poses.size()) {
109 void onCleanup(
const rclcpp_lifecycle::State & state)
114 void onActivate(
const rclcpp_lifecycle::State & state)
119 void onDeactivate(
const rclcpp_lifecycle::State & state)
124 void onConfigure(
const rclcpp_lifecycle::State & state)
130 enum class TaskStatus : int8_t
140 using ComputePathToPoseCommand = geometry_msgs::msg::PoseStamped;
141 using ComputePathToPoseResult = nav_msgs::msg::Path;
151 void loadDefaultMap();
154 void loadSimpleCostmap(
const nav2_util::TestCostmap & testCostmapType);
159 bool defaultPlannerTest(
160 ComputePathToPoseResult & path,
161 const double deviation_tolerance = 1.0);
165 bool defaultPlannerRandomTests(
166 const unsigned int number_tests,
167 const float acceptable_fail_ratio);
169 std::shared_ptr<nav2_msgs::srv::IsPathValid::Response> isPathValid(
170 nav_msgs::msg::Path & path,
unsigned int max_cost,
171 bool consider_unknown_as_obstacle,
const std::string & layer_name =
"",
172 const std::string & footprint =
"",
bool stop_at_first_collision =
true,
173 double max_lookahead_distance = -1.0);
178 TaskStatus createPlan(
179 const ComputePathToPoseCommand & goal,
180 ComputePathToPoseResult & path
186 bool using_fake_costmap_;
189 bool trinary_costmap_;
190 bool track_unknown_space_;
191 int lethal_threshold_;
192 int unknown_cost_value_;
193 nav2_util::TestCostmap testCostmapType_;
196 std::shared_ptr<nav_msgs::msg::OccupancyGrid> map_;
199 std::unique_ptr<nav2_util::Costmap> costmap_;
202 std::shared_ptr<NavFnPlannerTester> planner_tester_;
205 nav2::ServiceClient<nav2_msgs::srv::IsPathValid>::SharedPtr path_valid_client_;
208 std::unique_ptr<nav2::NodeThread> spin_thread_;
211 std::unique_ptr<geometry_msgs::msg::TransformStamped> base_transform_;
212 nav2::TransformBroadcaster::SharedPtr tf_broadcaster_;
213 rclcpp::TimerBase::SharedPtr transform_timer_;
214 void publishRobotTransform();
215 void startRobotTransform();
216 void updateRobotPosition(
const geometry_msgs::msg::Point & position);
219 nav2::Publisher<nav_msgs::msg::OccupancyGrid>::SharedPtr map_pub_;
220 rclcpp::TimerBase::SharedPtr map_timer_;
227 const geometry_msgs::msg::Point & robot_position,
228 const ComputePathToPoseCommand & goal,
229 ComputePathToPoseResult & path);
231 bool isCollisionFree(
const ComputePathToPoseResult & path);
233 bool isWithinTolerance(
234 const geometry_msgs::msg::Point & robot_position,
235 const ComputePathToPoseCommand & goal,
236 const ComputePathToPoseResult & path)
const;
238 bool isWithinTolerance(
239 const geometry_msgs::msg::Point & robot_position,
240 const ComputePathToPoseCommand & goal,
241 const ComputePathToPoseResult & path,
242 const double deviationTolerance,
243 const ComputePathToPoseResult & reference_path)
const;
245 void printPath(
const ComputePathToPoseResult & path)
const;
A lifecycle node wrapper to enable common Nav2 needs such as manipulating parameters.
unsigned int getSizeInCellsX() const
Accessor for the x size of the costmap in cells.
unsigned int getSizeInCellsY() const
Accessor for the y size of the costmap in cells.
An action server implements the behavior tree's ComputePathToPose interface and hosts various plugins...
nav2::CallbackReturn on_configure(const rclcpp_lifecycle::State &state) override
Configure member variables and initializes planner.
nav2::CallbackReturn on_deactivate(const rclcpp_lifecycle::State &state) override
Deactivate member variables.
PlannerServer(const rclcpp::NodeOptions &options=rclcpp::NodeOptions())
A constructor for nav2_planner::PlannerServer.
nav2::CallbackReturn on_cleanup(const rclcpp_lifecycle::State &state) override
Reset member variables.
nav2::CallbackReturn on_activate(const rclcpp_lifecycle::State &state) override
Activate member variables.
Class for a single layered costmap initialized from an occupancy grid representing the map.
nav2_msgs::msg::Costmap get_costmap(const nav2_msgs::msg::CostmapMetaData &specifications)
Get a costmap message from this object.