diff --git a/include/ackermann_planner.h b/include/ackermann_planner.h index f07e6b94bc18802325b9c83af979e38d18975270..496f78492286f4f7847f74b02851d35bd1c0eef7 100644 --- a/include/ackermann_planner.h +++ b/include/ackermann_planner.h @@ -101,7 +101,7 @@ class AckermannPlanner * @brief Take in a new global plan for the local planner to follow, and adjust local costmaps * @param new_plan The new global plan */ - void update_plan_and_local_costs(geometry_msgs::PoseStamped &global_pose,const std::vector<geometry_msgs::PoseStamped>& new_plan); + void update_plan_and_local_costs(geometry_msgs::PoseStamped &global_pose,const std::vector<geometry_msgs::PoseStamped>& new_plan,bool forward); /** * @brief Compute the components and total cost for a map grid cell @@ -130,6 +130,7 @@ class AckermannPlanner base_local_planner::Trajectory result_traj_; std::vector<geometry_msgs::PoseStamped> global_plan_; + bool plan_forward; boost::mutex configuration_mutex_; std::string frame_id_; diff --git a/include/ackermann_planner_util.h b/include/ackermann_planner_util.h index 862cc76015883d886839c803fae87e281f6584e3..1025232b205b392982da94176dd23ea993e4578c 100644 --- a/include/ackermann_planner_util.h +++ b/include/ackermann_planner_util.h @@ -62,11 +62,13 @@ class AckermannPlannerUtil tf2_ros::Buffer *tf_; std::vector<geometry_msgs::PoseStamped> global_plan_; + bool plan_forward; bool initialized_; std::vector < std::vector<geometry_msgs::PoseStamped> > subPathList; std::vector < geometry_msgs::PoseStamped > subPath; + std::vector < bool > forward_segment; unsigned int subPathIndex; iri_ackermann_local_planner::AckermannLocalPlannerConfig default_config_; @@ -90,7 +92,7 @@ class AckermannPlannerUtil bool last_path(void); - bool get_local_plan(geometry_msgs::PoseStamped& global_pose, std::vector<geometry_msgs::PoseStamped>& transformed_plan); + bool get_local_plan(geometry_msgs::PoseStamped& global_pose, std::vector<geometry_msgs::PoseStamped>& transformed_plan, bool &forward); costmap_2d::Costmap2D* get_costmap(); diff --git a/include/ackermann_spline_generator.h b/include/ackermann_spline_generator.h index e30b934269ee4b0a9631f4ba13acb04787737bb3..46d1c3e744136e47fd7aafe1de70115a4f1ffaf2 100644 --- a/include/ackermann_spline_generator.h +++ b/include/ackermann_spline_generator.h @@ -69,7 +69,7 @@ class AckermannSplineGenerator: public base_local_planner::TrajectorySampleGener */ bool nextTrajectory(base_local_planner::Trajectory &traj); - void initialise(const Eigen::Vector3f& pos,const Eigen::Vector3f& ackermann,const Eigen::Vector3f& goal); + void initialise(const Eigen::Vector3f& pos,const Eigen::Vector3f& ackermann,const Eigen::Vector3f& goal,bool forward); void set_sim_period(double period); @@ -82,6 +82,7 @@ class AckermannSplineGenerator: public base_local_planner::TrajectorySampleGener Eigen::Vector3f pos_; Eigen::Vector3f goal_pos_; Eigen::Vector3f ackermann_; + bool forward; double sim_period_; }; diff --git a/src/ackermann_planner.cpp b/src/ackermann_planner.cpp index 8bcada87d4dac4d970221bb2a71f05ec75fcdf9a..dc83b217534dcc57fbc5b9c5fc2abda6e98909e4 100644 --- a/src/ackermann_planner.cpp +++ b/src/ackermann_planner.cpp @@ -83,7 +83,7 @@ void AckermannPlanner::reconfigure(iri_ackermann_local_planner::AckermannLocalPl AckermannPlanner::AckermannPlanner(std::string name,AckermannPlannerUtil *planner_util) : planner_util_(planner_util), obstacle_costs_(planner_util->get_costmap()), - path_costs_(planner_util->get_costmap()), + path_costs_(planner_util->get_costmap(), 0.0, 0.0, false,base_local_planner::Sum), goal_costs_(planner_util->get_costmap(), 0.0, 0.0, true) { ros::NodeHandle private_nh("~/" + name); @@ -176,11 +176,12 @@ bool AckermannPlanner::set_plan(const std::vector<geometry_msgs::PoseStamped>& o return planner_util_->set_plan(orig_global_plan); } -void AckermannPlanner::update_plan_and_local_costs(geometry_msgs::PoseStamped &global_pose,const std::vector<geometry_msgs::PoseStamped>& new_plan) +void AckermannPlanner::update_plan_and_local_costs(geometry_msgs::PoseStamped &global_pose,const std::vector<geometry_msgs::PoseStamped>& new_plan,bool forward) { global_plan_.resize(new_plan.size()); for (unsigned int i = 0; i < new_plan.size(); ++i) global_plan_[i] = new_plan[i]; + plan_forward=forward; // costs for going away from path path_costs_.setTargetPoses(global_plan_); @@ -189,10 +190,6 @@ void AckermannPlanner::update_plan_and_local_costs(geometry_msgs::PoseStamped &g goal_costs_.setTargetPoses(global_plan_); heading_costs_.set_global_plan(global_plan_); - - // alignment costs - geometry_msgs::PoseStamped goal_pose = global_plan_.back(); - } /* @@ -212,14 +209,13 @@ base_local_planner::Trajectory AckermannPlanner::find_best_path(geometry_msgs::P // prepare cost functions and generators for this run generator_.initialise(pos,ack_state,goal); - spline_generator_.initialise(pos,ack_state,goal); + spline_generator_.initialise(pos,ack_state,goal,plan_forward); result_traj_.cost_ = -7; // find best trajectory by sampling and scoring the samples std::vector<base_local_planner::Trajectory> all_explored; scored_sampling_planner_.findBestTrajectory(result_traj_, &all_explored); - std::cout << "all explored: " << all_explored.size() << std::endl; if(publish_traj_pc_) { sensor_msgs::PointCloud2 traj_cloud; @@ -287,18 +283,18 @@ base_local_planner::Trajectory AckermannPlanner::find_best_path(geometry_msgs::P else { std::cout << result_traj_.xv_ << "," << result_traj_.thetav_ << std::endl; -// drive_velocities.pose.position.x = result_traj_.xv_; -// drive_velocities.pose.position.y = result_traj_.yv_; -// drive_velocities.pose.position.z = 0.0; -// tf2::Quaternion q; -// q.setRPY(0, 0, result_traj_.thetav_); -// tf2::convert(q, drive_velocities.pose.orientation); - drive_velocities.pose.position.x = 0.0; - drive_velocities.pose.position.y = 0.0; + drive_velocities.pose.position.x = result_traj_.xv_; + drive_velocities.pose.position.y = result_traj_.yv_; drive_velocities.pose.position.z = 0.0; tf2::Quaternion q; - q.setRPY(0, 0, 0); + q.setRPY(0, 0, result_traj_.thetav_); tf2::convert(q, drive_velocities.pose.orientation); +// drive_velocities.pose.position.x = 0.0; +// drive_velocities.pose.position.y = 0.0; +// drive_velocities.pose.position.z = 0.0; +// tf2::Quaternion q; +// q.setRPY(0, 0, 0); +// tf2::convert(q, drive_velocities.pose.orientation); } return result_traj_; diff --git a/src/ackermann_planner_ros.cpp b/src/ackermann_planner_ros.cpp index 6f8c48851a56a73d96aab8d602d1e48f11c5e099..8ebd7d5d4822f17d29acd6d1cee80c7cf42941c9 100644 --- a/src/ackermann_planner_ros.cpp +++ b/src/ackermann_planner_ros.cpp @@ -239,6 +239,7 @@ bool AckermannPlannerROS::ackermann_compute_velocity_commands(geometry_msgs::Pos bool AckermannPlannerROS::isGoalReached(void) { nav_msgs::Odometry odom; + bool forward; if (! is_initialized()) { ROS_ERROR("AckermannPlannerROS: this planner has not been initialized, please call initialize() before using this planner"); @@ -249,7 +250,7 @@ bool AckermannPlannerROS::isGoalReached(void) return false; } std::vector<geometry_msgs::PoseStamped> transformed_plan; - if ( ! planner_util_.get_local_plan(current_pose_, transformed_plan)) + if ( ! planner_util_.get_local_plan(current_pose_, transformed_plan,forward)) { ROS_ERROR("AckermannPlannerROS: could not get local plan"); return false; @@ -313,6 +314,7 @@ bool AckermannPlannerROS::computeVelocityCommands(geometry_msgs::Twist& cmd_vel) static int stuck_count=0; static int replan_count=0; static bool new_segment=false; + bool forward; // dispatches to either ackermann sampling control or stop and rotate control, depending on whether we have been close enough to goal if ( ! costmap_ros_->getRobotPose(current_pose_)) @@ -328,7 +330,7 @@ bool AckermannPlannerROS::computeVelocityCommands(geometry_msgs::Twist& cmd_vel) return false; } std::vector<geometry_msgs::PoseStamped> transformed_plan; - if ( ! planner_util_.get_local_plan(current_pose_, transformed_plan)) + if ( ! planner_util_.get_local_plan(current_pose_, transformed_plan,forward)) { ROS_ERROR("AckermannPlannerROS: could not get local plan"); cmd_vel.linear.x = 0.0; @@ -357,7 +359,7 @@ bool AckermannPlannerROS::computeVelocityCommands(geometry_msgs::Twist& cmd_vel) ROS_DEBUG_NAMED("ackermann_local_planner", "Received a transformed plan with %zu points.", transformed_plan.size()); // update plan in ackermann_planner even if we just stop and rotate, to allow checkTrajectory - dp_->update_plan_and_local_costs(current_pose_, transformed_plan); + dp_->update_plan_and_local_costs(current_pose_, transformed_plan,forward); odom_helper_.get_odom(odom); if(this->stuck || base_local_planner::isGoalReached(*tf_, @@ -483,17 +485,7 @@ bool AckermannPlannerROS::computeVelocityCommands(geometry_msgs::Twist& cmd_vel) } if (isOk) - { publish_global_plan(transformed_plan); - // TODO: apply the deadzone before the trajectory generation and evaluation - if(current_config_.use_trans_vel_deadzone && fabs(cmd_vel.linear.x)<current_config_.trans_vel_deadzone) - { - if(cmd_vel.linear.x>0.0) - cmd_vel.linear.x=current_config_.trans_vel_deadzone; - else if(cmd_vel.linear.x<0.0) - cmd_vel.linear.x=-current_config_.trans_vel_deadzone; - } - } else { ROS_WARN_NAMED("ackermann_local_planner", "Ackermann planner failed to produce path."); diff --git a/src/ackermann_planner_util.cpp b/src/ackermann_planner_util.cpp index a9f19098a517e385de8bad40a695c7ae7ef5d552..d79cd196bd926dbd73ed5e1fd87bd19fe130e2cd 100644 --- a/src/ackermann_planner_util.cpp +++ b/src/ackermann_planner_util.cpp @@ -36,6 +36,7 @@ *********************************************************************/ #include <ackermann_planner_util.h> +#include <tf/transform_datatypes.h> #include <base_local_planner/goal_functions.h> @@ -99,8 +100,9 @@ bool AckermannPlannerUtil::set_plan(const std::vector<geometry_msgs::PoseStamped ////divide plan by manuveurs subPathList.clear(); subPath.clear(); + forward_segment.clear(); subPathIndex = 0; - double pathLength = 0; + double pathLength = 0, yaw; for(unsigned int i = 0; i < orig_global_plan.size(); ++i) { if(i>2 && i<(orig_global_plan.size()-1)) @@ -118,7 +120,7 @@ bool AckermannPlannerUtil::set_plan(const std::vector<geometry_msgs::PoseStamped double angle=((x0-x1)*(x1-x2)+(y0-y1)*(y1-y2))/(std::sqrt(std::pow(x0-x1,2)+std::pow(y0-y1,2))*std::sqrt(std::pow(x1-x2,2)+std::pow(y1-y2,2))); double curvature; curvature=((x_1-x0)*(y0-2*y1+y2)-(x0-2*x1+x2)*(y_1-y0))/sqrt(pow(pow(x_1-x0,2.0)+pow(y_1-y0,2.0),3.0)); - std::cout << curvature << std::endl; +// std::cout << curvature << std::endl; if(angle<-1.0) angle=-1.0; else if(angle>1.0) @@ -138,6 +140,19 @@ bool AckermannPlannerUtil::set_plan(const std::vector<geometry_msgs::PoseStamped if(pathLength>current_config_.split_ignore_length) { //ROS_INFO("AckermannPlannerUtil::setPlan: subPath split at i=%d, angle=%f, length=%f", i, angle, pathLength); + yaw=tf::getYaw(subPath[0].pose.orientation); + if(yaw<0.0) + yaw+=3.14159*2.0; + if(((subPath[subPath.size()-1].pose.position.x-subPath[0].pose.position.x)*cos(yaw)+(subPath[subPath.size()-1].pose.position.y-subPath[0].pose.position.y)*sin(yaw))<0.0) + { + std::cout << "backward segment" << std::endl; + this->forward_segment.push_back(false); + } + else + { + std::cout << "forward segment" << std::endl; + this->forward_segment.push_back(true); + } subPathList.push_back(subPath); } else //ignored subpath, too short @@ -151,6 +166,19 @@ bool AckermannPlannerUtil::set_plan(const std::vector<geometry_msgs::PoseStamped } subPath.push_back(orig_global_plan[i]); } + yaw=tf::getYaw(subPath[0].pose.orientation); + if(yaw<0.0) + yaw+=3.14159*2.0; + if(((subPath[subPath.size()-1].pose.position.x-subPath[0].pose.position.x)*cos(yaw)+(subPath[subPath.size()-1].pose.position.y-subPath[0].pose.position.y)*sin(yaw))<0.0) + { + std::cout << "backward segment" << std::endl; + this->forward_segment.push_back(false); + } + else + { + std::cout << "forward segment" << std::endl; + this->forward_segment.push_back(true); + } subPathList.push_back(subPath); //ROS_INFO("AckermannPlannerUtil::setPlan: subPath last length=%f", pathLength); ROS_INFO("AckermannPlannerUtil::setPlan: Global plan (%lu points) split in %lu paths", orig_global_plan.size(), subPathList.size()); @@ -159,6 +187,7 @@ bool AckermannPlannerUtil::set_plan(const std::vector<geometry_msgs::PoseStamped global_plan_.clear(); global_plan_ = subPathList[subPathIndex]; + this->plan_forward=this->forward_segment[subPathIndex]; return true; } @@ -171,6 +200,7 @@ bool AckermannPlannerUtil::set_next_path(void) subPathIndex++; global_plan_.clear(); global_plan_ = subPathList[subPathIndex]; + this->plan_forward=this->forward_segment[subPathIndex]; return true; } else @@ -186,7 +216,7 @@ bool AckermannPlannerUtil::last_path(void) return false; } -bool AckermannPlannerUtil::get_local_plan(geometry_msgs::PoseStamped& global_pose, std::vector<geometry_msgs::PoseStamped>& transformed_plan) +bool AckermannPlannerUtil::get_local_plan(geometry_msgs::PoseStamped& global_pose, std::vector<geometry_msgs::PoseStamped>& transformed_plan,bool &forward) { global_pose.header.stamp-=ros::Duration(1.0); @@ -200,6 +230,8 @@ bool AckermannPlannerUtil::get_local_plan(geometry_msgs::PoseStamped& global_pos if(current_config_.prune_plan) base_local_planner::prunePlan(global_pose, transformed_plan, global_plan_); + forward=plan_forward; + return true; } diff --git a/src/ackermann_spline_generator.cpp b/src/ackermann_spline_generator.cpp index 0867043113a8b3d6ad762718625a623a54174a17..c29da3bd870ddb5094c1a566238216d06c205110 100644 --- a/src/ackermann_spline_generator.cpp +++ b/src/ackermann_spline_generator.cpp @@ -51,15 +51,15 @@ AckermannSplineGenerator::AckermannSplineGenerator() } void AckermannSplineGenerator::initialise( - const Eigen::Vector3f& pos, - const Eigen::Vector3f& ackermann,//[0] -> trans_vel, [1]-> steer_angle, [2]-> steer_vel - const Eigen::Vector3f& goal) + const Eigen::Vector3f& pos, + const Eigen::Vector3f& ackermann,//[0] -> trans_vel, [1]-> steer_angle, [2]-> steer_vel + const Eigen::Vector3f& goal, + bool forward) { double diff_x,diff_y; double min_n1,max_n1,min_n2,max_n2,min_n3,max_n3,min_n4,max_n4; double current_n1,current_n2,current_n3,current_n4; - std::cout << "initialize" << std::endl; pos_=pos; ackermann_=ackermann; goal_pos_=goal; @@ -79,11 +79,8 @@ void AckermannSplineGenerator::initialise( for(double current_n2=min_n2;current_n2<=max_n2;current_n2+=(max_n2-min_n2)/(current_config_.n2_samples-1)) for(double current_n3=min_n3;current_n3<=max_n3;current_n3+=(max_n3-min_n3)/(current_config_.n3_samples-1)) for(double current_n4=min_n4;current_n4<=max_n4;current_n4+=(max_n4-min_n4)/(current_config_.n4_samples-1)) - { - samples_.push_back(Eigen::Vector4f(current_n1,current_n2,current_n3,current_n4)); - std::cout << "generate: " << current_n1 << "," << current_n2 << "," << current_n3 << "," << current_n4 << std::endl; - } + this->forward=forward; } void AckermannSplineGenerator::reconfigure(iri_ackermann_local_planner::AckermannLocalPlannerConfig &cfg) @@ -110,19 +107,25 @@ bool AckermannSplineGenerator::nextTrajectory(base_local_planner::Trajectory &co start.x=pos_(0); start.y=pos_(1); - start.heading=pos_(2); + if(this->forward) + start.heading=pos_(2); + else + start.heading=pos_(2)+3.14159; if(fabs(ackermann_(1))<0.001) start.curvature=0.0; else start.curvature=tan(ackermann_(1))/current_config_.axis_distance; spline_.set_start_point(start); - std::cout << "start position: " << pos_(0) << "," << pos_(1) << "," << pos_(2) << "," << start.curvature << std::endl;; +// std::cout << "start position: " << pos_(0) << "," << pos_(1) << "," << pos_(2) << "," << start.curvature << std::endl; end.x=goal_pos_(0); end.y=goal_pos_(1); - end.heading=goal_pos_(2); + if(this->forward) + end.heading=goal_pos_(2); + else + end.heading=goal_pos_(2)+3.14159; end.curvature=0.0; spline_.set_end_point(end); - std::cout << "end position: " << goal_pos_(0) << "," << goal_pos_(1) << "," << goal_pos_(2) << "," << end.curvature << std::endl; +// std::cout << "end position: " << goal_pos_(0) << "," << goal_pos_(1) << "," << goal_pos_(2) << "," << end.curvature << std::endl; resolution=current_config_.sim_granularity; spline_.generate(resolution,samples_[next_sample_index_](0),samples_[next_sample_index_](1),samples_[next_sample_index_](2),samples_[next_sample_index_](3)); spline_.evaluate_all(x,y,curvature,heading); @@ -132,7 +135,7 @@ bool AckermannSplineGenerator::nextTrajectory(base_local_planner::Trajectory &co for(unsigned int i=0;i<curvature.size();i++) if(curvature[i]>k_max) k_max=curvature[i]; - max_curvature=tan(std::max(current_config_.max_steer_angle,fabs(current_config_.min_steer_angle)))/current_config_.axis_distance; + max_curvature=tan(std::max(current_config_.max_steer_angle,fabs(current_config_.min_steer_angle)))/fabs(current_config_.axis_distance); next_sample_index_++; // if(k_max>max_curvature) // { @@ -152,11 +155,13 @@ bool AckermannSplineGenerator::nextTrajectory(base_local_planner::Trajectory &co else k_max_speed=sqrt(current_config_.comfort_lat_acc/fabs(k_max)); min_max_speed=std::min(current_config_.max_trans_vel,k_max_speed); - std::cout << ackermann_(0) << "," << min_max_speed << "," << current_config_.max_trans_vel << "," << k_max_speed << std::endl; +// std::cout << ackermann_(0) << "," << min_max_speed << "," << current_config_.max_trans_vel << "," << k_max_speed << std::endl; try{ if(vel_profile.generate(fabs(ackermann_(0)),0.0,min_max_speed,current_config_.max_trans_acc,spline_.get_length(),new_start_vel,new_max_vel)) { vel_profile.evaluate_at_time(sim_period_,comp_traj.xv_,acceleration,length); + if(!this->forward) + comp_traj.xv_*=-1.0; std::cout << "speed at " << sim_period_ << ": " << comp_traj.xv_ << std::endl; comp_traj.yv_=0.0; point=spline_.evaluate(length); @@ -166,9 +171,14 @@ bool AckermannSplineGenerator::nextTrajectory(base_local_planner::Trajectory &co else steer_angle=atan2(current_config_.axis_distance,1.0/point.curvature); std::cout << "steer angle: " << steer_angle << std::endl; + if(steer_angle>1.5707) + steer_angle-=3.14159; if(current_config_.use_steer_angle_cmd) { - comp_traj.thetav_ = steer_angle; + if(forward) + comp_traj.thetav_ = steer_angle; + else + comp_traj.thetav_ = -steer_angle; if(comp_traj.thetav_>current_config_.max_steer_angle) comp_traj.thetav_=current_config_.max_steer_angle; else if(comp_traj.thetav_<current_config_.min_steer_angle) @@ -180,14 +190,14 @@ bool AckermannSplineGenerator::nextTrajectory(base_local_planner::Trajectory &co for(unsigned int i=0;i<x.size();i++) { comp_traj.addPoint(x[i],y[i],heading[i]); - std::cout << x[i] << "," << y[i] << "," << heading[i] << "," << curvature[i] << std::endl; +// std::cout << x[i] << "," << y[i] << "," << heading[i] << "," << curvature[i] << std::endl; } return true; } else return false; }catch(CException &e){ - ROS_INFO_STREAM(e.what()); + //ROS_INFO_STREAM(e.what()); return false; } // } diff --git a/src/ackermann_trajectory_generator.cpp b/src/ackermann_trajectory_generator.cpp index c295941f9db6e5b228530dc5a97568473e556c33..85a77ca0ceddc185a4997864b8e0bdae3d1edb8c 100644 --- a/src/ackermann_trajectory_generator.cpp +++ b/src/ackermann_trajectory_generator.cpp @@ -247,13 +247,16 @@ void AckermannTrajectoryGenerator::initialise( base_local_planner::VelocityIterator steer_angle_it(min_steer_angle, max_steer_angle, steer_angle_angular_vel_samp); for(; !trans_vel_it.isFinished(); trans_vel_it++) { - sample[0] = trans_vel_it.getVelocity(); - for(; !steer_angle_it.isFinished(); steer_angle_it++) + if(!current_config_.use_trans_vel_deadzone || (current_config_.use_trans_vel_deadzone && trans_vel_it.getVelocity()>current_config_.trans_vel_deadzone)) { - sample[1] = steer_angle_it.getVelocity(); - sample_params_.push_back(sample); + sample[0] = trans_vel_it.getVelocity(); + for(; !steer_angle_it.isFinished(); steer_angle_it++) + { + sample[1] = steer_angle_it.getVelocity(); + sample_params_.push_back(sample); + } + steer_angle_it.reset(); } - steer_angle_it.reset(); } } diff --git a/src/ackermann_trajectory_search.cpp b/src/ackermann_trajectory_search.cpp index 0da364348986de436a760fc57cd339f4ca6e89f2..7ba497220a48054eab38d3c50e072c3485a6e02e 100644 --- a/src/ackermann_trajectory_search.cpp +++ b/src/ackermann_trajectory_search.cpp @@ -61,7 +61,7 @@ double AckermannTrajectorySearch::scoreTrajectory(base_local_planner::Trajectory double cost = score_function_p->scoreTrajectory(traj); if (cost < 0) { - ROS_INFO("Velocity %.3lf, %.3lf, %.3lf discarded by cost function %d with cost: %f", traj.xv_, traj.yv_, traj.thetav_, gen_id, cost); + ROS_DEBUG("Velocity %.3lf, %.3lf, %.3lf discarded by cost function %d with cost: %f", traj.xv_, traj.yv_, traj.thetav_, gen_id, cost); traj_cost = cost; break; } @@ -75,7 +75,7 @@ double AckermannTrajectorySearch::scoreTrajectory(base_local_planner::Trajectory break; } gen_id ++; - ROS_INFO("Velocity %.3lf, %.3lf, %.3lf evaluated by cost function %d with cost: %f (best cost: %f)", traj.xv_, traj.yv_, traj.thetav_, gen_id, cost,best_traj_cost); + ROS_DEBUG("Velocity %.3lf, %.3lf, %.3lf evaluated by cost function %d with cost: %f (best cost: %f)", traj.xv_, traj.yv_, traj.thetav_, gen_id, cost,best_traj_cost); } return traj_cost; @@ -104,7 +104,6 @@ bool AckermannTrajectorySearch::findBestTrajectory(base_local_planner::Trajector count = 0; count_valid = 0; base_local_planner::TrajectorySampleGenerator* gen_ = *loop_gen; - std::cout << "find trajectory" << std::endl; while (gen_->hasMoreTrajectories()) { gen_success = gen_->nextTrajectory(loop_traj); @@ -114,7 +113,6 @@ bool AckermannTrajectorySearch::findBestTrajectory(base_local_planner::Trajector continue; } loop_traj_cost = scoreTrajectory(loop_traj, best_traj_cost); - std::cout << "cost: " << loop_traj_cost << std::endl; if (all_explored != NULL) { loop_traj.cost_ = loop_traj_cost; @@ -131,10 +129,7 @@ bool AckermannTrajectorySearch::findBestTrajectory(base_local_planner::Trajector } count++; if (max_samples_ > 0 && count >= max_samples_) - { - std::cout << "Max sample limit" << std::endl; break; - } } if (best_traj_cost >= 0) {