iros12_planar_removal.h
Go to the documentation of this file.
00001 #ifndef _PLANAR_REMOVAL_IROS2012_H_
00002 #define _PLANAR_REMOVAL_IROS2012_H_
00003 
00004 // [Eigen]
00005 #include "Eigen/Core"
00006 
00007 // [ROS]
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 // [PCL_ROS]
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 //pcl::toROSMsg
00029 #include <pcl/io/pcd_io.h>
00030 
00031 //iriutils
00032 #include "mutex.h"
00033 
00034 // [OpenCV]
00035  #include <cv_bridge/cv_bridge.h>
00036  #include <opencv2/imgproc/imgproc.hpp>
00037  #include <opencv2/highgui/highgui.hpp>
00038 
00039 // [publisher subscriber headers]
00040 #include "sensor_msgs/Image.h"
00041 #include "sensor_msgs/PointCloud2.h"
00042 
00043 // [services]
00044 #include <dynamic_reconfigure/server.h>
00045 #include <iri_pcl_filters/IriPclFiltersParametersConfig.h>
00046 
00047 // static const char WINDOW[] = "Image window";
00048 
00049 typedef union {
00050     struct /*anonymous*/
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     //deafault should be:
00068     //this->mean_.R=143.4074;
00069     //this->mean_.G=134.5007;
00070     //this->mean_.B=134.8869;
00071     //this->std_=28.3;
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   //~ConditionBase(){}
00090   //~ConditionColor(){}
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       // [Subscribers]
00124       ros::Subscriber pcl2_sub_;
00125 
00126       // [Publishers]
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


iri_pcl_filters
Author(s): Sergi Foix
autogenerated on Fri Dec 6 2013 20:44:42