36 #include <pcl/common/centroid.h> 42 ConnectionBasedNodelet::onInit();
43 pub_ = advertise<sensor_msgs::PointCloud2>(*
pnh_,
"output", 1);
47 double tmp_radius, tmp_pass, tmp_pass2;
53 if (!pnh_->getParam(
"rs", tmp_radius))
58 if (!pnh_->getParam(
"po", tmp_pass))
63 if (!pnh_->getParam(
"po2", tmp_pass2))
68 if (!pnh_->getParam(
"sum_num", tmp_sum_num))
70 NODELET_WARN(
"~sum_num is not specified, so set to 100");
92 pcl::PointCloud<pcl::PointXYZRGB>::Ptr
cloud (
new pcl::PointCloud<pcl::PointXYZRGB> ());
94 std::vector<int> indices;
97 cloud->is_dense =
false;
98 pcl::removeNaNFromPointCloud(*cloud, *cloud, indices);
100 pcl::search::KdTree<pcl::PointXYZRGB>::Ptr tree (
new pcl::search::KdTree<pcl::PointXYZRGB>);
101 tree->setInputCloud (cloud);
103 pcl::PassThrough<pcl::PointXYZRGB> pass;
104 pass.setInputCloud (cloud);
105 pass.setFilterFieldName (std::string(
"z"));
106 pass.setFilterLimits (0.0, 1.5);
107 pass.filter (*cloud);
109 pcl::NormalEstimation<pcl::PointXYZRGB, pcl::PointXYZRGBNormal> ne;
110 pcl::search::KdTree<pcl::PointXYZRGB>::Ptr tree2 (
new pcl::search::KdTree<pcl::PointXYZRGB> ());
111 pcl::PointCloud<pcl::PointXYZRGBNormal>::Ptr cloud_normals (
new pcl::PointCloud<pcl::PointXYZRGBNormal>);
112 ne.setInputCloud (cloud);
114 ne.setSearchMethod (tree2);
115 ne.setRadiusSearch (0.02);
116 ne.compute (*cloud_normals);
118 for (
int cloud_index = 0; cloud_index < cloud_normals->points.size(); cloud_index++){
119 cloud_normals->points[cloud_index].x = cloud->points[cloud_index].x;
120 cloud_normals->points[cloud_index].y = cloud->points[cloud_index].y;
121 cloud_normals->points[cloud_index].z = cloud->points[cloud_index].z;
125 int result_counter=0, call_counter = 0;
126 pcl::PointXYZRGBNormal max_pt,min_pt;
127 pcl::getMinMax3D(*cloud_normals, min_pt, max_pt);
128 for (
int i = 0 ; i < 200; i++){
130 double lucky = 0, lucky2 = 0;
131 std::string axis(
"x"),other_axis(
"y");
132 int rand_xy = rand()%2;
135 lucky2 = min_pt.y + (max_pt.y - min_pt.y) * 1.0 * rand() / RAND_MAX;
139 lucky2 = min_pt.x + (max_pt.x - min_pt.x) * 1.0 * rand() / RAND_MAX;
140 axis = std::string(
"y");
141 other_axis = std::string(
"x");
144 pcl::PointCloud<pcl::PointXYZRGBNormal>::Ptr cloud_normals_pass (
new pcl::PointCloud<pcl::PointXYZRGBNormal>);
146 pcl::PassThrough<pcl::PointXYZRGBNormal> pass;
147 pcl::IndicesPtr indices_x(
new std::vector<int>());
148 pass.setInputCloud (cloud_normals);
149 pass.setFilterFieldName (axis);
152 pass.setFilterLimits (small, large);
153 pass.filter (*cloud_normals_pass);
154 pass.setInputCloud (cloud_normals_pass);
155 pass.setFilterFieldName (other_axis);
158 pass.setFilterLimits (small2, large2);
159 pass.filter (*cloud_normals_pass);
161 std::vector<int> tmp_indices;
162 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 tree4 (
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 (tree4);
174 fpfh.compute (*fpfhs);
175 int target_id, max_value;
176 if ((
int)fpfhs->points.size() -
sum_num_ - 1 < 1){
178 max_value = (int)fpfhs->points.size();
180 target_id = rand() % ((int)fpfhs->points.size() -
sum_num_ - 1);
183 std::vector<double>
result;
187 float sum_hist_points = 0;
188 for(
int kndex = target_id; kndex < max_value;kndex++)
190 if(pcl_isnan(fpfhs->points[kndex].histogram[
index])){
193 sum_hist_points+=fpfhs->points[kndex].histogram[index];
196 result.push_back( sum_hist_points/
sum_num_ );
203 ml_classifiers::ClassifyData
srv;
204 ml_classifiers::ClassDataPoint class_data_point;
205 class_data_point.point = result;
206 srv.request.data.push_back(class_data_point);
208 if (atoi(srv.response.classifications[0].c_str()) == 0)
210 NODELET_DEBUG(
"response result : %s", srv.response.classifications[0].c_str());
216 pcl::compute3DCentroid (*cloud_normals_pass, c);
218 pcl::octree::OctreePointCloudSearch<pcl::PointXYZRGBNormal> search_octree (0.05);
219 search_octree.setInputCloud (cloud_normals);
220 search_octree.addPointsFromInputCloud ();
222 pcl::PointXYZRGBNormal point_a;
223 point_a.x = c[0];point_a.y = c[1];point_a.z = c[2];
224 std::vector<int> k_indices;
225 std::vector<float> k_sqr_distances;
226 search_octree.radiusSearch(point_a, 0.05, k_indices, k_sqr_distances);
229 int id = k_indices[
index];
231 cloud_normals->points[id].r =
std::min(
std::max(255.0 -
sqrt(k_sqr_distances[
index]) * 2000, 0.0) + cloud_normals->points[
id].r, 255.0);
233 cloud_normals->points[id].b =
std::min(
std::max(255.0 -
sqrt(k_sqr_distances[
index]) * 2000, 0.0) + cloud_normals->points[
id].b, 255.0);
237 sensor_msgs::PointCloud2 _pointcloud2;
239 _pointcloud2.header = pc.header;
240 _pointcloud2.is_dense =
false;
double min(const OneDataStat &d)
wrapper function for min method for boost::function
#define NODELET_WARN(...)
void publish(const boost::shared_ptr< M > &message) const
ros::Subscriber sub_input_
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::ColorizeMapRandomForest, nodelet::Nodelet)
void toROSMsg(const pcl::PointCloud< T > &pcl_cloud, sensor_msgs::PointCloud2 &cloud)
void extract(const sensor_msgs::PointCloud2 cloud)
#define NODELET_DEBUG(...)