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
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
00023
00024 trajectory->score.DLO = 10.0;
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
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
00042 for (size_t o=0; o< vo.size(); ++o)
00043 {
00044
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
00098 if (((Ax==Bx) && (Ay==By)) || ((Cx==Dx) && (Cy==Dy))) return DONT_INTERSECT;
00099
00100
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
00106 Bx-=Ax; By-=Ay;
00107 Cx-=Ax; Cy-=Ay;
00108 Dx-=Ax; Dy-=Ay;
00109
00110
00111 distAB=sqrt(Bx*Bx+By*By);
00112
00113
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
00122 if ((Cy<0. && Dy<0.) || (Cy>=0. && Dy>=0.)) return DONT_INTERSECT;
00123
00124
00125 ABpos=Dx+(Cx-Dx)*Dy/(Dy-Cy);
00126
00127
00128 if (ABpos<0. || ABpos>distAB) return DONT_INTERSECT;
00129
00130
00131 *X=Ax+ABpos*theCos;
00132 *Y=Ay+ABpos*theSin;
00133
00134
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_);
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
00300 c_trajectoryPtr t_ptr(new c_trajectory(inter_axis_distance));
00301 vt.push_back(t_ptr);
00302
00303
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
00379
00380
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
00426
00427
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
00453
00454
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
00482
00483
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
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;
00543 double maximum_admissible_to_DLO=10.0;
00544 for (int i=0; i< (int)vt.size(); ++i)
00545 {
00546
00547 compute_DAP(vt[i],AP);
00548
00549
00550 compute_DLO(vt[i], vo);
00551
00552
00553
00554 vt[i]->score.DAPnorm=1-(vt[i]->score.DAP)/maximum_admissible_to_DAP;
00555
00556
00557 vt[i]->score.ADAPnorm=1.0-(vt[i]->score.ADAP/(M_PI));
00558
00559
00560 vt[i]->score.DLOnorm=(vt[i]->score.DLO)/maximum_admissible_to_DLO;
00561 }
00562
00563
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
00637 visualization_msgs::Marker marker;
00638 std_msgs::ColorRGBA color;
00639
00640
00641
00642
00643
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 }