/home/joel/ros_workspace/lar3/planning/trajectory_planner/src/c_manage_trajectory.cpp

Go to the documentation of this file.
00001 #include <trajectory_planner/c_manage_trajectory.h>
00002 
00012 t_func_output c_manage_trajectory::compute_DLO(c_trajectoryPtr& trajectory, std::vector<t_obstacle>& vo)
00013 {
00014         //delete all previous computed collision pts
00015         trajectory->collision_pts.erase(trajectory->collision_pts.begin(), trajectory->collision_pts.end());
00016 
00017         if (trajectory->closest_node<0 || trajectory->closest_node >=(int)trajectory->x.size())
00018         {
00019                 ROS_ERROR("Error on node");
00020                 return FAILURE;
00021         }
00022         //cycle all nodes until the closest node
00023         
00024         trajectory->score.DLO = 10.0;   // Equal to maximum_admissible_to_DLO
00025         trajectory->score.FS = 1;
00026         for (int n=0; n<= trajectory->closest_node; ++n)
00027         {
00028                 if (trajectory->v_lines.size()!=trajectory->x.size())
00029                 {
00030                         ROS_ERROR("Node lines and number of nodes not equal");
00031                 }
00032         
00033                 //cycle all vehicle lines
00034                 for (size_t l=0; l< trajectory->v_lines[n].size(); ++l)
00035                 {
00036                         double Ax = trajectory->v_lines[n][l].x[0];     
00037                         double Ay = trajectory->v_lines[n][l].y[0];     
00038                         double Bx = trajectory->v_lines[n][l].x[1];     
00039                         double By = trajectory->v_lines[n][l].y[1];     
00040 
00041                         //cycle all obstacles           
00042                         for (size_t o=0; o< vo.size(); ++o)
00043                         {
00044                                 //cycle all lines inside each obstacle
00045                                 for (size_t lo=1; lo< vo[o].x.size(); ++lo)
00046                                 {
00047                                         double DLOprev = sqrt(pow(trajectory->v_lines[n][l].x[0]-vo[o].x[lo-1],2)+pow(trajectory->v_lines[n][l].y[0]-vo[o].y[lo-1],2));
00048                                         if(trajectory->score.DLO > DLOprev)
00049                                         {
00050                                                 trajectory->score.DLO=DLOprev;
00051                                         }
00052                                         double Cx = vo[o].x[lo-1];
00053                                         double Cy = vo[o].y[lo-1];
00054                                         double Dx = vo[o].x[lo];
00055                                         double Dy = vo[o].y[lo];
00056                                         double X,Y;
00057 
00058                                         int ret = lineSegmentIntersection( Ax, Ay,
00059                                                         Bx,  By,
00060                                                         Cx,  Cy,
00061                                                         Dx,  Dy,
00062                                                         &X,  &Y); 
00063                                         
00064                                         if (ret==DO_INTERSECT)
00065                                         {
00066                                                 t_point p;
00067                                                 p.x=X;
00068                                                 p.y=Y;
00069                                                 trajectory->collision_pts.push_back(p);
00070                                                 trajectory->score.FS*=0;
00071                                         }
00072                                 }
00073                         }
00074                 }
00075         }
00076         return SUCCESS;
00077 }
00078 
00093 int c_manage_trajectory::lineSegmentIntersection(double Ax, double Ay,double Bx, double By,double Cx, double Cy,double Dx, double Dy,double *X, double *Y) 
00094 {
00095         double  distAB, theCos, theSin, newX, ABpos ;
00096 
00097         //  Fail if either line segment is zero-length.
00098         if (((Ax==Bx) && (Ay==By)) || ((Cx==Dx) && (Cy==Dy))) return DONT_INTERSECT;
00099 
00100         //  Fail if the segments share an end-point.
00101         if (((Ax==Cx) && (Ay==Cy)) || ((Bx==Cx) && (By==Cy))
00102                         ||  ((Ax==Dx) && (Ay==Dy)) || ((Bx==Dx) && (By==Dy))) {
00103                 return DONT_INTERSECT; }
00104 
00105         //  (1) Translate the system so that point A is on the origin.
00106         Bx-=Ax; By-=Ay;
00107         Cx-=Ax; Cy-=Ay;
00108         Dx-=Ax; Dy-=Ay;
00109 
00110         //  Discover the length of segment A-B.
00111         distAB=sqrt(Bx*Bx+By*By);
00112 
00113         //  (2) Rotate the system so that point B is on the positive X axis.
00114         theCos=Bx/distAB;
00115         theSin=By/distAB;
00116         newX=Cx*theCos+Cy*theSin;
00117         Cy  =Cy*theCos-Cx*theSin; Cx=newX;
00118         newX=Dx*theCos+Dy*theSin;
00119         Dy  =Dy*theCos-Dx*theSin; Dx=newX;
00120 
00121         //  Fail if segment C-D doesn't cross line A-B.
00122         if ((Cy<0. && Dy<0.) || (Cy>=0. && Dy>=0.)) return DONT_INTERSECT;
00123 
00124         //  (3) Discover the position of the intersection point along line A-B.
00125         ABpos=Dx+(Cx-Dx)*Dy/(Dy-Cy);
00126 
00127         //  Fail if segment C-D crosses line A-B outside of segment A-B.
00128         if (ABpos<0. || ABpos>distAB) return DONT_INTERSECT;
00129 
00130         //  (4) Apply the discovered position to line A-B in the original coordinate system.
00131         *X=Ax+ABpos*theCos;
00132         *Y=Ay+ABpos*theSin;
00133 
00134         //  Success.
00135         return DO_INTERSECT; 
00136 }
00137 
00143 t_func_output c_manage_trajectory::set_obstacles(mtt::TargetList& msg)
00144 {
00145         vo.erase(vo.begin(), vo.end()); 
00146         for (size_t i=0; i<msg.obstacle_lines.size(); ++i)
00147         {
00148                 t_obstacle o;
00149 
00150                 pcl::PointCloud<pcl::PointXYZ> pc;
00151                 pcl::fromROSMsg(msg.obstacle_lines[i], pc);
00152 
00153                 for (size_t j=0; j<pc.points.size(); ++j)
00154                 {
00155                         o.x.push_back(pc.points[j].x);
00156                         o.y.push_back(pc.points[j].y);
00157                 }
00158 
00159                 vo.push_back(o);
00160         }
00161         return SUCCESS;
00162 }
00163 
00173 t_func_output c_manage_trajectory::set_vehicle_description(double w, double lb, double lf, double ht, double hb)
00174 {
00175         vehicle_description.width = w;
00176         vehicle_description.lenght_back = lb;
00177         vehicle_description.lenght_front = lf;
00178         vehicle_description.height_top = ht;
00179         vehicle_description.height_bottom = hb;
00180         return SUCCESS;
00181 }
00182 
00188 t_func_output c_manage_trajectory::get_traj_info_msg_from_chosen(trajectory_planner::traj_info* info)
00189 {
00190         info->arc.erase(info->arc.begin(), info->arc.end());
00191         info->total_arc.erase(info->total_arc.begin(), info->total_arc.end());
00192         info->alpha.erase(info->alpha.begin(), info->alpha.end());
00193         info->speed.erase(info->speed.begin(), info->speed.end());
00194         for(int j=0;j<=(int)vt[chosen_traj.index]->closest_node;++j)
00195         {
00196                 info->arc.push_back(vt[chosen_traj.index]->arc[j]);
00197                 info->total_arc.push_back(vt[chosen_traj.index]->total_arc[j]);
00198                 info->alpha.push_back(vt[chosen_traj.index]->alpha[j]);
00199         }
00200         set_speed_vector(info);
00201         
00202         cout<<"ARC SIZE (when constructing) "<<info->arc.size()<<endl;
00203         cout<<"TOTAL ARC SIZE (when constructing) "<<info->total_arc.size()<<endl;
00204         cout<<"ALPHA SIZE (when constructing) "<<info->alpha.size()<<endl;
00205         cout<<"SPEED SIZE (when constructing) "<<info->speed.size()<<endl;
00206         return SUCCESS;
00207 }
00208 
00209 
00215 t_func_output c_manage_trajectory::set_speed_vector(trajectory_planner::traj_info* info)
00216 {
00217         for(int i=0;i<=(int)vt[chosen_traj.index]->closest_node;++i)
00218         {
00219                 if(i < ((int)vt[chosen_traj.index]->arc.size() - 1))
00220                 {
00221                         if((info->arc[i])*(info->arc[i+1])<0.0)
00222                         {
00223                                 info->speed.push_back((info->arc[i]/fabs(info->arc[i]))*_SPEED_SAFFETY_); // This is the speed set to reverse/forward or forward/reverse
00224                         }
00225                         else
00226                         {
00227                                 info->speed.push_back((info->arc[i]/fabs(info->arc[i]))*_SPEED_REQUIRED_);
00228                         }
00229                 }
00230                 else
00231                 {
00232                         info->speed.push_back((info->arc[i]/fabs(info->arc[i]))*_SPEED_REQUIRED_);
00233                 }
00234         }
00235         return SUCCESS;
00236 }
00237 
00238 
00244 int c_manage_trajectory::set_chosen_traj(int n)
00245 {
00246         chosen_traj.index=n;
00247         return 1;
00248 }
00249 
00257 t_func_output c_manage_trajectory::set_attractor_point(double x, double y, double theta)
00258 {
00259 AP.x = x; AP.y = y; AP.theta=theta;     
00260 return SUCCESS;
00261 }
00262 
00268 t_func_output c_manage_trajectory::compute_global_traj_score(c_trajectoryPtr& trajectory)
00269 {
00270         double W_DAP=0.40;
00271         double W_ADAP=0.35;
00272         double W_DLO=0.25;
00273         trajectory->score.overall_norm = (W_DAP*trajectory->score.DAPnorm + W_ADAP*trajectory->score.ADAPnorm + W_DLO*trajectory->score.DLOnorm)*trajectory->score.FS;
00274         cout<<"Overallscore= "<<trajectory->score.overall_norm<<endl;
00275         
00276         return SUCCESS;
00277 }
00278 
00284 t_func_output c_manage_trajectory::set_inter_axis_distance(double val)
00285 {
00286         inter_axis_distance = val;
00287         return SUCCESS;         
00288 }       
00289         
00297 t_func_output c_manage_trajectory::create_new_trajectory(vector<double> alpha_in, vector<double> arc_in, vector<double> speed_in)
00298 {       
00299         //allocate space for new traj
00300         c_trajectoryPtr t_ptr(new c_trajectory(inter_axis_distance));
00301         vt.push_back(t_ptr);
00302 
00303         //set the parameters of the traj
00304         return vt[vt.size()-1]->generate(alpha_in, arc_in, speed_in, vehicle_description);
00305 }
00306 
00312 t_func_output c_manage_trajectory::compute_chosen_traj(void)
00313 {
00314         double max_val=-1;
00315         chosen_traj.index=-1;   
00316 
00317         for (int i=0; i< (int)vt.size(); i++)
00318         {
00319                 if (vt[i]->score.overall_norm>max_val)
00320                 {
00321                         chosen_traj.index=i;
00322                         max_val= vt[i]->score.overall_norm;
00323                 }
00324         }
00325         
00326         
00327         if(chosen_traj.index!=-1)
00328                 return SUCCESS;
00329         else
00330                 return FAILURE;
00331 }               
00332 
00338 t_func_output c_manage_trajectory::create_static_markers(void)
00339 {
00340         cout<<"ja create static"<<endl;
00341         static_marker_vec.clear();
00342         int marker_count=0;
00343         for (int i=0; i< (int)vt.size(); i++)
00344         {
00345                 vt[i]->create_markers(&static_marker_vec, &marker_count, i);
00346         }
00347         return SUCCESS;
00348 }
00349 
00355 t_func_output c_manage_trajectory::compute_vis_marker_array(visualization_msgs::MarkerArray* marker_array)
00356 {
00357         std::vector<visualization_msgs::Marker> marker_vec;
00358 
00359         ROS_INFO("static marker vec size=%ld",static_marker_vec.size());
00360         for(size_t i=0;i<static_marker_vec.size();++i)
00361         {
00362                 marker_vec.push_back(static_marker_vec[i]);
00363         }
00364 
00365 
00366 
00367         int marker_count=0;
00368         for (int i=0; i< (int)vt.size(); ++i)
00369         {
00370                 draw_on_node(vt[i],&marker_vec,&marker_count,0.15,vt[i]->score.DAP,vt[i]->score.DAPnorm,"DAP ");
00371                 draw_on_node(vt[i],&marker_vec,&marker_count,0.30,vt[i]->score.ADAP,vt[i]->score.ADAPnorm,"ADAP ");
00372                 draw_on_node(vt[i],&marker_vec,&marker_count,0.45,vt[i]->score.DLO,vt[i]->score.DLOnorm,"DLO ");
00373                 draw_on_node(vt[i],&marker_vec,&marker_count,0.60,(vt[i]->score.DAP+vt[i]->score.ADAP+vt[i]->score.DLO)*vt[i]->score.FS,vt[i]->score.overall_norm,"Overall ");
00374         }
00375 
00376         // ________________________________
00377         //|                                |
00378         //|           Line List            |
00379         //|________________________________|
00380         //Line marker to trajectory
00381         visualization_msgs::Marker marker2;
00382         geometry_msgs::Point p;
00383         marker2.header.frame_id = "/parking_frame";
00384         marker2.header.stamp = ros::Time::now();
00385         marker2.ns = "Chosen trajectory";
00386         marker2.id = 0;
00387         marker2.action = visualization_msgs::Marker::ADD;
00388         marker2.type = visualization_msgs::Marker::LINE_LIST;
00389         marker2.scale.x = 0.05;
00390         marker2.color.r = 0.00;
00391         marker2.color.g = 1.00;
00392         marker2.color.b = 0.00;
00393         marker2.color.a = 1.00;
00394         int first_step=1;
00395         for(size_t i=0; i<vt[chosen_traj.index]->x.size(); ++i)
00396         {
00397                 if(first_step==1)
00398                 {
00399                         p.x = 0;
00400                         p.y = 0;
00401                         p.z = 0.00;
00402                         marker2.points.push_back(p);
00403                         p.x = vt[chosen_traj.index]->x[i];
00404                         p.y = vt[chosen_traj.index]->y[i];
00405                         p.z = 0.00;
00406                         marker2.points.push_back(p);
00407                         first_step=0;
00408                 }
00409                 else
00410                 {
00411                         p.x = vt[chosen_traj.index]->x[i-1];
00412                         p.y = vt[chosen_traj.index]->y[i-1];
00413                         p.z = 0.00;
00414                         marker2.points.push_back(p);
00415                         p.x = vt[chosen_traj.index]->x[i];
00416                         p.y = vt[chosen_traj.index]->y[i];
00417                         p.z = 0.00;
00418                         marker2.points.push_back(p);
00419                 }               
00420         }
00421         marker_vec.push_back(marker2);
00422         
00423         // ________________________________
00424         //|                                |
00425         //|     Rectangle (actual)         |
00426         //|________________________________|
00427         // Represents the form of the car in each node
00428         visualization_msgs::Marker marker;
00429         marker.header.frame_id = "/parking_frame";
00430         marker.header.stamp = ros::Time::now();
00431         marker.ns = "car actual node";
00432         marker.id = 0;
00433         marker.action = visualization_msgs::Marker::ADD;
00434         marker.type = visualization_msgs::Marker::CUBE;
00435         marker.scale.x = 0.8;
00436         marker.scale.y = 0.42;
00437         marker.scale.z = 0.05;
00438         marker.color.r = 0.80;
00439         marker.color.g = 0.50;
00440         marker.color.b = 0.20;
00441         marker.color.a = 0.8;
00442         marker.pose.position.x = vt[chosen_traj.index]->x[current_node]+0.2*cos(vt[chosen_traj.index]->theta[current_node]);
00443         marker.pose.position.y = vt[chosen_traj.index]->y[current_node]+0.2*sin(vt[chosen_traj.index]->theta[current_node]);
00444         marker.pose.position.z = 0;
00445         marker.pose.orientation.z = sin(vt[chosen_traj.index]->theta[current_node]/2);
00446         marker.pose.orientation.w = cos(vt[chosen_traj.index]->theta[current_node]/2);
00447         marker_vec.push_back(marker);
00448 
00449 
00450         // ________________________________
00451         //|                                |
00452         //|        Best node (sphere)      |
00453         //|________________________________|
00454         // Represents the form of the car in each node
00455         visualization_msgs::Marker marker3;
00456         marker3.header.frame_id = "/parking_frame";
00457         marker3.header.stamp = ros::Time::now();
00458         marker3.ns = "Closest Node";
00459         marker3.action = visualization_msgs::Marker::ADD;
00460         marker3.type = visualization_msgs::Marker::SPHERE;
00461         marker3.scale.x = 0.2;
00462         marker3.scale.y = 0.2;
00463         marker3.scale.z = 0.2;
00464         marker3.color.r = 1.0;
00465         marker3.color.g = 0.0;
00466         marker3.color.b = 0.1;
00467         marker3.color.a = 0.6;
00468 
00469         for(size_t i=0; i<vt.size(); ++i)
00470         {
00471                 marker3.id +=2;
00472                 marker3.pose.position.x = vt[i]->x[vt[i]->closest_node];
00473                 marker3.pose.position.y = vt[i]->y[vt[i]->closest_node];
00474                 marker3.pose.position.z = 0;
00475                 marker_vec.push_back(marker3);
00476         }
00477 
00478 
00479         // ________________________________
00480         //|                                |
00481         //|        Colision (cylinder)     |
00482         //|________________________________|
00483         // Represents the form of the car in each node
00484         visualization_msgs::Marker marker4;
00485         marker4.header.frame_id = "/parking_frame";
00486         marker4.header.stamp = ros::Time::now();
00487         marker4.ns = "Colision points";
00488         marker4.action = visualization_msgs::Marker::ADD;
00489         marker4.type = visualization_msgs::Marker::CYLINDER;
00490         marker4.scale.x = 0.075;
00491         marker4.scale.y = 0.075;
00492         marker4.scale.z = 0.1;
00493         marker4.color.r = 1.0;
00494         marker4.color.g = 0.84;
00495         marker4.color.b = 0.0;
00496         marker4.color.a = 0.6;
00497         
00498         
00499         static size_t coli_marker_total = 0;
00500         int total=0;
00501         for(size_t j=0; j<vt.size(); ++j)
00502         {
00503                 ROS_INFO("Traj%ld has %ld collisions\n",j,vt[j]->collision_pts.size());
00504 
00505                 for(size_t i=0; i<vt[j]->collision_pts.size(); ++i)
00506                 {
00507                         marker4.id =total;
00508                         marker4.pose.position.x = vt[j]->collision_pts[i].x;
00509                         marker4.pose.position.y = vt[j]->collision_pts[i].y;
00510                         marker_vec.push_back(marker4);
00511                         total++;
00512                 }
00513         }
00514 
00515         ROS_INFO("total=%d coli=%ld",total,coli_marker_total);
00516         //erase old colision markers
00517         for(size_t j=total; j<coli_marker_total; ++j)
00518         {
00519                 ROS_INFO("deleting marker ");
00520                 marker4.header.frame_id = "/parking_frame";
00521                 marker4.id =j;
00522                 marker4.action = visualization_msgs::Marker::DELETE;
00523                 marker_vec.push_back(marker4);
00524         }
00525 
00526         coli_marker_total = total;
00527 
00528 
00529         marker_array->set_markers_vec(marker_vec);              
00530         
00531         return SUCCESS;
00532 }
00533 
00539 t_func_output c_manage_trajectory::compute_trajectories_scores(void)
00540 {
00541 
00542         double maximum_admissible_to_DAP=8.0;// ATENTION to negative values if bigger than maximum
00543         double maximum_admissible_to_DLO=10.0;// ATENTION to negative values if bigger than maximum
00544         for (int i=0; i< (int)vt.size(); ++i)
00545         {
00546                 //Compute DAP and ADAP
00547                 compute_DAP(vt[i],AP);
00548 
00549                 //Compute DLO
00550                 compute_DLO(vt[i], vo);
00551 
00552 
00553                 //normalize DAP
00554                 vt[i]->score.DAPnorm=1-(vt[i]->score.DAP)/maximum_admissible_to_DAP;
00555 
00556                 //normalize ADAP
00557                 vt[i]->score.ADAPnorm=1.0-(vt[i]->score.ADAP/(M_PI));
00558 
00559                 //normalize DLO
00560                 vt[i]->score.DLOnorm=(vt[i]->score.DLO)/maximum_admissible_to_DLO;
00561         }
00562 
00563         //compute overall score for each traj
00564         for (size_t i=0; i< vt.size(); ++i)
00565         {
00566                 compute_global_traj_score(vt[i]);
00567         }       
00568 
00569         compute_chosen_traj();
00570 
00571         return SUCCESS;
00572 }
00573 
00580 t_func_output c_manage_trajectory::compute_DAP(c_trajectoryPtr& trajectory,t_desired_coordinates& AP)
00581 {       
00582         trajectory->score.DAP=10e6;
00583 
00584         trajectory->closest_node=-1;
00585 
00586         for(size_t i = 0; i < trajectory->x.size(); ++i)
00587         {
00588                 double DAP_prev = sqrt( pow(trajectory->x[i]-AP.x,2)+ pow(trajectory->y[i]-AP.y,2));
00589                 
00590                 if(DAP_prev < trajectory->score.DAP)
00591                 {
00592                         trajectory->score.DAP = DAP_prev;
00593                         trajectory->closest_node = i;
00594                 }
00595         }
00596 
00597         if(trajectory->closest_node!=-1)
00598         {
00599                 trajectory->score.ADAP=compute_ADAP(trajectory,AP,trajectory->closest_node);
00600                 return SUCCESS;
00601         }
00602         else
00603         {
00604                 return FAILURE;
00605         }
00606 }
00607 
00615 double c_manage_trajectory::compute_ADAP(c_trajectoryPtr& trajectory,t_desired_coordinates& AP, int i)
00616 {
00617         double adap=abs(trajectory->theta[i]-AP.theta);
00618         if (adap>M_PI)
00619                 adap=2*M_PI-adap; 
00620         return adap;
00621 }
00622 
00634 void c_manage_trajectory::draw_on_node(c_trajectoryPtr& trajectory, std::vector<visualization_msgs::Marker>* marker_vec, int* marker_count, double z_high, double value, double normalized_value, string string_init)
00635 {
00636         //Create a marker
00637         visualization_msgs::Marker marker;
00638         std_msgs::ColorRGBA color;
00639         // ________________________________
00640         //|                                |
00641         //|           text nodes           |
00642         //|________________________________|
00643         // Points marker to t nodes
00644         marker.header.frame_id = "/parking_frame";
00645         marker.header.stamp = ros::Time::now();
00646         marker.ns = "info";
00647         marker.action = visualization_msgs::Marker::ADD;
00648         marker.type = visualization_msgs::Marker::TEXT_VIEW_FACING;
00649         marker.pose.orientation.x = 0.0;
00650         marker.pose.orientation.y = 0.0;
00651         marker.pose.orientation.z = 0.0;
00652         marker.pose.orientation.w = 1.0;
00653         marker.scale.z = 0.15;
00654         marker.color.r = 0.80;
00655         marker.color.g = 0.50;
00656         marker.color.b = 0.20;
00657         marker.color.a = 1.0;
00658         marker.id = (*marker_count)++;
00659         marker.pose.position.x = trajectory->x[trajectory->x.size()-1]+0.25+z_high;
00660         marker.pose.position.y = trajectory->y[trajectory->x.size()-1];
00661         marker.pose.position.z = z_high;
00662 
00663         marker.text = string_init + str( boost::format("%.2f") % value) + " ("+str( boost::format("%.2f") % normalized_value)+")";
00664         marker_vec->push_back(marker);  
00665 }
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Defines


trajectory_planner
Author(s): joel
autogenerated on Thu Jul 26 2012 21:36:27