diff --git a/src/ackermann_spline_generator.cpp b/src/ackermann_spline_generator.cpp index 92529f9c7d3ccafc25ca3ab3b48ac0a6ea3cb59d..b30042fa6752f389666e70d17c36c625b96d0058 100644 --- a/src/ackermann_spline_generator.cpp +++ b/src/ackermann_spline_generator.cpp @@ -84,53 +84,57 @@ void AckermannSplineGenerator::initialise( unsigned int int_step,current_index,num_samples; TSplineSample new_sample; - this->forward=forward; - this->current_plan=current_plan; - pos_=pos; - ackermann_=ackermann; - goal_pos_=goal; - next_sample_index_=0; - min_n1=0.0; - min_n2=0.0; - min_n3=0.0; - max_n3=0.0; - min_n4=0.0; - max_n4=0.0; - samples_.clear(); - current_index=this->get_path_closest_pose(current_x,current_y); - step=(current_plan.size()-current_index)/current_config_.dist_samples; - if(step<current_config_.min_segment_points) - { - num_samples=(current_plan.size()-current_index)/current_config_.min_segment_points; - if(num_samples==0) + try{ + this->forward=forward; + this->current_plan=current_plan; + pos_=pos; + ackermann_=ackermann; + goal_pos_=goal; + next_sample_index_=0; + min_n1=0.0; + min_n2=0.0; + min_n3=0.0; + max_n3=0.0; + min_n4=0.0; + max_n4=0.0; + samples_.clear(); + current_index=this->get_path_closest_pose(current_x,current_y); + step=(current_plan.size()-current_index)/current_config_.dist_samples; + if(step<current_config_.min_segment_points) { - num_samples=1; - step=(current_plan.size()-current_index); + num_samples=(current_plan.size()-current_index)/current_config_.min_segment_points; + if(num_samples==0) + { + num_samples=1; + step=(current_plan.size()-current_index); + } + else + step=(current_plan.size()-current_index)/num_samples; } else - step=(current_plan.size()-current_index)/num_samples; - } - else - num_samples=current_config_.dist_samples; - for(unsigned int i=0;i<num_samples;i++) - { - int_step=current_index+(unsigned int)(step*(i+1)); - Eigen::Vector3f tmp_goal=Eigen::Vector3f(current_plan[int_step-1].pose.position.x,current_plan[int_step-1].pose.position.y,tf::getYaw(current_plan[int_step-1].pose.orientation)); - diff_x=sqrt(pow(tmp_goal(0)-pos(0),2)); - diff_y=sqrt(pow(tmp_goal(1)-pos(1),2)); - max_n1=2.0*diff_x; - max_n2=2.0*diff_y; - for(double current_n1=min_n1;current_n1<=max_n1;current_n1+=(max_n1-min_n1)/(current_config_.n1_samples-1)) - 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)) - { - new_sample.params=Eigen::Vector4f(current_n1,current_n2,current_n3,current_n4); - new_sample.end_point.x=current_plan[int_step-1].pose.position.x; - new_sample.end_point.y=current_plan[int_step-1].pose.position.y; - new_sample.end_point.heading=tf::getYaw(current_plan[int_step-1].pose.orientation); - samples_.push_back(new_sample); - } + num_samples=current_config_.dist_samples; + for(unsigned int i=0;i<num_samples;i++) + { + int_step=current_index+(unsigned int)(step*(i+1)); + Eigen::Vector3f tmp_goal=Eigen::Vector3f(current_plan[int_step-1].pose.position.x,current_plan[int_step-1].pose.position.y,tf::getYaw(current_plan[int_step-1].pose.orientation)); + diff_x=sqrt(pow(tmp_goal(0)-pos(0),2)); + diff_y=sqrt(pow(tmp_goal(1)-pos(1),2)); + max_n1=2.0*diff_x; + max_n2=2.0*diff_y; + for(double current_n1=min_n1;current_n1<=max_n1;current_n1+=(max_n1-min_n1)/(current_config_.n1_samples-1)) + 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)) + { + new_sample.params=Eigen::Vector4f(current_n1,current_n2,current_n3,current_n4); + new_sample.end_point.x=current_plan[int_step-1].pose.position.x; + new_sample.end_point.y=current_plan[int_step-1].pose.position.y; + new_sample.end_point.heading=tf::getYaw(current_plan[int_step-1].pose.orientation); + samples_.push_back(new_sample); + } + } + }catch(std::exception &e){ + std::cout << e.what() << std::endl; } } @@ -157,109 +161,113 @@ bool AckermannSplineGenerator::nextTrajectory(base_local_planner::Trajectory &co std::vector<double> x,y,curvature,heading; try{ - start.x=pos_(0); - start.y=pos_(1); - 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; - end.x=samples_[next_sample_index_].end_point.x; - end.y=samples_[next_sample_index_].end_point.y; - if(this->forward) - end.heading=samples_[next_sample_index_].end_point.heading; - else - end.heading=samples_[next_sample_index_].end_point.heading+3.14159; - end.curvature=0.0; - spline_.set_end_point(end); - //std::cout << "end position: " << end.x << "," << end.y << "," << end.heading << "," << end.curvature << std::endl; - resolution=current_config_.sim_granularity; - spline_.generate(resolution,samples_[next_sample_index_].params(0),samples_[next_sample_index_].params(1),samples_[next_sample_index_].params(2),samples_[next_sample_index_].params(3)); - spline_.evaluate_all(x,y,curvature,heading); -// std::cout << "generate: " << samples_[next_sample_index_].params(0) << "," << samples_[next_sample_index_].params(1) << "," << samples_[next_sample_index_].params(2) << "," << samples_[next_sample_index_].params(3) << std::endl; - // discard trajectories with two much curvature - k_max=-std::numeric_limits<double>::max(); - 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)))/fabs(current_config_.axis_distance); - next_sample_index_++; - /* fill the ouput trajectory object */ - double k_max_speed,min_max_speed,new_start_vel,new_max_vel; - double acceleration,length,steer_angle,path_x,path_y; - CVelTrapezoid vel_profile; - TPoint point; - - if(k_max==0) - k_max_speed=std::numeric_limits<double>::quiet_NaN(); - 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); - 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)) - { - try{ - vel_profile.evaluate_at_time(current_config_.temp_horizon,comp_traj.xv_,acceleration,length); - }catch(CException &e){ - length=0.0; - comp_traj.xv_=vel_profile.get_max_vel(); - } - if(!this->forward) - comp_traj.xv_*=-1.0; - comp_traj.yv_=0.0; - point=spline_.evaluate(length); - comp_traj.thetav_=-(point.heading-start.heading); - if(comp_traj.thetav_>3.14159) - comp_traj.thetav_-=2*3.14159; - else if(comp_traj.thetav_<-3.14159) - comp_traj.thetav_+=2*3.14159; - this->get_path_closest_pose(path_x,path_y); - double y_offset=(-(path_x-pos_(0))*sin(pos_(2))+(path_y-pos_(1))*cos(pos_(2))); - if(forward) - comp_traj.thetav_-=atan2(current_config_.lateral_offset_gain*y_offset,comp_traj.xv_); + start.x=pos_(0); + start.y=pos_(1); + 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 - comp_traj.thetav_+=atan2(current_config_.lateral_offset_gain*y_offset,-comp_traj.xv_); - if(forward) - comp_traj.thetav_*=-1.0; - 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) - comp_traj.thetav_=current_config_.min_steer_angle; - /* - point=spline_.evaluate(length); - if(fabs(point.curvature)<0.001) - steer_angle=0.0; + 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; + end.x=samples_[next_sample_index_].end_point.x; + end.y=samples_[next_sample_index_].end_point.y; + if(this->forward) + end.heading=samples_[next_sample_index_].end_point.heading; else - steer_angle=atan2(current_config_.axis_distance,1.0/point.curvature); - if(steer_angle>1.5707) - steer_angle-=3.14159; - if(current_config_.use_steer_angle_cmd) + end.heading=samples_[next_sample_index_].end_point.heading+3.14159; + end.curvature=0.0; + spline_.set_end_point(end); + //std::cout << "end position: " << end.x << "," << end.y << "," << end.heading << "," << end.curvature << std::endl; + resolution=current_config_.sim_granularity; + spline_.generate(resolution,samples_[next_sample_index_].params(0),samples_[next_sample_index_].params(1),samples_[next_sample_index_].params(2),samples_[next_sample_index_].params(3)); + spline_.evaluate_all(x,y,curvature,heading); + // std::cout << "generate: " << samples_[next_sample_index_].params(0) << "," << samples_[next_sample_index_].params(1) << "," << samples_[next_sample_index_].params(2) << "," << samples_[next_sample_index_].params(3) << std::endl; + // discard trajectories with two much curvature + k_max=0.0; + for(unsigned int i=0;i<curvature.size();i++) + if(fabs(curvature[i])>k_max) + k_max=fabs(curvature[i]); + max_curvature=tan(std::max(current_config_.max_steer_angle,fabs(current_config_.min_steer_angle)))/fabs(current_config_.axis_distance); + next_sample_index_++; + /* fill the ouput trajectory object */ + double k_max_speed,min_max_speed,new_start_vel,new_max_vel; + double acceleration,length,steer_angle,path_x,path_y; + CVelTrapezoid vel_profile; + TPoint point; + + if(k_max==0) + k_max_speed=std::numeric_limits<double>::max(); + 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); + 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)) { + try{ + vel_profile.evaluate_at_time(current_config_.temp_horizon,comp_traj.xv_,acceleration,length); + }catch(CException &e){ + length=0.0; + comp_traj.xv_=vel_profile.get_max_vel(); + } + if(!this->forward) + comp_traj.xv_*=-1.0; + comp_traj.yv_=0.0; + point=spline_.evaluate(length); + comp_traj.thetav_=-(point.heading-start.heading); + if(comp_traj.thetav_>3.14159) + comp_traj.thetav_-=2*3.14159; + else if(comp_traj.thetav_<-3.14159) + comp_traj.thetav_+=2*3.14159; + this->get_path_closest_pose(path_x,path_y); + double y_offset=(-(path_x-pos_(0))*sin(pos_(2))+(path_y-pos_(1))*cos(pos_(2))); if(forward) - comp_traj.thetav_ = steer_angle; + comp_traj.thetav_-=atan2(current_config_.lateral_offset_gain*y_offset,comp_traj.xv_); else - comp_traj.thetav_ = -steer_angle; + comp_traj.thetav_+=atan2(current_config_.lateral_offset_gain*y_offset,-comp_traj.xv_); + if(forward) + comp_traj.thetav_*=-1.0; 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) comp_traj.thetav_=current_config_.min_steer_angle; + /* + point=spline_.evaluate(length); + if(fabs(point.curvature)<0.001) + steer_angle=0.0; + else + steer_angle=atan2(current_config_.axis_distance,1.0/point.curvature); + if(steer_angle>1.5707) + steer_angle-=3.14159; + if(current_config_.use_steer_angle_cmd) + { + 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) + comp_traj.thetav_=current_config_.min_steer_angle; + } + else + comp_traj.thetav_ = comp_traj.xv_*point.curvature; + */ + comp_traj.resetPoints(); + for(unsigned int i=0;i<x.size();i++) + comp_traj.addPoint(x[i],y[i],heading[i]); + return true; } else - comp_traj.thetav_ = comp_traj.xv_*point.curvature; - */ - comp_traj.resetPoints(); - for(unsigned int i=0;i<x.size();i++) - comp_traj.addPoint(x[i],y[i],heading[i]); - return true; - } - else - return false; + return false; }catch(CException &e){ std::cout << e.what() << std::endl; + return false; + }catch(std::exception &e){ + std::cout << e.what() << std::endl; + return false; } }