point_generator.h
Go to the documentation of this file.
00001 
00063 #ifndef COB_3D_MAPPING_TOOLS_POINT_GENERATOR_H_
00064 #define COB_3D_MAPPING_TOOLS_POINT_GENERATOR_H_
00065 
00066 #include <math.h>
00067 #include <iomanip>
00068 #include <Eigen/StdVector>
00069 #include <boost/random.hpp>
00070 
00071 #include <pcl/point_cloud.h>
00072 #include <pcl/point_types.h>
00073 #include <pcl/io/io.h>
00074 
00075 #include <sensor_msgs/PointField.h>
00076 #include <pcl/conversions.h>
00077 
00078 
00079 namespace cob_3d_mapping_tools
00080 {
00086   template<typename PointT> class PointGenerator
00087   {
00088   public:
00090     PointGenerator();
00092     ~PointGenerator();
00093 
00094     // public typedefs
00095     typedef pcl::PointCloud<PointT> PointCloud;
00096     typedef boost::shared_ptr<PointCloud> PointCloudPtr;
00097     typedef boost::shared_ptr<const PointCloud> PointCloudConstPtr;
00098 
00103     inline void setOutputCloud(PointCloudPtr & cloud)
00104     {
00105       //std::vector<sensor_msgs::PointField> field;
00106       std::vector<pcl::PCLPointField> fields;
00107       rgba_index_ = -1;
00108       rgba_index_ = pcl::getFieldIndex(*cloud, "rgba", fields);
00109       if (rgba_index_ >= 0)
00110         rgba_index_ = fields[rgba_index_].offset;
00111 
00112       cloud_ = cloud;
00113     }
00114 
00119     inline void setGaussianNoise(const float & sigma)
00120     {
00121       noise_ = sigma;
00122     }
00123 
00131     void generateLine(const float & step_size,
00132                       const Eigen::Vector3f & origin, 
00133                       const Eigen::Vector3f & direction,
00134                       const uint32_t & color = 0xffffff);
00135 
00146     void generateCircle(const float & step_size,
00147                         const Eigen::Vector3f & origin,
00148                         const Eigen::Vector3f & rotation_axis,
00149                         const Eigen::Vector3f & radius,
00150                         const float & angle = 2 * M_PI,
00151                         const uint32_t & color = 0xffffff);
00152 
00159     void generateCirclePlane(const float & step_size,
00160                              const Eigen::Vector3f & origin,
00161                              const Eigen::Vector3f & rotation_axis,
00162                              const float & radius);
00163 
00173     void generateCirclePlane(const float & step_size,
00174                              const Eigen::Vector3f & origin,
00175                              const Eigen::Vector3f & rotation_axis,
00176                              const Eigen::Vector3f & radius,
00177                              const float & angle = 2 * M_PI);
00178 
00186     void generatePlane(const float & step_size,
00187                        const Eigen::Vector3f & origin,
00188                        const Eigen::Vector3f & direction_1,
00189                        const Eigen::Vector3f & direction_2);
00190 
00199     void generateEdge(const float & step_size,
00200                       const Eigen::Vector3f & origin,
00201                       const Eigen::Vector3f & direction_edge,
00202                       const Eigen::Vector3f & direction_depth);
00203 
00212     void generateEdge(const float & step_size,
00213                       const Eigen::Vector3f & origin,
00214                       const Eigen::Vector3f & direction_edge,
00215                       const Eigen::Vector3f & direction_1,
00216                       const Eigen::Vector3f & direction_2);
00217 
00226     void generateCorner(const float & step_size,
00227                         const Eigen::Vector3f & origin,
00228                         const Eigen::Vector3f & direction_1,
00229                         const Eigen::Vector3f & direction_2,
00230                         const Eigen::Vector3f & direction_3,
00231                         const float & corner_size = 0.0f);
00232 
00242     void generateBox(const float & step_size,
00243                      const Eigen::Vector3f & origin,
00244                      const Eigen::Vector3f & direction_1,
00245                      const Eigen::Vector3f & direction_2,
00246                      const float & corner_size,
00247                      const float & height);
00248 
00257     void generateBox(const float & step_size,
00258                      const Eigen::Vector3f & origin,
00259                      const Eigen::Vector3f & direction_1,
00260                      const Eigen::Vector3f & direction_2,
00261                      const Eigen::Vector3f & direction_3,
00262                      const float & corner_size);
00263 
00270     void generateCylinder(const float & step_size,
00271                           const Eigen::Vector3f & origin,
00272                           const Eigen::Vector3f & direction,
00273                           const float & radius);
00274 
00282     void generateCylinder(const float & step_size,
00283                           const Eigen::Vector3f & origin,
00284                           const Eigen::Vector3f & direction,
00285                           const Eigen::Vector3f & radius, 
00286                           const float & angle);
00287 
00294     void generateCone(const float & step_size,
00295                       const Eigen::Vector3f & origin,
00296                       const Eigen::Vector3f & direction,
00297                       const float & radius_base,
00298                       const float & radius_peak = 0.0f);
00299 
00307     void generateSphere(const float & step_size,
00308                         const Eigen::Vector3f & center,
00309                         const Eigen::Vector3f & rotation_axis,
00310                         const float & radius,
00311                         const float & angle = M_PI);
00312 
00318     void generateSphere(const float & step_size,
00319                         const Eigen::Vector3f & center,
00320                         const float & radius);
00321 
00330     void generateHandle(const float & step_size,
00331                         const Eigen::Vector3f & origin,
00332                         const Eigen::Vector3f & rotation_axis,
00333                         const Eigen::Vector3f & radius_curvature,
00334                         const float & radius_handle,
00335                         const float & angle);
00336 
00337     inline float random()
00338     {
00339       return (noise_ * n_rng_());
00340     }
00341                         
00342 
00343   protected:
00344     inline int round(float f)
00345     {
00346       return f<0?f-.5:f+.5;
00347     }
00348 
00349     inline Eigen::Vector3f randomVector()
00350     {
00351       return (Eigen::Vector3f(random(), random(), random()));
00352     }
00353 
00359     inline Eigen::Vector3f getArbitraryPerpendicularNormalized(const Eigen::Vector3f & vector)
00360     {
00361       Eigen::Vector3f ret = vector.cross(Eigen::Vector3f::UnitZ());
00362       if (ret == Eigen::Vector3f::Zero())
00363         ret = vector.cross(Eigen::Vector3f::UnitY());
00364       return ret.normalized();
00365     }
00366 
00367     void addSinglePoint(const Eigen::Vector3f & point, const uint32_t & color = 0xffffff);
00368 
00369     PointCloudPtr cloud_;
00370     
00371     int rgba_index_;
00372     float noise_;
00373 
00374     // create general pseudo random number series with Mersenne Twister Algorithm
00375     boost::mt19937 rng_;
00376     // normal distribution (initialized in constructor)
00377     boost::normal_distribution<float> n_dist_;
00378     // connect distribution with random series
00379     boost::variate_generator<boost::mt19937&, boost::normal_distribution<float> > n_rng_;
00380   };
00381 }
00382 
00383 #endif // COB_3D_MAPPING_TOOLS_POINT_GENERATOR_H_


cob_3d_mapping_tools
Author(s): Georg Arbeiter
autogenerated on Wed Aug 26 2015 11:04:27