diff --git a/include/iri_opendrive_global_planner/opendrive_planner.h b/include/iri_opendrive_global_planner/opendrive_planner.h index 0eeec65710a3bd81e6e57cad96543d416d1cdd88..ade42e9dea22734cdd7d96b01819ae1775d32e5b 100644 --- a/include/iri_opendrive_global_planner/opendrive_planner.h +++ b/include/iri_opendrive_global_planner/opendrive_planner.h @@ -135,6 +135,7 @@ class OpendriveGlobalPlanner : public nav_core::BaseGlobalPlanner bool initialized_; CRoadMapPlanner roadmap; + bool load_osm_paths(std::vector<TOSMPathData> &osm_paths); std::vector<unsigned int> best_path; ros::Time best_path_stamp; double start_angle_tol; @@ -143,6 +144,8 @@ class OpendriveGlobalPlanner : public nav_core::BaseGlobalPlanner double end_dist_tol; bool multi_hyp; + ros::NodeHandle private_nh; + private: void mapToWorld(double mx, double my, double& wx, double& wy); bool worldToMap(double wx, double wy, double& mx, double& my); diff --git a/src/opendrive_planner.cpp b/src/opendrive_planner.cpp index daa8b8d43b0c525b9578bd7ced64aaa957e15164..3cc125573abf1072f4b0d74dcc38f8224d78c48c 100644 --- a/src/opendrive_planner.cpp +++ b/src/opendrive_planner.cpp @@ -78,9 +78,11 @@ void OpendriveGlobalPlanner::initialize(std::string name, costmap_2d::Costmap2DR void OpendriveGlobalPlanner::initialize(std::string name, costmap_2d::Costmap2D* costmap, std::string frame_id) { + std::vector<TOSMPathData> osm_paths; + if (!initialized_) { - ros::NodeHandle private_nh("~/" + name); + this->private_nh=ros::NodeHandle("~/" + name); costmap_ = costmap; frame_id_ = frame_id; @@ -90,12 +92,12 @@ void OpendriveGlobalPlanner::initialize(std::string name, costmap_2d::Costmap2D* int cost_type; int utm_zone; - if(private_nh.getParam("resolution", resolution)) + if(this->private_nh.getParam("resolution", resolution)) this->roadmap.set_resolution(resolution); else ROS_ERROR("OpendriveGlobalPlanner: Map resolution not defined"); - if(private_nh.getParam("utm_zone", utm_zone)) + if(this->private_nh.getParam("utm_zone", utm_zone)) { //ROS_INFO("utm_zone=%d",utm_zone); this->roadmap.set_utm_zone(utm_zone); @@ -103,7 +105,7 @@ void OpendriveGlobalPlanner::initialize(std::string name, costmap_2d::Costmap2D* else ROS_ERROR("OpendriveGlobalPlanner: utm zone not defined"); - if(private_nh.getParam("opendrive_file", opendrive_file)) + if(this->private_nh.getParam("opendrive_file", opendrive_file)) { if(opendrive_file!="") { @@ -111,7 +113,12 @@ void OpendriveGlobalPlanner::initialize(std::string name, costmap_2d::Costmap2D* if(opendrive_file.find("xodr")!=std::string::npos) this->roadmap.load_opendrive(opendrive_file); else if(opendrive_file.find("osm")!=std::string::npos) - this->roadmap.load_osm(opendrive_file); + { + if(this->load_osm_paths(osm_paths)) + this->roadmap.load_osm(opendrive_file,osm_paths); + else + ROS_ERROR("Invalid OSM categories information"); + } else ROS_ERROR("Unknown file type"); this->create_opendrive_map(opendrive_file,resolution, utm_zone); @@ -122,33 +129,33 @@ void OpendriveGlobalPlanner::initialize(std::string name, costmap_2d::Costmap2D* } else ROS_ERROR("OpendriveGlobalPlanner: Opendrive map file not defined"); - if(!private_nh.getParam("opendrive_frame", this->opendrive_frame_id_)) + if(!this->private_nh.getParam("opendrive_frame", this->opendrive_frame_id_)) ROS_ERROR("OpendriveGlobalPlanner: Opendrive frame ID not defined"); - if(!private_nh.getParam("start_angle_tol", this->start_angle_tol)) + if(!this->private_nh.getParam("start_angle_tol", this->start_angle_tol)) ROS_ERROR("OpendriveGlobalPlanner: Angle tolerance for the start position not defined"); - if(!private_nh.getParam("start_dist_tol", this->start_dist_tol)) + if(!this->private_nh.getParam("start_dist_tol", this->start_dist_tol)) ROS_ERROR("OpendriveGlobalPlanner: Distance tolerance for the start position not defined"); - if(!private_nh.getParam("end_angle_tol", this->end_angle_tol)) + if(!this->private_nh.getParam("end_angle_tol", this->end_angle_tol)) ROS_ERROR("OpendriveGlobalPlanner: Angle tolerance for the end position not defined"); - if(!private_nh.getParam("end_dist_tol", this->end_dist_tol)) + if(!this->private_nh.getParam("end_dist_tol", this->end_dist_tol)) ROS_ERROR("OpendriveGlobalPlanner: Distance tolerance for the end position not defined"); - if(!private_nh.getParam("multi_hyp", this->multi_hyp)) + if(!this->private_nh.getParam("multi_hyp", this->multi_hyp)) ROS_ERROR("OpendriveGlobalPlanner: Multihypotheis feature not defined"); - if(!private_nh.getParam("cost_type",cost_type)) + if(!this->private_nh.getParam("cost_type",cost_type)) ROS_ERROR("OpendriveGlobalPlanner: Desired cost type not defined"); this->roadmap.set_cost_type((cost_t)cost_type); }catch(CException &e){ ROS_ERROR_STREAM(e.what()); } - plan_pub_ = private_nh.advertise<nav_msgs::Path>("plan", 1); - make_plan_srv_ = private_nh.advertiseService("make_plan", &OpendriveGlobalPlanner::makePlanService, this); + plan_pub_ = this->private_nh.advertise<nav_msgs::Path>("plan", 1); + make_plan_srv_ = this->private_nh.advertiseService("make_plan", &OpendriveGlobalPlanner::makePlanService, this); - this->opendrive_map_pub_ = private_nh.advertise<nav_msgs::OccupancyGrid>("opendrive_map", 1,boost::bind(&OpendriveGlobalPlanner::map_connect_callback, this, _1)); + this->opendrive_map_pub_ = this->private_nh.advertise<nav_msgs::OccupancyGrid>("opendrive_map", 1,boost::bind(&OpendriveGlobalPlanner::map_connect_callback, this, _1)); - this->opendrive_map_service=private_nh.advertiseService("get_opendrive_map", &OpendriveGlobalPlanner::get_opendrive_map,this); + this->opendrive_map_service=this->private_nh.advertiseService("get_opendrive_map", &OpendriveGlobalPlanner::get_opendrive_map,this); - this->opendrive_nodes_service=private_nh.advertiseService("get_opendrive_nodes", &OpendriveGlobalPlanner::get_opendrive_nodes,this); + this->opendrive_nodes_service=this->private_nh.advertiseService("get_opendrive_nodes", &OpendriveGlobalPlanner::get_opendrive_nodes,this); dsrv_ = new dynamic_reconfigure::Server<iri_opendrive_global_planner::OpendriveGlobalPlannerConfig>(ros::NodeHandle("~/" + name)); dynamic_reconfigure::Server<iri_opendrive_global_planner::OpendriveGlobalPlannerConfig>::CallbackType cb = boost::bind(&OpendriveGlobalPlanner::reconfigureCB, this, _1, _2); @@ -171,6 +178,7 @@ void OpendriveGlobalPlanner::create_opendrive_map(std::string &filename,double r { std::vector<double> x,partial_x,y,partial_y,heading; double max_x=std::numeric_limits<double>::min(),min_x=std::numeric_limits<double>::max(),max_y=std::numeric_limits<double>::min(),min_y=std::numeric_limits<double>::max(); + std::vector<TOSMPathData> osm_paths; CRoadMap road; this->path_access.enter(); @@ -178,7 +186,12 @@ void OpendriveGlobalPlanner::create_opendrive_map(std::string &filename,double r if(filename.find("xodr")!=std::string::npos) road.load_opendrive(filename); else if(filename.find("osm")!=std::string::npos) - road.load_osm(filename); + { + if(this->load_osm_paths(osm_paths)) + road.load_osm(filename,osm_paths); + else + return; + } else return; road.set_resolution(resolution); @@ -237,6 +250,8 @@ bool OpendriveGlobalPlanner::get_opendrive_nodes(iri_nav_module::get_opendrive_n void OpendriveGlobalPlanner::reconfigureCB(iri_opendrive_global_planner::OpendriveGlobalPlannerConfig& new_config, uint32_t level) { + std::vector<TOSMPathData> osm_paths; + try{ boost::mutex::scoped_lock lock(mutex_); this->roadmap.set_resolution(new_config.resolution); @@ -251,7 +266,12 @@ void OpendriveGlobalPlanner::reconfigureCB(iri_opendrive_global_planner::Opendri if(new_config.opendrive_file.find("xodr")!=std::string::npos) roadmap.load_opendrive(new_config.opendrive_file); else if(new_config.opendrive_file.find("osm")!=std::string::npos) - roadmap.load_osm(new_config.opendrive_file); + { + if(this->load_osm_paths(osm_paths)) + roadmap.load_osm(new_config.opendrive_file,osm_paths); + else + ROS_ERROR("Invalid OSM categories information"); + } else ROS_ERROR("Unknown file type"); this->create_opendrive_map(new_config.opendrive_file,new_config.resolution, new_config.utm_zone); @@ -496,4 +516,39 @@ void OpendriveGlobalPlanner::publishPlan(const std::vector<geometry_msgs::PoseSt plan_pub_.publish(gui_path); } +bool OpendriveGlobalPlanner::load_osm_paths(std::vector<TOSMPathData> &osm_paths) +{ + std::vector<std::string> categories; + std::string name_space; + + /* get the list of categories */ + if(!this->private_nh.getParam("highway_categories", categories)) + return false; + osm_paths.resize(categories.size()); + for(unsigned int i=0;i<categories.size();i++) + { + osm_paths[i].name=categories[i]; + name_space=categories[i]+"/highways"; + if(!this->private_nh.getParam(name_space,osm_paths[i].highways)) + return false; + name_space=categories[i]+"/keys"; + if(!this->private_nh.getParam(name_space,osm_paths[i].keys)) + return false; + name_space=categories[i]+"/min_turn_radius"; + if(!this->private_nh.getParam(name_space,osm_paths[i].min_turn_radius)) + return false; + name_space=categories[i]+"/min_road_length"; + if(!this->private_nh.getParam(name_space,osm_paths[i].min_road_length)) + return false; + name_space=categories[i]+"/use_default_lane_width"; + if(!this->private_nh.getParam(name_space,osm_paths[i].use_default_lane_width)) + return false; + name_space=categories[i]+"/force_twoways"; + if(!this->private_nh.getParam(name_space,osm_paths[i].force_two_ways)) + return false; + } + + return true; +} + } //end namespace iri_opendrive_global_planner