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 #ifndef JSK_PCL_ROS_CLUSTER_POINT_INDICES_DECOMPOSER_H_
00037 #define JSK_PCL_ROS_CLUSTER_POINT_INDICES_DECOMPOSER_H_
00038
00039 #include <ros/ros.h>
00040 #include <ros/names.h>
00041
00042 #include "jsk_recognition_msgs/ClusterPointIndices.h"
00043 #include "jsk_recognition_msgs/PolygonArray.h"
00044 #include "jsk_recognition_msgs/ModelCoefficientsArray.h"
00045 #include "jsk_recognition_utils/tf_listener_singleton.h"
00046
00047 #include "sensor_msgs/PointCloud2.h"
00048 #include <dynamic_reconfigure/server.h>
00049 #include <pcl_ros/pcl_nodelet.h>
00050 #include <message_filters/subscriber.h>
00051 #include <message_filters/time_synchronizer.h>
00052 #include <message_filters/synchronizer.h>
00053 #include <pcl/point_types.h>
00054 #include <pcl/impl/point_types.hpp>
00055 #include <tf/transform_broadcaster.h>
00056 #include <std_msgs/ColorRGBA.h>
00057 #include <jsk_recognition_msgs/BoundingBoxArray.h>
00058
00059 #include <diagnostic_updater/diagnostic_updater.h>
00060 #include <diagnostic_updater/publisher.h>
00061 #include "jsk_recognition_utils/pcl_util.h"
00062 #include <jsk_topic_tools/vital_checker.h>
00063 #include "jsk_topic_tools/diagnostic_nodelet.h"
00064 #include "jsk_pcl_ros/ClusterPointIndicesDecomposerConfig.h"
00065
00066 namespace jsk_pcl_ros
00067 {
00068 class ClusterPointIndicesDecomposer: public jsk_topic_tools::DiagnosticNodelet
00069 {
00070 public:
00071 ClusterPointIndicesDecomposer(): DiagnosticNodelet("ClusterPointIndicesDecomposer") { }
00072 typedef jsk_pcl_ros::ClusterPointIndicesDecomposerConfig Config;
00073 typedef message_filters::sync_policies::ExactTime<
00074 sensor_msgs::PointCloud2,
00075 jsk_recognition_msgs::ClusterPointIndices > SyncPolicy;
00076 typedef message_filters::sync_policies::ApproximateTime<
00077 sensor_msgs::PointCloud2,
00078 jsk_recognition_msgs::ClusterPointIndices > ApproximateSyncPolicy;
00079 typedef message_filters::sync_policies::ExactTime<
00080 sensor_msgs::PointCloud2,
00081 jsk_recognition_msgs::ClusterPointIndices,
00082 jsk_recognition_msgs::PolygonArray,
00083 jsk_recognition_msgs::ModelCoefficientsArray> SyncAlignPolicy;
00084 virtual void onInit();
00085 virtual void extract(const sensor_msgs::PointCloud2ConstPtr &point,
00086 const jsk_recognition_msgs::ClusterPointIndicesConstPtr &indices,
00087 const jsk_recognition_msgs::PolygonArrayConstPtr& planes,
00088 const jsk_recognition_msgs::ModelCoefficientsArrayConstPtr& coefficients);
00089 virtual void extract(const sensor_msgs::PointCloud2ConstPtr &point,
00090 const jsk_recognition_msgs::ClusterPointIndicesConstPtr &indices);
00091 virtual void sortIndicesOrder(const pcl::PointCloud<pcl::PointXYZ>::Ptr input,
00092 const std::vector<pcl::IndicesPtr> indices_array,
00093 std::vector<size_t>* argsort);
00094 void sortIndicesOrderByIndices(const pcl::PointCloud<pcl::PointXYZ>::Ptr input,
00095 const std::vector<pcl::IndicesPtr> indices_array,
00096 std::vector<size_t>* argsort);
00097 void sortIndicesOrderByZAxis(const pcl::PointCloud<pcl::PointXYZ>::Ptr input,
00098 const std::vector<pcl::IndicesPtr> indices_array,
00099 std::vector<size_t>* argsort);
00100 void sortIndicesOrderByCloudSize(const pcl::PointCloud<pcl::PointXYZ>::Ptr input,
00101 const std::vector<pcl::IndicesPtr> indices_array,
00102 std::vector<size_t>* argsort);
00103 protected:
00104 boost::shared_ptr <dynamic_reconfigure::Server<Config> > srv_;
00105 boost::mutex mutex_;
00106
00107 void addToDebugPointCloud
00108 (const pcl::PointCloud<pcl::PointXYZRGB>::Ptr segmented_cloud,
00109 size_t i,
00110 pcl::PointCloud<pcl::PointXYZRGB>& debug_output);
00111
00112 virtual bool computeCenterAndBoundingBox
00113 (const pcl::PointCloud<pcl::PointXYZRGB>::Ptr segmented_cloud,
00114 const std_msgs::Header header,
00115 const jsk_recognition_msgs::PolygonArrayConstPtr& planes,
00116 const jsk_recognition_msgs::ModelCoefficientsArrayConstPtr& coefficients,
00117 geometry_msgs::Pose& center_pose_msg,
00118 jsk_recognition_msgs::BoundingBox& bounding_box);
00119
00120 virtual bool transformPointCloudToAlignWithPlane(
00121 const pcl::PointCloud<pcl::PointXYZRGB>::Ptr segmented_cloud,
00122 pcl::PointCloud<pcl::PointXYZRGB>::Ptr segmented_cloud_transformed,
00123 const Eigen::Vector4f center,
00124 const jsk_recognition_msgs::PolygonArrayConstPtr& planes,
00125 const jsk_recognition_msgs::ModelCoefficientsArrayConstPtr& coefficients,
00126 Eigen::Matrix4f& m4,
00127 Eigen::Quaternionf& q);
00128
00129 virtual int findNearestPlane(const Eigen::Vector4f& center,
00130 const jsk_recognition_msgs::PolygonArrayConstPtr& planes,
00131 const jsk_recognition_msgs::ModelCoefficientsArrayConstPtr& coefficients);
00132
00133 virtual void configCallback (Config &config, uint32_t level);
00134 virtual void updateDiagnostic(
00135 diagnostic_updater::DiagnosticStatusWrapper &stat);
00136 virtual void allocatePublishers(size_t num);
00137 virtual void publishNegativeIndices(
00138 const sensor_msgs::PointCloud2ConstPtr &input,
00139 const jsk_recognition_msgs::ClusterPointIndicesConstPtr &indices_input);
00140 virtual void subscribe();
00141 virtual void unsubscribe();
00142
00143 static uint32_t colorRGBAToUInt32(std_msgs::ColorRGBA c)
00144 {
00145 uint8_t r, g, b;
00146 r = (uint8_t)(c.r * 255);
00147 g = (uint8_t)(c.g * 255);
00148 b = (uint8_t)(c.b * 255);
00149 return ((uint32_t)r<<16 | (uint32_t)g<<8 | (uint32_t)b);
00150 }
00151
00152 message_filters::Subscriber<sensor_msgs::PointCloud2> sub_input_;
00153 message_filters::Subscriber<jsk_recognition_msgs::ClusterPointIndices> sub_target_;
00154 message_filters::Subscriber<jsk_recognition_msgs::PolygonArray> sub_polygons_;
00155 message_filters::Subscriber<jsk_recognition_msgs::ModelCoefficientsArray> sub_coefficients_;
00156 boost::shared_ptr<message_filters::Synchronizer<SyncPolicy> >sync_;
00157 boost::shared_ptr<message_filters::Synchronizer<ApproximateSyncPolicy> >async_;
00158 boost::shared_ptr<message_filters::Synchronizer<SyncAlignPolicy> >sync_align_;
00159 std::vector<ros::Publisher> publishers_;
00160 ros::Publisher pc_pub_, box_pub_, mask_pub_, label_pub_, centers_pub_, negative_indices_pub_, indices_pub_;
00161 boost::shared_ptr<tf::TransformBroadcaster> br_;
00162 std::string tf_prefix_;
00163
00164 bool use_async_;
00165 int queue_size_;
00166 bool force_to_flip_z_axis_;
00167 bool publish_clouds_;
00168 bool publish_tf_;
00169 bool align_boxes_;
00170 bool align_boxes_with_plane_;
00171 std::string target_frame_id_;
00172 tf::TransformListener* tf_listener_;
00173 bool use_pca_;
00174 int max_size_;
00175 int min_size_;
00176 std::string sort_by_;
00177
00178 jsk_recognition_utils::Counter cluster_counter_;
00179
00180 };
00181
00182 class ClusterPointIndicesDecomposerZAxis: public ClusterPointIndicesDecomposer
00183 {
00184 public:
00185 virtual void onInit();
00186 };
00187
00188 }
00189
00190 #endif // JSK_PCL_ROS_CLUSTER_POINT_INDICES_DECOMPOSER_H_