diff --git a/cfg/OpendriveGlobalPlanner.cfg b/cfg/OpendriveGlobalPlanner.cfg index c17e7228c45a0dcb2e7c19956e35da18f001c1d3..0daa06cef3713644b8454e0c5d6c7cb3cc7959a7 100755 --- a/cfg/OpendriveGlobalPlanner.cfg +++ b/cfg/OpendriveGlobalPlanner.cfg @@ -16,6 +16,8 @@ gen.add("angle_tol", double_t, 0, "Angle tolerance to find start and end positio gen.add("dist_tol", double_t, 0, "Distance tolerance to find start and end positions on the road map", 3.0, 0.5, 10.0) gen.add("multi_hyp", bool_t, 0, "Use multi hypothesis path search", False) gen.add("resolution", double_t, 0, "Resolution of the generated path", 0.1, 0.01, 1.0) +gen.add("scale_factor", double_t, 0, "Scale factor of the input road description", 1.0, 0.01, 10.0) +gen.add("min_road_length", double_t, 0, "Minimum road length to take it into account", 0.1, 0.01, 1.0) gen.add("cost_type", int_t, 0, "Cost type", 0, 0, 1, edit_method=enum_cost_type) exit(gen.generate(PACKAGE, "iri_opendrive_global_planner", "OpendriveGlobalPlanner")) diff --git a/src/opendrive_planner.cpp b/src/opendrive_planner.cpp index ed3847ab53310ce1be3483b22b438ce47a92e8e4..620432447b4d75a4cb3759fb256548bf8dec6ada 100644 --- a/src/opendrive_planner.cpp +++ b/src/opendrive_planner.cpp @@ -75,6 +75,8 @@ void OpendriveGlobalPlanner::initialize(std::string name, costmap_2d::Costmap2DR void OpendriveGlobalPlanner::initialize(std::string name, costmap_2d::Costmap2D* costmap, std::string frame_id) { + double value; + if (!initialized_) { ros::NodeHandle private_nh("~/" + name); @@ -83,15 +85,19 @@ void OpendriveGlobalPlanner::initialize(std::string name, costmap_2d::Costmap2D* try{ std::string opendrive_file; + private_nh.param("resolution", value,0.0); + this->roadmap.set_resolution(value); + private_nh.param("scale_factor", value,0.0); + this->roadmap.set_scale_factor(value); + private_nh.param("min_road_length", value,0.0); + this->roadmap.set_min_road_length(value); private_nh.param("opendrive_file", opendrive_file,std::string("")); if(opendrive_file!="") this->roadmap.load(opendrive_file); - double resolution; - private_nh.param("resolution", resolution,0.0); - this->roadmap.set_resolution(resolution); private_nh.param("angle_tol", this->angle_tol,DEFAULT_ANGLE_THRESHOLD); private_nh.param("dist_tol", this->dist_tol,DEFAULT_DIST_THRESHOLD); private_nh.param("multi_hyp", this->multi_hyp,false); + std::cout << "multi hypothessis: " << this->multi_hyp << std::endl; int cost_type; private_nh.param("cost_type",cost_type,(int)COST_DIST); this->roadmap.set_cost_type((cost_t)cost_type); @@ -114,13 +120,15 @@ void OpendriveGlobalPlanner::initialize(std::string name, costmap_2d::Costmap2D* void OpendriveGlobalPlanner::reconfigureCB(iri_opendrive_global_planner::OpendriveGlobalPlannerConfig& new_config, uint32_t level) { try{ - if(new_config.opendrive_file!=this->config.opendrive_file) + this->roadmap.set_resolution(new_config.resolution); + this->roadmap.set_scale_factor(new_config.scale_factor); + this->roadmap.set_min_road_length(new_config.min_road_length); + if(new_config.opendrive_file!=this->config.opendrive_file || new_config.scale_factor!=this->config.scale_factor || new_config.min_road_length!=this->config.min_road_length) this->roadmap.load(new_config.opendrive_file); this->angle_tol=new_config.angle_tol; this->dist_tol=new_config.dist_tol; this->multi_hyp=new_config.multi_hyp; this->config=new_config; - this->roadmap.set_resolution(new_config.resolution); this->roadmap.set_cost_type((cost_t)new_config.cost_type); }catch(CException &e){ ROS_ERROR_STREAM(e.what()); @@ -179,10 +187,13 @@ bool OpendriveGlobalPlanner::makePlan(const geometry_msgs::PoseStamped& start, c bool OpendriveGlobalPlanner::makePlan(const geometry_msgs::PoseStamped& start, const geometry_msgs::PoseStamped& goal,double tolerance, std::vector<geometry_msgs::PoseStamped>& plan) { - double yaw,cost; + double yaw,best_cost; unsigned int best_path_index; - std::vector<unsigned int> path; + std::vector<unsigned int> best_path; std::vector<double> x,y,heading; + std::vector< std::vector<unsigned int> > paths; + std::vector<double> costs; + std::vector<TMapPose> start_candidates,end_candidates; boost::mutex::scoped_lock lock(mutex_); if (!initialized_) { @@ -232,14 +243,38 @@ bool OpendriveGlobalPlanner::makePlan(const geometry_msgs::PoseStamped& start, c ROS_WARN("Make Plan"); yaw=tf2::getYaw(start.pose.orientation); this->roadmap.set_start_pose(start.pose.position.x,start.pose.position.y,yaw,this->dist_tol,this->angle_tol); + this->roadmap.get_start_pose_candidates(start_candidates); + std::cout << "Start pose candidates: " << std::endl; + for(unsigned int i=0;i<start_candidates.size();i++) + { + std::cout << i << ". x: " << start_candidates[i].pose.x << ", y:" << start_candidates[i].pose.y << ", heading: " << start_candidates[i].pose.heading << std::endl; + std::cout << " road map node: " << start_candidates[i].node_index << " child: " << start_candidates[i].child_index << std::endl; + std::cout << " distance from desired pose: " << start_candidates[i].dist << std::endl; + } yaw=tf2::getYaw(goal.pose.orientation); this->roadmap.set_end_pose(goal.pose.position.x,goal.pose.position.y,yaw,this->dist_tol,this->angle_tol); + this->roadmap.get_end_pose_candidates(end_candidates); + std::cout << "End pose candidates: " << std::endl; + for(unsigned int i=0;i<end_candidates.size();i++) + { + std::cout << i << ". x: " << end_candidates[i].pose.x << ", y:" << end_candidates[i].pose.y << ", heading: " << end_candidates[i].pose.heading << std::endl; + std::cout << " road map node: " << end_candidates[i].node_index << " child: " << end_candidates[i].child_index << std::endl; + std::cout << " distance from desired pose: " << end_candidates[i].dist << std::endl; + } this->roadmap.find_shortest_path(this->multi_hyp); - best_path_index=this->roadmap.get_best_path(cost,path); -// std::cout << "best path index: " << best_path_index << std::endl; -// for(unsigned int i=0;i<path.size();i++) -// std::cout << path[i] << ","; -// std::cout << std::endl; + this->roadmap.get_paths(costs,paths); + for(unsigned int i=0;i<paths.size();i++) + { + std::cout << "path " << i << ":" << std::endl; + for(unsigned int j=0;j<paths[i].size();j++) + std::cout << paths[i][j] << ","; + std::cout << std::endl; + } + best_path_index=this->roadmap.get_best_path(best_cost,best_path); + std::cout << "best path index: " << best_path_index << std::endl; + for(unsigned int i=0;i<best_path.size();i++) + std::cout << best_path[i] << ","; + std::cout << std::endl; this->roadmap.get_trajectory(best_path_index,x,y,heading); plan.resize(x.size()); ros::Time plan_time=ros::Time::now();