Go to the documentation of this file.00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 
00030 
00031 
00032 
00033 
00034 
00035 
00036 
00037 #ifndef JSK_PCL_ROS_EDGE_DEPTH_REFINEMENT_H_
00038 #define JSK_PCL_ROS_EDGE_DEPTH_REFINEMENT_H_
00039 
00040 #include <pcl_ros/pcl_nodelet.h>
00041 #include <sensor_msgs/PointCloud2.h>
00042 #include <jsk_recognition_msgs/ClusterPointIndices.h>
00043 #include <jsk_recognition_msgs/ModelCoefficientsArray.h>
00044 #include <jsk_recognition_msgs/SegmentArray.h>
00045 
00046 #include <message_filters/subscriber.h>
00047 #include <message_filters/time_synchronizer.h>
00048 #include <message_filters/synchronizer.h>
00049 
00050 #include "jsk_recognition_utils/pcl_conversion_util.h"
00051 #include "jsk_recognition_utils/geo_util.h"
00052 #include <jsk_pcl_ros/EdgeDepthRefinementConfig.h>
00053 #include <dynamic_reconfigure/server.h>
00054 #include <boost/tuple/tuple.hpp>
00055 
00056 #include <jsk_topic_tools/connection_based_nodelet.h>
00057 
00058 namespace jsk_pcl_ros
00059 {
00060   class EdgeDepthRefinement: public jsk_topic_tools::ConnectionBasedNodelet
00061   {
00062   public:
00063     typedef message_filters::sync_policies::ExactTime<
00064     sensor_msgs::PointCloud2,
00065     jsk_recognition_msgs::ClusterPointIndices > SyncPolicy;
00066     typedef pcl::PointXYZRGB PointT;
00067     typedef jsk_pcl_ros::EdgeDepthRefinementConfig Config;
00068   protected:
00070     
00072     virtual void onInit();
00073     
00074     virtual void refine(
00075       const sensor_msgs::PointCloud2ConstPtr &point,
00076       const jsk_recognition_msgs::ClusterPointIndicesConstPtr &indices);
00077     
00078     virtual void removeOutliersByLine(
00079       const pcl::PointCloud<PointT>::Ptr& cloud,
00080       const std::vector<int>& indices,
00081       pcl::PointIndices& inliers,
00082       pcl::ModelCoefficients& coefficients);
00083     
00084     virtual void removeOutliers(
00085       const pcl::PointCloud<PointT>::Ptr& cloud,
00086       const std::vector<PCLIndicesMsg>& indices,
00087       std::vector<pcl::PointIndices::Ptr>& output_inliers,
00088       std::vector<pcl::ModelCoefficients::Ptr>& output_coefficients);
00089     
00090     virtual void removeDuplicatedEdges(
00091       const pcl::PointCloud<PointT>::Ptr& cloud,
00092       const std::vector<pcl::PointIndices::Ptr> inliers,
00093       const std::vector<pcl::ModelCoefficients::Ptr> coefficients,
00094       std::vector<pcl::PointIndices::Ptr>& output_inliers,
00095       std::vector<pcl::ModelCoefficients::Ptr>& output_coefficients);
00096     
00097     virtual jsk_recognition_utils::Line::Ptr lineFromCoefficients(
00098       const pcl::ModelCoefficients::Ptr coefficients);
00099     
00100     virtual jsk_recognition_utils::Segment::Ptr segmentFromIndices(
00101       const pcl::PointCloud<PointT>::Ptr& cloud,
00102       const std::vector<int>& indices,
00103       const jsk_recognition_utils::Line::Ptr& line);
00104     
00105     virtual void publishIndices(
00106       ros::Publisher& pub,
00107       ros::Publisher& pub_coefficients,
00108       ros::Publisher& pub_edges,
00109       const std::vector<pcl::PointIndices::Ptr> inliers,
00110       const std::vector<pcl::ModelCoefficients::Ptr> coefficients,
00111       const std_msgs::Header& header);
00112     
00113     virtual boost::tuple<int, int> findMinMaxIndex(
00114       const int width, const int height,
00115       const std::vector<int>& indices);
00116     
00117     virtual void integrateDuplicatedIndices(
00118       const pcl::PointCloud<PointT>::Ptr& cloud,
00119       const std::set<int>& duplicated_set,
00120       const std::vector<pcl::PointIndices::Ptr> all_inliers,
00121       pcl::PointIndices::Ptr& output_indices);
00122     
00123     virtual void configCallback (Config &config, uint32_t level);
00124 
00125     virtual void subscribe();
00126     virtual void unsubscribe();
00127     
00129     
00131     boost::shared_ptr <dynamic_reconfigure::Server<Config> > srv_;
00132     message_filters::Subscriber<sensor_msgs::PointCloud2> sub_input_;
00133     message_filters::Subscriber<jsk_recognition_msgs::ClusterPointIndices> sub_indices_;
00134     boost::shared_ptr<message_filters::Synchronizer<SyncPolicy> >sync_;
00135     ros::Publisher pub_indices_, pub_outlier_removed_indices_;
00136     ros::Publisher pub_coefficients_, pub_outlier_removed_coefficients_;
00137     ros::Publisher pub_edges_, pub_outlier_removed_edges_;
00138     boost::mutex mutex_;
00140     
00142     double outlier_distance_threshold_;
00143     int min_inliers_;
00145     
00147     double duplication_angle_threshold_;
00148     double duplication_distance_threshold_;
00149   private:
00150     
00151   };
00152 }
00153 
00154 #endif