46 pub_ =
pnh_->advertise<sensor_msgs::PointCloud2>(
"output/zero", 1);
47 pub2_ =
pnh_->advertise<sensor_msgs::PointCloud2>(
"output/nonzero", 1);
51 double tmp_radius = 0.03, tmp_pass = 0.03, tmp_pass2 = 0.06;
53 if (!
pnh_->getParam(
"rs", tmp_radius))
57 if (!
pnh_->getParam(
"po", tmp_pass))
61 if (!
pnh_->getParam(
"po2", tmp_pass2))
67 NODELET_WARN(
"~sum_num is not specified, so set to 100");
77 pcl::PointCloud<pcl::PointXYZRGB>::Ptr
cloud (
new pcl::PointCloud<pcl::PointXYZRGB> ());
79 std::vector<int> indices;
81 cloud->is_dense =
false;
82 pcl::removeNaNFromPointCloud(*cloud, *cloud, indices);
84 pcl::search::KdTree<pcl::PointXYZRGB>::Ptr tree (
new pcl::search::KdTree<pcl::PointXYZRGB>);
85 tree->setInputCloud (cloud);
86 pcl::PassThrough<pcl::PointXYZRGB> pass;
87 pass.setInputCloud (cloud);
88 pass.setFilterFieldName (std::string(
"z"));
89 pass.setFilterLimits (0.0, 1.5);
92 std::vector<pcl::PointIndices> cluster_indices;
93 pcl::EuclideanClusterExtraction<pcl::PointXYZRGB> ec;
94 ec.setClusterTolerance (0.025);
95 ec.setMinClusterSize (200);
96 ec.setMaxClusterSize (100000);
97 ec.setSearchMethod (tree);
98 ec.setInputCloud (cloud);
99 ec.extract (cluster_indices);
101 pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloth_cloud_cluster (
new pcl::PointCloud<pcl::PointXYZRGB>);
102 pcl::PointCloud<pcl::PointXYZRGB>::Ptr noncloth_cloud_cluster (
new pcl::PointCloud<pcl::PointXYZRGB>);
104 for (std::vector<pcl::PointIndices>::const_iterator it = cluster_indices.begin (); it != cluster_indices.end (); ++it)
106 NODELET_DEBUG(
"Calculate time %d / %ld", cluster_num , cluster_indices.size());
107 pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud_cluster (
new pcl::PointCloud<pcl::PointXYZRGB>);
108 for (std::vector<int>::const_iterator pit = it->indices.begin (); pit != it->indices.end (); pit++)
109 cloud_cluster->points.push_back (cloud->points[*pit]);
110 cloud_cluster->is_dense =
true;
113 pcl::NormalEstimation<pcl::PointXYZRGB, pcl::PointXYZRGBNormal> ne;
114 pcl::search::KdTree<pcl::PointXYZRGB>::Ptr tree (
new pcl::search::KdTree<pcl::PointXYZRGB> ());
115 pcl::PointCloud<pcl::PointXYZRGBNormal>::Ptr cloud_normals (
new pcl::PointCloud<pcl::PointXYZRGBNormal>);
116 ne.setInputCloud (cloud_cluster);
117 ne.setSearchMethod (tree);
118 ne.setRadiusSearch (0.02);
119 ne.compute (*cloud_normals);
121 for (
int cloud_index = 0; cloud_index < cloud_normals->points.size(); cloud_index++){
122 cloud_normals->points[cloud_index].x = cloud_cluster->points[cloud_index].x;
123 cloud_normals->points[cloud_index].y = cloud_cluster->points[cloud_index].y;
124 cloud_normals->points[cloud_index].z = cloud_cluster->points[cloud_index].z;
127 int result_counter=0, call_counter = 0;
128 pcl::PointXYZRGBNormal max_pt,min_pt;
129 pcl::getMinMax3D(*cloud_normals, min_pt, max_pt);
131 for (
int i = 0 ; i < 30; i++){
132 double lucky = 0, lucky2 = 0;
133 std::string axis(
"x"), other_axis(
"y");
134 int rand_xy = rand()%2;
137 lucky2 = min_pt.y + (max_pt.y - min_pt.y) * 1.0 * rand() / RAND_MAX;
140 lucky2 = min_pt.x + (max_pt.x - min_pt.x) * 1.0 * rand() / RAND_MAX;
141 axis = std::string(
"y");
142 other_axis = std::string(
"x");
144 pcl::PointCloud<pcl::PointXYZRGBNormal>::Ptr cloud_normals_pass (
new pcl::PointCloud<pcl::PointXYZRGBNormal>);
145 pcl::PassThrough<pcl::PointXYZRGBNormal> pass;
146 pcl::IndicesPtr indices_x(
new std::vector<int>());
147 pass.setInputCloud (cloud_normals);
148 pass.setFilterFieldName (axis);
151 pass.setFilterLimits (small, large);
152 pass.filter (*cloud_normals_pass);
153 pass.setInputCloud (cloud_normals_pass);
154 pass.setFilterFieldName (other_axis);
157 pass.setFilterLimits (small2, large2);
158 pass.filter (*cloud_normals_pass);
160 std::vector<int> tmp_indices;
161 pcl::removeNaNFromPointCloud(*cloud_normals_pass, *cloud_normals_pass, tmp_indices);
163 if(cloud_normals_pass->points.size() == 0)
166 pcl::FPFHEstimationOMP<pcl::PointXYZRGBNormal, pcl::PointXYZRGBNormal, pcl::FPFHSignature33> fpfh;
167 pcl::search::KdTree<pcl::PointXYZRGBNormal>::Ptr tree (
new pcl::search::KdTree<pcl::PointXYZRGBNormal>);
168 pcl::PointCloud<pcl::FPFHSignature33>::Ptr fpfhs (
new pcl::PointCloud<pcl::FPFHSignature33> ());
169 fpfh.setNumberOfThreads(8);
170 fpfh.setInputCloud (cloud_normals_pass);
171 fpfh.setInputNormals (cloud_normals_pass);
172 fpfh.setSearchMethod (tree);
174 fpfh.compute (*fpfhs);
176 if((
int)fpfhs->points.size() == 0)
179 std::vector<double>
result;
180 int target_id, max_value;
181 if ((
int)fpfhs->points.size() -
sum_num_ - 1 < 1){
183 max_value = (int)fpfhs->points.size();
185 target_id = rand() % ((int)fpfhs->points.size() -
sum_num_ - 1);
189 bool has_nan =
false;
191 float sum_hist_points = 0;
192 for(
int kndex = target_id; kndex < max_value;kndex++)
194 sum_hist_points+=fpfhs->points[kndex].histogram[
index];
196 result.push_back( sum_hist_points/
sum_num_ );
199 for(
int x = 0;
x < result.size();
x ++){
200 if(pcl_isnan(result[
x]))
208 ml_classifiers::ClassifyData
srv;
209 ml_classifiers::ClassDataPoint class_data_point;
210 class_data_point.point = result;
211 srv.request.data.push_back(class_data_point);
213 if (atoi(srv.response.classifications[0].c_str()) == 0)
215 NODELET_DEBUG(
"response result : %s", srv.response.classifications[0].c_str());
218 if(result_counter >= call_counter / 2){
219 NODELET_DEBUG(
"Result == 0 because counter is %d / %d", result_counter, call_counter);
222 NODELET_DEBUG(
"Result != 0 because counter is %d / %d", result_counter, call_counter);
225 for (
int i = 0; i < cloud_cluster->points.size(); i++){
226 if(result_counter >= call_counter / 2){
227 cloth_cloud_cluster->points.push_back (cloud_cluster->points[i]);
230 noncloth_cloud_cluster->points.push_back (cloud_cluster->points[i]);
234 sensor_msgs::PointCloud2 cloth_pointcloud2;
236 cloth_pointcloud2.header = pc.header;
237 cloth_pointcloud2.is_dense =
false;
240 sensor_msgs::PointCloud2 noncloth_pointcloud2;
241 pcl::toROSMsg(*noncloth_cloud_cluster, noncloth_pointcloud2);
242 noncloth_pointcloud2.header = pc.header;
243 noncloth_pointcloud2.is_dense =
false;
double min(const OneDataStat &d)
wrapper function for min method for boost::function
ros::Subscriber sub_input_
#define NODELET_WARN(...)
void publish(const boost::shared_ptr< M > &message) const
double max(const OneDataStat &d)
wrapper function for max method for boost::function
bool call(MReq &req, MRes &res)
void fromROSMsg(const sensor_msgs::PointCloud2 &cloud, pcl::PointCloud< T > &pcl_cloud)
PLUGINLIB_EXPORT_CLASS(jsk_pcl_ros::ColorizeRandomForest, nodelet::Nodelet)
void toROSMsg(const pcl::PointCloud< T > &pcl_cloud, sensor_msgs::PointCloud2 &cloud)
void extract(const sensor_msgs::PointCloud2 cloud)
#define NODELET_DEBUG(...)