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