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
00029
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
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_);
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
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
00124
00125
00126 manage_vt = (c_manage_trajectoryPtr) new c_manage_trajectory();
00127
00128
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
00137 manage_vt->set_vehicle_description(_VEHICLE_WIDTH_, _VEHICLE_LENGHT_BACK_, _VEHICLE_LENGHT_FRONT_,
00138 _VEHICLE_HEIGHT_TOP_, _VEHICLE_HEIGHT_BOTTOM_);
00139
00140
00141 manage_vt->set_inter_axis_distance(_D_);
00142
00143
00144
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
00158 int val = 0;
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
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
00181
00182 plan_trajectory = false;
00183 ROS_INFO("Going to plan a trajectory");
00184
00185
00186
00187
00188 bool have_transform=true;
00189
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
00208
00209 ros::Duration(0.1).sleep();
00210
00211
00212
00213
00214
00215
00216
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
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
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
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
00297
00298 broadcaster.sendTransform(tf::StampedTransform(transformw, ros::Time::now(),"/world", "/parking_frame"));
00299 cout<<"stat Publishing transform"<<endl;
00300 }
00301
00302
00303
00304
00305 loop_rate.sleep();
00306 ros::spinOnce();
00307 }
00308 }
00309 #endif