Go to the documentation of this file.00001 #ifndef _PLANAR_REMOVAL_IROS2012_H_
00002 #define _PLANAR_REMOVAL_IROS2012_H_
00003
00004
00005 #include "Eigen/Core"
00006
00007
00008 #include "ros/ros.h"
00009 #include "ros/callback_queue.h"
00010 #include "image_transport/image_transport.h"
00011 #include <sensor_msgs/point_cloud_conversion.h>
00012
00013
00014 #include <pcl/ros/conversions.h>
00015 #include <pcl/point_cloud.h>
00016 #include <pcl/point_types.h>
00017
00018 #include <pcl/sample_consensus/model_types.h>
00019 #include <pcl/sample_consensus/method_types.h>
00020 #include <pcl/segmentation/sac_segmentation.h>
00021 #include <pcl/ros/register_point_struct.h>
00022 #include <pcl/filters/voxel_grid.h>
00023 #include <pcl/filters/extract_indices.h>
00024 #include <pcl/filters/conditional_removal.h>
00025
00026 #include <cmath>
00027
00028
00029 #include <pcl/io/pcd_io.h>
00030
00031
00032 #include "mutex.h"
00033
00034
00035 #include <cv_bridge/cv_bridge.h>
00036 #include <opencv2/imgproc/imgproc.hpp>
00037 #include <opencv2/highgui/highgui.hpp>
00038
00039
00040 #include "sensor_msgs/Image.h"
00041 #include "sensor_msgs/PointCloud2.h"
00042
00043
00044 #include <dynamic_reconfigure/server.h>
00045 #include <iri_pcl_filters/IriPclFiltersParametersConfig.h>
00046
00047
00048
00049 typedef union {
00050 struct
00051 {
00052 unsigned char Blue;
00053 unsigned char Green;
00054 unsigned char Red;
00055 unsigned char Alpha;
00056 };
00057 float float_value;
00058 long long_value;
00059 } RGBValue;
00060
00061 class ConditionColor:public pcl::ComparisonBase<pcl::PointXYZRGB> {
00062 RGBValue mean_;
00063 float std_;
00064 public:
00065 ConditionColor(RGBValue the_mean, float the_std) : pcl::ComparisonBase<pcl::PointXYZRGB>()
00066 {
00067
00068
00069
00070
00071
00072 this->mean_=the_mean;
00073 this->std_=the_std;
00074 capable_=true;
00075 }
00076
00077 bool evaluate(const pcl::PointXYZRGB &point) const
00078 {
00079 RGBValue color;
00080 color.float_value = point.rgb;
00081 float dist = sqrt(pow(color.Red - this->mean_.Red, 2)+
00082 pow(color.Blue - this->mean_.Blue, 2)+
00083 pow(color.Green - this->mean_.Green, 2));
00084 if(dist<2*this->std_)
00085 return false;
00086 else
00087 return true;
00088 }
00089
00090
00091 };
00092
00093 class PlanarRemovalIROS2012 {
00094 public:
00095 PlanarRemovalIROS2012();
00096 ~PlanarRemovalIROS2012();
00097
00098 private:
00099
00100 double distance_threshold_;
00101 double cloud_remaining_proportion_threshold_;
00102 int max_num_of_planes_removed_;
00103
00104 CMutex mutex;
00105
00106 cv_bridge::CvImage cv_image;
00107
00108 sensor_msgs::Image image_msg_;
00109
00110 ros::NodeHandle nh_;
00111
00112 pcl::PointCloud<pcl::PointXYZ> pcl_xyz_;
00113 pcl::PointCloud<pcl::PointXYZRGB> pcl_xyzrgb_;
00114 pcl::PointCloud<pcl::PointXYZ> pcl_xyzrgb2_;
00115 pcl::PointCloud<pcl::PointXYZ> pcl_planes_xyz_;
00116 pcl::PointCloud<pcl::PointXYZRGB> pcl_planes_xyzrgb_;
00117
00118 void removePlanesXYZ(pcl::PointCloud<pcl::PointXYZ> cloud, pcl::PointCloud<pcl::PointXYZRGB>& cloud_filtered, pcl::PointCloud<pcl::PointXYZRGB>& cloud_planes );
00119 void removePlanesXYZRGB(pcl::PointCloud<pcl::PointXYZRGB> cloud, pcl::PointCloud<pcl::PointXYZRGB>& cloud_filtered, pcl::PointCloud<pcl::PointXYZRGB>& cloud_planes );
00120 void image_from_pcl2(cv::Mat& rgb_image);
00121 void image_from_sparse_pcl2(pcl::PointCloud<pcl::PointXYZRGB> cloud, cv::Mat& rgb_image);
00122
00123
00124 ros::Subscriber pcl2_sub_;
00125
00126
00127 ros::Publisher pcl2_pub_;
00128 ros::Publisher pcl2_planes_pub_;
00129 ros::Publisher coefficients_pub_;
00130 image_transport::ImageTransport it_;
00131
00132 sensor_msgs::PointCloud2 pcl2_filtered_msg_;
00133 sensor_msgs::PointCloud2 pcl2_planes_msg_;
00134
00135 image_transport::Publisher image_pub_;
00136
00137 dynamic_reconfigure::Server<iri_pcl_filters::IriPclFiltersParametersConfig> dyn_reconfig_srv;
00138
00139 void reconfigureCallback(iri_pcl_filters::IriPclFiltersParametersConfig &config, uint32_t level);
00140
00141 void pcl2_sub_callback(const sensor_msgs::PointCloud2::ConstPtr& msg);
00142 };
00143 #endif