41 {
44 cudaError_t
err = ::cudaSuccess;
45 unsigned int flags = cudaHostAllocMapped;
46 err = cudaHostAlloc(&h_point_cloud, cloud_ptr->size() *
sizeof(
base::PointF), flags);
47 if (err != ::cudaSuccess) {
48 AERROR <<
"cudaHostAlloc returns failed";
49 }
50 err = cudaHostGetDevicePointer(&d_point_cloud, h_point_cloud, 0);
51 if (err != ::cudaSuccess) {
52 AERROR <<
"cudaHostGetDevicePointer returns failed";
53 }
54 for (int i = 0; i < cloud_ptr->size(); i++) {
55 h_point_cloud[i].x = cloud_ptr->at(i).x;
56 h_point_cloud[i].y = cloud_ptr->at(i).y;
57 h_point_cloud[i].z = cloud_ptr->at(i).z;
58 h_point_cloud[i].intensity = cloud_ptr->at(i).intensity;
59 }
60
61
62 int filtered_point_count = cloud_ptr->size();
63 if (!downSample(
64 d_point_cloud,
65 filtered_point_count,
66 downsample_voxel_size_x_,
67 downsample_voxel_size_y_,
68 downsample_voxel_size_z_,
69 downsample_use_centroid)) {
70 AERROR <<
"downSample is wrong!";
71 }
72 cudaDeviceSynchronize();
73
74
75 cloud_ptr->resize(filtered_point_count);
76 for (int i = 0; i < filtered_point_count; i++) {
77 cloud_ptr->at(i).x = h_point_cloud[i].x;
78 cloud_ptr->at(i).y = h_point_cloud[i].y;
79 cloud_ptr->at(i).z = h_point_cloud[i].z;
80 cloud_ptr->at(i).intensity = h_point_cloud[i].intensity;
81 }
82 cudaFreeHost(h_point_cloud);
83 return true;
84}