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

Go to the documentation of this file.
00001 #ifndef _trajectory_planner_nodelet_CPP_
00002 #define _trajectory_planner_nodelet_CPP_
00003 
00010 #include "trajectory_planner_nodelet.h"
00011 
00012 bool plan_trajectory=false;
00013 bool have_plan=false;
00014 geometry_msgs::PoseStamped pose_in;
00015 geometry_msgs::PoseStamped pose_transformed;
00016 
00017 std::vector< pcl::PointCloud<pcl::PointXYZ> > pc_v;
00018 
00019 
00025 void set_coordinates(trajectory_planner::coordinates msg)
00026 {       
00027 
00028 //      cout<<"stat Message received!!!"<<endl;
00029         // Change parameters
00030         pose_in.pose.position.x=msg.x;
00031         pose_in.pose.position.y=msg.y;
00032         pose_in.pose.orientation.w=cos(msg.theta/2.0);
00033         pose_in.pose.orientation.x=0.0;
00034         pose_in.pose.orientation.y=0.0;
00035         pose_in.pose.orientation.z=sin(msg.theta/2.0);
00036 
00037         pose_in.header.frame_id="/world";
00038 
00039         manage_vt->set_attractor_point(msg.x,msg.y,msg.theta);
00040         plan_trajectory=true;
00041 }
00042 
00043 
00049 void mtt_callback(mtt::TargetList msg)
00050 {
00051         ROS_INFO("received mtt num obs=%ld num lines first obs =%d frame_id=%s",msg.id.size(), msg.obstacle_lines[0].width, msg.header.frame_id.c_str());
00052 
00053         //copy to global variable
00054         pc_v.erase(pc_v.begin(), pc_v.end());
00055         for (size_t i=0; i<msg.id.size(); ++i)
00056         {
00057                 pcl::PointCloud<pcl::PointXYZ> tmp;
00058                 pcl::fromROSMsg(msg.obstacle_lines[i], tmp);
00059                 tmp.header.frame_id=msg.header.frame_id;
00060                 tmp.header.stamp=msg.header.stamp;
00061 
00062                 ROS_INFO("Obstacle %ld has %ld lines", i, tmp.points.size());
00063                 pc_v.push_back(tmp);
00064         }       
00065 }
00066 
00067 
00073 vector<double> set_speed_vector(boost::shared_ptr<c_trajectory> t)
00074 {
00075         vector<double> speed_setted;
00076         for(size_t i=0;i<_NUM_NODES_;++i)
00077         {
00078                 if(i < (_NUM_NODES_ - 1))
00079                 {
00080                         if((t->arc[i])*(t->arc[i+1])<0.0)
00081                         {
00082                                 speed_setted.push_back((t->arc[i]/fabs(t->arc[i]))*_SPEED_SAFFETY_); // This is the speed set to reverse/forward or forward/reverse
00083                         }
00084                         else
00085                         {
00086                                 speed_setted.push_back((t->arc[i]/fabs(t->arc[i]))*_SPEED_REQUIRED_);
00087                         }
00088                 }
00089                 else
00090                 {
00091                         speed_setted.push_back((t->arc[i]/fabs(t->arc[i]))*_SPEED_REQUIRED_);
00092                 }
00093 
00094         }
00095         return speed_setted;
00096 }
00097 
00098 
00106 int main(int argc, char **argv)
00107 {
00108         ros::init(argc, argv, "trajectory_planner_nodelet");
00109         ros::NodeHandle n("~");
00110         p_n=&n;
00111 
00112         //Define the publishers and subscribers
00113         tf::TransformBroadcaster broadcaster;
00114         tf::TransformListener listener;
00115         p_listener = &listener;
00116         ros::Publisher array_pub = n.advertise<visualization_msgs::MarkerArray>( "/array_of_markers", 1 );
00117         ros::Subscriber sub = n.subscribe("/msg_coordinates", 1, set_coordinates);
00118         ros::Subscriber mtt_sub = n.subscribe("/mtt_targets", 1, mtt_callback);
00119         ros::Rate loop_rate(10);
00120 
00121         //   ___________________________________
00122         //   |                                 |
00123         //   |        Define the trajectories  |
00124         //   |_________________________________| 
00125         //Declare the traj manager class        
00126         manage_vt = (c_manage_trajectoryPtr) new c_manage_trajectory();
00127 
00128         //initialize attractor point
00129         t_desired_coordinates AP;
00130         AP.x=-1.0;
00131         AP.y=0.0;
00132         AP.theta=-M_PI/8;
00133         manage_vt->set_attractor_point(AP.x, AP.y, AP.theta);
00134 
00135 
00136         //initialize vehicle description
00137         manage_vt->set_vehicle_description(_VEHICLE_WIDTH_, _VEHICLE_LENGHT_BACK_, _VEHICLE_LENGHT_FRONT_, 
00138                         _VEHICLE_HEIGHT_TOP_, _VEHICLE_HEIGHT_BOTTOM_);
00139 
00140         //initialize inter axis distance
00141         manage_vt->set_inter_axis_distance(_D_);
00142 
00143 
00144         //Compute the trajectory parameters
00145         for (int i=0; i< _NUM_TRAJ_; i++)
00146         {
00147                 vector<double> v_a;
00148                 vector<double> v_arc;
00149                 for (int j=0; j<_NUM_NODES_; ++j)
00150                 {
00151                         v_a.push_back(M_PI/180.*a[i][j]);       
00152                         v_arc.push_back(arc[i][j]);     
00153                 }
00154                 manage_vt->create_new_trajectory(v_a,v_arc,v_a);
00155         }
00156 
00157         // Choose trajectory  (0 is trajectory 1)
00158         int val = 0;     // This will be commented
00159 
00160         if (val>=(int)manage_vt->vt.size())
00161         {
00162                 ROS_ERROR("Chosen trajectory does not exist");
00163                 exit(0);
00164         }
00165         manage_vt->set_chosen_traj(val);
00166 
00167         //create the static visualisation markers
00168 
00169         commandPublisher = n.advertise<trajectory_planner::traj_info>("/trajectory_information", 1000);
00170 
00171         
00172         
00173         
00174         
00175         while(ros::ok())
00176         {
00177 
00178                 if(plan_trajectory==true)
00179                 {
00180                         //aqui recebi um comando para defenir uma trajectoria
00181                         
00182                         plan_trajectory = false;
00183                         ROS_INFO("Going to plan a trajectory");
00184                         // _________________________________
00185                         //|                                 |
00186                         //|    Set the parking view frame   |
00187                         //|_________________________________| 
00188                         bool have_transform=true;
00189                         //Set the frame where to draw the trajectories
00190                         try
00191                         {
00192                                 p_listener->lookupTransform("/world","/vehicle_odometry",ros::Time(0), transformw);
00193                         }
00194                         catch (tf::TransformException ex)
00195                         {
00196                                 ROS_ERROR("%s",ex.what());
00197                                 have_transform=false;
00198                         }
00199 
00200                         if (have_transform)
00201                         {
00202                                 ros::Time time=ros::Time::now();
00203                                 broadcaster.sendTransform(tf::StampedTransform(transformw, time,"/world", "/parking_frame"));
00204                                 ros::spinOnce();
00205                                 broadcaster.sendTransform(tf::StampedTransform(transformw, time+ros::Duration(5),"/world", "/parking_frame")); 
00206                                 ros::spinOnce();                        
00207                                 //                              cout<<"stat Publishing transform"<<endl;
00208 
00209                                 ros::Duration(0.1).sleep();
00210 
00211                                 //   ___________________________________
00212                                 //   |                                 |
00213                                 //   |        Trajectory evaluation    |
00214                                 //   |_________________________________| 
00215 
00216                                 //Transform attractor point to /parking_frame
00217                                 tf::Transformer tt;
00218                                 pose_in.header.stamp=time+ros::Duration(0.1);
00219                                 p_listener->transformPose ("/parking_frame", pose_in, pose_transformed); 
00220 
00221                                 ROS_INFO("pose_in frame_id=%s pose_transformed frame_id=%s",pose_in.header.frame_id.c_str(), pose_transformed.header.frame_id.c_str());
00222                                 //Set transformed attractor point
00223                                 manage_vt->set_attractor_point(pose_transformed.pose.position.x,pose_transformed.pose.position.y,atan2(2.0*(pose_transformed.pose.orientation.w*pose_transformed.pose.orientation.z),1-(2*(pose_transformed.pose.orientation.z*pose_transformed.pose.orientation.z))));
00224 
00225 
00226                                 //transform mtt to /parking_frame       
00227                                 pcl::PointCloud<pcl::PointXYZ>  pct;
00228                                 mtt::TargetList msg_transformed;
00229 
00230 
00231 
00232                                 for (size_t i=0; i<pc_v.size(); ++i)
00233                                 {
00234 
00235                                         if (i==0)
00236                                         {
00237                                                 try
00238                                                 {
00239                                                         p_listener->lookupTransform(pc_v[i].header.frame_id,"/parking_frame", pc_v[i].header.stamp, transform_mtt);
00240                                                 }
00241                                                 catch (tf::TransformException ex)
00242                                                 {
00243                                                         ROS_ERROR("%s",ex.what());
00244                                                 }
00245                                         }
00246 
00247                                         ROS_INFO("pc_v[%ld] frame_id=%s pcp frame_id=%s",i, pc_v[i].header.frame_id.c_str(), pct.header.frame_id.c_str());
00248                                         pcl_ros::transformPointCloud(pc_v[i],pct,transform_mtt.inverse());
00249 
00250                                         sensor_msgs::PointCloud2 pc_msg;
00251                                         pcl::toROSMsg(pct, pc_msg);
00252                                         pc_msg.header.frame_id = "/parking_frame";
00253                                         pc_msg.header.stamp = ros::Time::now();
00254                                         msg_transformed.obstacle_lines.push_back(pc_msg);
00255                                 }
00256                                 manage_vt->set_obstacles(msg_transformed); 
00257 
00258 
00259 
00260                                 //   ___________________________________
00261                                 //   |                                 |
00262                                 //   |        Draw                     |
00263                                 //   |_________________________________|
00264                                 manage_vt->create_static_markers();
00265                                 
00266                                 
00267                                 ros::Time st=ros::Time::now();
00268                                 
00269                                 manage_vt->compute_trajectories_scores();
00270 
00271                                 cout<<"Compute scores: "<<(ros::Time::now()-st).toSec();
00272                                 
00273                                 ROS_INFO("manage_vt chosen traj= %d",manage_vt->chosen_traj.index);
00274 
00275 
00276                                 trajectory_planner::traj_info info;
00277 
00278                                 manage_vt->get_traj_info_msg_from_chosen(&info);
00279 
00280                                 commandPublisher.publish(info);
00281 
00282 
00283                                 visualization_msgs::MarkerArray marker_array;
00284                                 manage_vt->compute_vis_marker_array(&marker_array);
00285                                 array_pub.publish(marker_array);
00286                                 cout<<"ja size:"<<marker_array.markers.size()<<endl;
00287 
00288 
00289                                 have_plan=true;
00290 
00291                         }
00292                 }
00293 
00294                 if (have_plan==true)
00295                 {       
00296                         // !!!! The previous 'if' must have a weight evaluation !!!!  if ... && GlobalScore>=0.74
00297                         
00298                         broadcaster.sendTransform(tf::StampedTransform(transformw, ros::Time::now(),"/world", "/parking_frame")); 
00299                         cout<<"stat Publishing transform"<<endl;
00300                 }
00301 
00302                 //printf("CURRENT NODE-> %d\n",node);
00303                 //printf("Distance Travelled-> %f\n",base_status.distance_traveled);
00304 
00305                 loop_rate.sleep();
00306                 ros::spinOnce();
00307         }
00308 }
00309 #endif
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Defines


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