Go to the documentation of this file.00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 
00030 
00031 
00032 
00033 
00034 #include <dwb_critics/path_dist.h>
00035 #include <nav_grid/coordinate_conversion.h>
00036 #include <pluginlib/class_list_macros.h>
00037 #include <nav_2d_utils/path_ops.h>
00038 #include <vector>
00039 
00040 namespace dwb_critics
00041 {
00042 bool PathDistCritic::prepare(const geometry_msgs::Pose2D& pose, const nav_2d_msgs::Twist2D& vel,
00043                              const geometry_msgs::Pose2D& goal,
00044                              const nav_2d_msgs::Path2D& global_plan)
00045 {
00046   reset();
00047   const nav_core2::Costmap& costmap = *costmap_;
00048   const nav_grid::NavGridInfo& info = costmap.getInfo();
00049   bool started_path = false;
00050 
00051   nav_2d_msgs::Path2D adjusted_global_plan = nav_2d_utils::adjustPlanResolution(global_plan, info.resolution);
00052 
00053   if (adjusted_global_plan.poses.size() != global_plan.poses.size())
00054   {
00055     ROS_DEBUG_NAMED("PathDistCritic", "Adjusted global plan resolution, added %zu points",
00056                     adjusted_global_plan.poses.size() - global_plan.poses.size());
00057   }
00058 
00059   unsigned int i;
00060   
00061   for (i = 0; i < adjusted_global_plan.poses.size(); ++i)
00062   {
00063     double g_x = adjusted_global_plan.poses[i].x;
00064     double g_y = adjusted_global_plan.poses[i].y;
00065     unsigned int map_x, map_y;
00066     if (worldToGridBounded(info, g_x, g_y, map_x, map_y) && costmap(map_x, map_y) != costmap.NO_INFORMATION)
00067     {
00068       cell_values_.setValue(map_x, map_y, 0.0);
00069       queue_->enqueueCell(map_x, map_y);
00070       started_path = true;
00071     }
00072     else if (started_path)
00073     {
00074       break;
00075     }
00076   }
00077   if (!started_path)
00078   {
00079     ROS_ERROR_NAMED("PathDistCritic",
00080                     "None of the %d first of %zu (%zu) points of the global plan were in the local costmap and free",
00081                     i, adjusted_global_plan.poses.size(), global_plan.poses.size());
00082     return false;
00083   }
00084 
00085   propogateManhattanDistances();
00086 
00087   return true;
00088 }
00089 
00090 }  
00091 
00092 PLUGINLIB_EXPORT_CLASS(dwb_critics::PathDistCritic, dwb_local_planner::TrajectoryCritic)