Can't elaborate centroids (Euclidean Cluster Extraction)
I'm trying to extract clusters from a point cloud in order to find the centroids of those clusters. I've been following the tutorial on PCL website https://pcl.readthedocs.io/projects/t... .
I'm running ROS Melodic on Ubuntu 18.04.4 and I'm a ROS and PCL newbie.
The program works fine using PCD files (that is, offline) but I'm facing troubles elaborating sensor_msgs::PointCloud2 input cloud (online). The following is a part of the whole code:
void cloudCB( const sensor_msgs::PointCloud2& input){
sensor_msgs::PointCloud2 output;
pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud_filtered (new pcl::PointCloud<pcl::PointXYZRGB>);
// elaboration on cloud_filtered ...
pcl::search::KdTree<pcl::PointXYZRGB>::Ptr tree (new pcl::search::KdTree<pcl::PointXYZRGB>);
tree->setInputCloud (cloud_filtered);
std::vector<pcl::PointIndices> cluster_indices;
pcl::EuclideanClusterExtraction<pcl::PointXYZRGB> ec;
ec.setClusterTolerance (0.02); // 2cm
ec.setMinClusterSize (100);
ec.setMaxClusterSize (25000);
ec.setSearchMethod (tree);
ec.setInputCloud (cloud_filtered);
ec.extract (cluster_indices);
int j = 0;
std::vector<pcl::PointCloud<pcl::PointXYZRGB>::Ptr> sourceClouds;
for (std::vector<pcl::PointIndices>::const_iterator it = cluster_indices.begin (); it != cluster_indices.end (); ++it){
pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud_cluster (new pcl::PointCloud<pcl::PointXYZRGB>);
for (std::vector<int>::const_iterator pit = it->indices.begin (); pit != it->indices.end (); ++pit){
cloud_cluster->points.push_back (cloud_plane->points[*pit]);
}
cloud_cluster->width = cloud_cluster->points.size ();
cloud_cluster->height = 1;
cloud_cluster->is_dense = true;
sourceClouds.push_back(cloud_cluster);
j++;
}
pcl::PointXYZRGB centroid;
std::vector<pcl::PointXYZRGB> centroids;
for (size_t i = 0; i < sourceClouds.size(); i++){
pcl::computeCentroid( *(sourceClouds[i]), centroid);
centroids.push_back(centroid);
std::cout<<"center of pipe #"<<i+1<<" in ("<<(centroids[i]).x<<", "<<(centroids[i]).y<<", "<<(centroids[i]).z<<")"<<std::endl;
}
pcl::toROSMsg ( *cloud_plane, output);
output.header.frame_id = input.header.frame_id;
pcl_pub.publish( output);
}
Apart from this warning:
In file included from /home/lenovo/ros_ws/src/passthrough_filter_live/src/passthrough_filter_live.cpp:14:0: /usr/include/pcl-1.8/pcl/sample_consensus/model_types.h: In function ‘void __static_initialization_and_destruction_0(int, int)’: /usr/include/pcl-1.8/pcl/sample_consensus/model_types.h:99:3: warning: ‘pcl::SAC_SAMPLE_SIZE’ is deprecated: This map is deprecated and is kept only to prevent breaking existing user code. Starting from PCL 1.8.0 model sample size is a protected member of the SampleConsensusModel class [-Wdeprecated-declarations] SAC_SAMPLE_SIZE (sample_size_pairs, sample_size_pairs + sizeof (sample_size_pairs) / sizeof (SampleSizeModel)); ^~~~~~~~~~~~~~~ /usr/include/pcl-1.8/pcl/sample_consensus/model_types.h:99:3: note: declared here
the source file is successfully built. I have compared the offline and online versions of the code and I found out that in the online version the instruction
ec.extract (cluster_indices);
doesn't actually fill cluster_indices. As a consequence, the for loop following int j = 0; is not executed.
I would like to know why is that, and if there's any solution to that.