36 #include <visualization_msgs/Marker.h>
37 #include <sensor_msgs/LaserScan.h>
38 #include <sensor_msgs/PointCloud2.h>
39 #include <tf/transform_listener.h>
40 #include <pcl_ros/transforms.h>
41 #include <pcl/conversions.h>
42 #include <pcl/point_cloud.h>
43 #include <pcl/point_types.h>
44 #include <pcl/segmentation/extract_polygonal_prism_data.h>
45 #include <pcl/filters/extract_indices.h>
46 #include <pcl/filters/project_inliers.h>
47 #include <pcl/filters/voxel_grid.h>
48 #include <points_from_volume/points_from_volume.h>
49 #include <trajectory_planner/coordinates.h>
52 #define PFLN printf("FILE %s LINE %d\n",__FILE__, __LINE__);
77 void cloud_cb (
const sensor_msgs::PointCloud2ConstPtr & pcmsg_in)
80 pcl::PointCloud<pcl::PointXYZ> pc_in;
81 pcl::fromROSMsg(*pcmsg_in,pc_in);
85 tf::StampedTransform transform;
88 p_listener->lookupTransform(pcmsg_in->header.frame_id,
"/vehicle_odometry", ros::Time(0), transform);
90 catch (tf::TransformException ex)
92 ROS_ERROR(
"%s",ex.what());
97 pcl::PointCloud<pcl::PointXYZ> pc_transformed;
98 pcl::PointCloud<pcl::PointXYZ> pc_ahead, pc_spot, pc_behind, pc_ground;
99 pcl_ros::transformPointCloud(pc_in,pc_transformed, transform.inverse());
100 pc_transformed.header.frame_id =
"/vehicle_odometry";
104 pfv.convexhull_function(pc_transformed, 0.0, -0.6,
false);
105 pc_ahead=
pfv.get_pc_in_volume();
106 pc_ahead.header.frame_id =
"/vehicle_odometry";
108 pfv2.convexhull_function(pc_transformed, 0.0, -0.6,
false);
109 pc_spot=
pfv2.get_pc_in_volume();
110 pc_spot.header.frame_id =
"/vehicle_odometry";
112 pfv3.convexhull_function(pc_transformed, 0.0, -0.6,
false);
113 pc_behind=
pfv3.get_pc_in_volume();
114 pc_behind.header.frame_id =
"/vehicle_odometry";
116 pfv4.convexhull_function(pc_transformed, 0.07, 0.0,
false);
117 pc_ground=
pfv4.get_pc_in_volume();
118 pc_ground.header.frame_id =
"/vehicle_odometry";
122 sensor_msgs::PointCloud2 pcmsg_out;
123 pcl::toROSMsg(pc_ahead, pcmsg_out);
125 sensor_msgs::PointCloud2 pcmsg_out2;
126 pcl::toROSMsg(pc_spot, pcmsg_out2);
128 sensor_msgs::PointCloud2 pcmsg_out3;
129 pcl::toROSMsg(pc_behind, pcmsg_out3);
131 sensor_msgs::PointCloud2 pcmsg_out4;
132 pcl::toROSMsg(pc_ground, pcmsg_out4);
137 visualization_msgs::Marker marker_car;
138 marker_car.header.frame_id =
"/vehicle_odometry";
139 marker_car.header.stamp = ros::Time();
140 marker_car.ns =
"my_namespace";
142 marker_car.type = visualization_msgs::Marker::CUBE;
143 marker_car.action = visualization_msgs::Marker::ADD;
144 marker_car.scale.x = 0.8;
147 marker_car.pose.position.x = 0.8/2;
148 marker_car.pose.position.y = 0;
149 marker_car.pose.position.z =
spot_high/2;
150 marker_car.pose.orientation.x = 0.0;
151 marker_car.pose.orientation.y = 0.0;
152 marker_car.pose.orientation.z = 0.0;
153 marker_car.pose.orientation.w = 1.0;
154 marker_car.color.a = 0.2;
155 marker_car.color.r = 0.0;
156 marker_car.color.g = 0.0;
157 marker_car.color.b = 1.0;
161 visualization_msgs::Marker marker;
162 marker.header.frame_id =
"/vehicle_odometry";
163 marker.header.stamp = ros::Time();
164 marker.ns =
"my_namespace";
166 marker.type = visualization_msgs::Marker::CUBE;
167 marker.action = visualization_msgs::Marker::ADD;
174 marker.pose.orientation.x = 0.0;
175 marker.pose.orientation.y = 0.0;
176 marker.pose.orientation.z = 0.0;
177 marker.pose.orientation.w = 1.0;
178 marker.color.a = 0.3;
179 if(pc_ahead.points.size()<5)
181 marker.color.r = 0.0;
182 marker.color.g = 1.0;
183 marker.color.b = 0.0;
184 condition=condition+0.5;
188 marker.color.r = 1.0;
189 marker.color.g = 1.0;
190 marker.color.b = 0.0;
194 visualization_msgs::Marker marker2;
195 marker2.header.frame_id =
"/vehicle_odometry";
196 marker2.header.stamp = ros::Time();
197 marker2.ns =
"my_namespace";
199 marker2.type = visualization_msgs::Marker::CUBE;
200 marker2.action = visualization_msgs::Marker::ADD;
207 marker2.pose.orientation.x = 0.0;
208 marker2.pose.orientation.y = 0.0;
209 marker2.pose.orientation.z = 0.0;
210 marker2.pose.orientation.w = 1.0;
211 marker2.color.a = 0.3;
212 if(pc_spot.points.size()<5)
214 marker2.color.r = 0.0;
215 marker2.color.g = 1.0;
216 marker2.color.b = 0.0;
217 condition=condition+1;
221 marker2.color.r = 1.0;
222 marker2.color.g = 0.0;
223 marker2.color.b = 0.0;
227 visualization_msgs::Marker marker3;
228 marker3.header.frame_id =
"/vehicle_odometry";
229 marker3.header.stamp = ros::Time();
230 marker3.ns =
"my_namespace";
232 marker3.type = visualization_msgs::Marker::CUBE;
233 marker3.action = visualization_msgs::Marker::ADD;
240 marker3.pose.orientation.x = 0.0;
241 marker3.pose.orientation.y = 0.0;
242 marker3.pose.orientation.z = 0.0;
243 marker3.pose.orientation.w = 1.0;
244 marker3.color.a = 0.3;
245 if(pc_behind.points.size()<5)
247 marker3.color.r = 1.0;
248 marker3.color.g = 0.0;
249 marker3.color.b = 0.0;
253 marker3.color.r = 0.0;
254 marker3.color.g = 1.0;
255 marker3.color.b = 0.0;
256 condition=condition+1;
260 visualization_msgs::Marker marker4;
261 marker4.header.frame_id =
"/vehicle_odometry";
262 marker4.header.stamp = ros::Time();
263 marker4.ns =
"my_namespace";
265 marker4.type = visualization_msgs::Marker::CUBE;
266 marker4.action = visualization_msgs::Marker::ADD;
269 marker4.scale.z = 0.05;
272 marker4.pose.position.z = -0.025;
273 marker4.pose.orientation.x = 0.0;
274 marker4.pose.orientation.y = 0.0;
275 marker4.pose.orientation.z = 0.0;
276 marker4.pose.orientation.w = 1.0;
277 marker4.color.a = 0.6;
278 marker4.color.r = 0.4;
279 marker4.color.g = 0.8;
280 marker4.color.b = 0.9;
281 if(pc_ground.points.size()<5)
283 marker4.color.r = 1.0;
284 marker4.color.g = 0.0;
285 marker4.color.b = 0.0;
289 marker4.color.r = 0.0;
290 marker4.color.g = 1.0;
291 marker4.color.b = 0.0;
292 condition=condition+1;
310 double xpos=marker2.pose.position.x;
311 double ypos=marker2.pose.position.y;
314 tf::StampedTransform transform2;
318 p_listener->lookupTransform(
"/vehicle_odometry",
"/world", ros::Time(0), transform2);
320 catch (tf::TransformException ex)
322 ROS_ERROR(
"%s",ex.what());
326 pcl::PointCloud<pcl::PointXYZ> pc_spot_coordinate_in;
327 pcl::PointCloud<pcl::PointXYZ> pc_spot_coordinate_out;
333 pc_spot_coordinate_in.points.push_back(pt1);
335 pcl_ros::transformPointCloud(pc_spot_coordinate_in,pc_spot_coordinate_out, transform2.inverse());
336 pc_spot_coordinate_out.header.frame_id =
"/world";
343 orix=transform2.getRotation()[0];
344 oriy=transform2.getRotation()[1];
345 oriz=transform2.getRotation()[2];
346 oriw=transform2.getRotation()[3];
348 double thheta=atan2(2*(oriw*oriz+orix*oriy),1-2*(oriy*oriy+oriz*oriz));
360 message.x=(pc_spot_coordinate_out.points[0].x);
361 message.y=(pc_spot_coordinate_out.points[0].y);
364 printf(
"Parking in: %f %f \n",pc_spot_coordinate_out.points[0].x,pc_spot_coordinate_out.points[0].y);
366 sensor_msgs::PointCloud2 pcmsg_parking_place;
367 pcl::toROSMsg(pc_spot_coordinate_out, pcmsg_parking_place);
386 int main(
int argc,
char **argv)
388 ros::init(argc, argv,
"pc_transformer_node");
390 tf::TransformListener listener(n,ros::Duration(10));
393 Publisher = n.advertise<trajectory_planner::coordinates>(
"/msg_coordinates", 1000);
399 car_pub = n.advertise<visualization_msgs::Marker>(
"car", 0 );
400 vis_pub = n.advertise<visualization_msgs::Marker>(
"parking_ahead", 0 );
401 vis_pub2 = n.advertise<visualization_msgs::Marker>(
"parking_spot", 0 );
402 vis_pub3 = n.advertise<visualization_msgs::Marker>(
"parking_behind", 0 );
403 vis_pub4 = n.advertise<visualization_msgs::Marker>(
"ground", 0 );
455 cloud_pub = n.advertise<sensor_msgs::PointCloud2>(
"/pc_ahead", 1);
456 cloud_pub2 = n.advertise<sensor_msgs::PointCloud2>(
"/pc_spot", 1);
457 cloud_pub3 = n.advertise<sensor_msgs::PointCloud2>(
"/pc_behind", 1);
458 cloud_pub4 = n.advertise<sensor_msgs::PointCloud2>(
"/pc_ground", 1);
459 cloud_pub5 = n.advertise<sensor_msgs::PointCloud2>(
"/pc_parking_location", 1);
466 ros::Subscriber sub = n.subscribe (
"/pc_out_pointcloud", 1,
cloud_cb);
468 ros::Rate loop_rate(30);
points_from_volume< pcl::PointXYZ > pfv2
ros::Publisher cloud_pub5
pcl::PointCloud< pcl::PointXYZ > convex_hull2
ros::Publisher cloud_pub4
ros::Publisher cloud_pub3
ros::Publisher cloud_pub2
pcl::PointCloud< pcl::PointXYZ > convex_hull3
points_from_volume< pcl::PointXYZ > pfv4
trajectory_planner::coordinates message
int main(int argc, char **argv)
Main function of the parking detection node.
points_from_volume< pcl::PointXYZ > pfv3
void cloud_cb(const sensor_msgs::PointCloud2ConstPtr &pcmsg_in)
Publishes filtered pcl & extruded pcl.
pcl::PointCloud< pcl::PointXYZ > convex_hull1
points_from_volume< pcl::PointXYZ > pfv
tf::TransformListener * p_listener