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
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
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
00375 boost::mt19937 rng_;
00376
00377 boost::normal_distribution<float> n_dist_;
00378
00379 boost::variate_generator<boost::mt19937&, boost::normal_distribution<float> > n_rng_;
00380 };
00381 }
00382
00383 #endif // COB_3D_MAPPING_TOOLS_POINT_GENERATOR_H_