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_LINEMOD_H_
00038 #define JSK_PCL_ROS_LINEMOD_H_
00039
00040 #include "jsk_recognition_utils/pcl_conversion_util.h"
00041 #include <image_geometry/pinhole_camera_model.h>
00042 #include <jsk_topic_tools/diagnostic_nodelet.h>
00043 #include <pcl/recognition/linemod/line_rgbd.h>
00044 #include <pcl/recognition/color_gradient_modality.h>
00045 #include <pcl/recognition/surface_normal_modality.h>
00046
00047 #include <jsk_pcl_ros/LINEMODDetectorConfig.h>
00048 #include <sensor_msgs/PointCloud2.h>
00049 #include <sensor_msgs/CameraInfo.h>
00050 #include <dynamic_reconfigure/server.h>
00051
00052 #include <std_srvs/Empty.h>
00053 #include <message_filters/subscriber.h>
00054 #include <message_filters/time_synchronizer.h>
00055 #include <message_filters/synchronizer.h>
00056 #include <pcl/recognition/linemod.h>
00057 #include <pcl/recognition/color_gradient_modality.h>
00058 #include <pcl/recognition/surface_normal_modality.h>
00059 #include <jsk_recognition_msgs/BoundingBox.h>
00060 #include <jsk_recognition_msgs/BoundingBoxArray.h>
00061 #include <pcl_ros/pcl_nodelet.h>
00062
00063 namespace jsk_pcl_ros
00064 {
00065 class LINEMODDetector: public jsk_topic_tools::DiagnosticNodelet
00066 {
00067 public:
00068 typedef LINEMODDetectorConfig Config;
00069 LINEMODDetector(): DiagnosticNodelet("LINEMODDetector") {}
00070 protected:
00072
00074 virtual void onInit();
00075 virtual void subscribe();
00076 virtual void unsubscribe();
00077 virtual void detect(
00078 const sensor_msgs::PointCloud2::ConstPtr& cloud_msg);
00079 virtual void configCallback(
00080 Config& config, uint32_t level);
00081 virtual void computeCenterOfTemplate(
00082 pcl::PointCloud<pcl::PointXYZRGBA>::Ptr cloud,
00083 const pcl::SparseQuantizedMultiModTemplate& linemod_template,
00084 const pcl::LINEMODDetection& linemod_detection,
00085 Eigen::Vector3f& center);
00087
00089 ros::Subscriber sub_cloud_;
00090 ros::Publisher pub_cloud_;
00091 ros::Publisher pub_detect_mask_;
00092 ros::Publisher pub_pose_;
00093 ros::Publisher pub_original_template_cloud_;
00094 boost::mutex mutex_;
00095 boost::shared_ptr <dynamic_reconfigure::Server<Config> > srv_;
00096
00098
00100 std::string template_file_;
00101 double gradient_magnitude_threshold_;
00102 double detection_threshold_;
00103
00104 pcl::LINEMOD linemod_;
00105 pcl::PointCloud<pcl::PointXYZRGBA>::Ptr template_cloud_;
00106 std::vector<Eigen::Affine3f> template_poses_;
00107 std::vector<jsk_recognition_msgs::BoundingBox> template_bboxes_;
00108 pcl::ColorGradientModality<pcl::PointXYZRGBA> color_gradient_mod_;
00109 pcl::SurfaceNormalModality<pcl::PointXYZRGBA> surface_normal_mod_;
00110 private:
00111
00112 };
00113
00114 class LINEMODTrainer: public pcl_ros::PCLNodelet
00115 {
00116 public:
00117 typedef boost::shared_ptr<LINEMODTrainer> Ptr;
00118 typedef message_filters::sync_policies::ExactTime<
00119 sensor_msgs::PointCloud2,
00120 PCLIndicesMsg> SyncPolicy;
00121 protected:
00123
00125 virtual void onInit();
00126 virtual void store(
00127 const sensor_msgs::PointCloud2::ConstPtr& cloud_msg,
00128 const PCLIndicesMsg::ConstPtr& indices_msg);
00129 virtual void subscribeCloud(
00130 const sensor_msgs::PointCloud2::ConstPtr& cloud_msg);
00131 virtual void subscribeCameraInfo(
00132 const sensor_msgs::CameraInfo::ConstPtr& info_msg);
00133 virtual bool startTraining(std_srvs::Empty::Request& req,
00134 std_srvs::Empty::Response& res);
00135 virtual std::vector<std::string> trainOneData(
00136 pcl::PointCloud<pcl::PointXYZRGBA>::Ptr cloud,
00137 pcl::PointIndices::Ptr mask,
00138 std::string& tempstr,
00139 int i);
00140 virtual void tar(const std::string& directory, const std::string& output);
00141 virtual bool clearData(std_srvs::Empty::Request& req,
00142 std_srvs::Empty::Response& res);
00143 virtual void trainWithoutViewpointSampling();
00144 virtual void trainWithViewpointSampling();
00145 virtual void organizedPointCloudWithViewPoint(
00146 const Eigen::Affine3f& transform,
00147 pcl::PointCloud<pcl::PointXYZRGBA>::Ptr raw_cloud,
00148 const image_geometry::PinholeCameraModel& model,
00149 pcl::PointCloud<pcl::PointXYZRGBA>::Ptr output,
00150 pcl::PointIndices& mask);
00151 virtual void generateLINEMODTrainingData(
00152 pcl::PointCloud<pcl::PointXYZRGBA>::Ptr cloud,
00153 pcl::PointIndices::Ptr mask,
00154 pcl::ColorGradientModality<pcl::PointXYZRGBA>& color_grad_mod,
00155 pcl::SurfaceNormalModality<pcl::PointXYZRGBA>& surface_norm_mod,
00156 pcl::MaskMap& mask_map,
00157 pcl::RegionXY& region);
00159
00161 boost::shared_ptr<message_filters::Synchronizer<SyncPolicy> >sync_;
00162 message_filters::Subscriber<sensor_msgs::PointCloud2> sub_input_;
00163 message_filters::Subscriber<PCLIndicesMsg> sub_indices_;
00164 ros::ServiceServer start_training_srv_;
00165 ros::ServiceServer clear_data_srv_;
00166 ros::Publisher pub_range_image_;
00167 ros::Publisher pub_colored_range_image_;
00168 ros::Publisher pub_sample_cloud_;
00169 ros::Subscriber sub_input_nonsync_;
00170 ros::Subscriber sub_camera_info_nonsync_;
00171 sensor_msgs::CameraInfo::ConstPtr camera_info_;
00172 std::vector<pcl::PointCloud<pcl::PointXYZRGBA>::Ptr> samples_before_sampling_;
00173 std::vector<pcl::PointCloud<pcl::PointXYZRGBA>::Ptr> samples_;
00174 std::vector<pcl::PointIndices::Ptr> sample_indices_;
00175 boost::mutex mutex_;
00176 std::string output_file_;
00177 bool sample_viewpoint_;
00178 double sample_viewpoint_angle_step_;
00179 double sample_viewpoint_radius_step_;
00180 double sample_viewpoint_angle_min_;
00181 double sample_viewpoint_radius_min_;
00182 double sample_viewpoint_angle_max_;
00183 double sample_viewpoint_radius_max_;
00184 private:
00185
00186 };
00187 }
00188
00189
00190 #endif