Go to the documentation of this file.00001 #include <pcl/point_types.h>
00002 #include <pcl/filters/extract_indices.h>
00003 #include <pcl/filters/voxel_grid.h>
00004 #include <pcl/io/pcd_io.h>
00005 #include <pcl/visualization/cloud_viewer.h>
00006 #include <pcl/kdtree/kdtree_flann.h>
00007 #include <pcl/kdtree/kdtree.h>
00008 #include <pcl/features/normal_3d.h>
00009 #include <geometry_msgs/Pose.h>
00010 #include <pcl/registration/registration.h>
00011
00012
00013 #ifndef COLLECT_FOOT_COMMON_H
00014 #define COLLECT_FOOT_COMMON_H
00015
00016 typedef pcl::PointXYZRGB PointT;
00017
00018 template <class P>
00019 void quickViz(boost::shared_ptr<const pcl::PointCloud<P> > cloud,
00020 const std::string& title = std::string("Cloud"))
00021 {
00022 pcl::visualization::PCLVisualizer viewer(title);
00023 viewer.addPointCloud<P>(cloud);
00024 viewer.spin();
00025 }
00026
00027
00028 template <class P, class N>
00029 void quickViz(boost::shared_ptr<const pcl::PointCloud<P> > cloud,
00030 boost::shared_ptr<const pcl::PointCloud<N> > normals,
00031 const std::string& title = std::string("Cloud"))
00032 {
00033 pcl::visualization::PCLVisualizer viewer(title);
00034 viewer.addPointCloud<P>(cloud, "cloud");
00035 viewer.addPointCloudNormals<P, N>(cloud, normals, 1, 0.01, "normals");
00036 viewer.spin();
00037 }
00038
00039
00040 template <class C>
00041 void extractIndices(const typename C::ConstPtr& input, pcl::PointIndices::ConstPtr indices,
00042 C& output, bool positive=true)
00043 {
00044 pcl::ExtractIndices<typename C::PointType> extractor;
00045 extractor.setNegative(!positive);
00046 extractor.setInputCloud(input);
00047 extractor.setIndices(indices);
00048 extractor.filter(output);
00049 }
00050 template <class C>
00051 void extractIndices(const typename C::Ptr& input, const pcl::PointIndices& indices,
00052 C& output, bool positive=true)
00053 {
00054 pcl::PointIndices::ConstPtr indices_ptr(new pcl::PointIndices(indices));
00055 extractIndices(input, indices_ptr, output, positive);
00056 }
00057
00058 template <class P>
00059 typename pcl::PointCloud<P>::Ptr loadPCDFile(const std::string &filename)
00060 {
00061 typename pcl::PointCloud<P>::Ptr c(new pcl::PointCloud<P>);
00062 pcl::io::loadPCDFile<P>(filename, *c);
00063 return c;
00064 }
00065
00066
00067 template <class P>
00068 typename pcl::PointCloud<P>::Ptr downsample(typename pcl::PointCloud<P>::ConstPtr cloud,
00069 double voxel_grid_size)
00070 {
00071 typename pcl::PointCloud<P>::Ptr result(new pcl::PointCloud<P>);
00072 pcl::VoxelGrid<P> vox_grid;
00073 vox_grid.setInputCloud(cloud);
00074 vox_grid.setLeafSize(voxel_grid_size, voxel_grid_size, voxel_grid_size);
00075 vox_grid.filter(*result);
00076 return result;
00077 }
00078
00079
00080 template <class P, class N>
00081 typename pcl::PointCloud<N>::Ptr compute_surface_normals (typename pcl::PointCloud<P>::ConstPtr points,
00082 float normal_radius)
00083 {
00084 typename pcl::PointCloud<N>::Ptr result(new pcl::PointCloud<N>);
00085 typename pcl::NormalEstimation<P, N> norm_est;
00086
00087
00088 norm_est.setSearchMethod (typename pcl::search::Search<P>::Ptr(new pcl::search::KdTree<P>));
00089
00090
00091 norm_est.setRadiusSearch (normal_radius);
00092
00093
00094 norm_est.setInputCloud (points);
00095
00096
00097 norm_est.compute(*result);
00098 return result;
00099 }
00100
00101
00102
00103 template <class P>
00104 void transform(typename pcl::PointCloud<P>::Ptr cloud_in, typename pcl::PointCloud<P>::Ptr cloud_out, const geometry_msgs::Pose& p)
00105 {
00106 Eigen::Quaternionf q(p.orientation.w, p.orientation.x, p.orientation.y, p.orientation.z);
00107 Eigen::Translation3f t(p.position.x, p.position.y, p.position.z);
00108 Eigen::Affine3f trans = t * q;
00109 pcl::transformPointCloud(*cloud_in, *cloud_out, trans);
00110 }
00111
00112
00113 template <class P>
00114 void transform_inverse(typename pcl::PointCloud<P>::Ptr cloud_in, typename pcl::PointCloud<P>::Ptr cloud_out, const geometry_msgs::Pose& p)
00115 {
00116 Eigen::Quaternionf q(p.orientation.w, p.orientation.x, p.orientation.y, p.orientation.z);
00117 Eigen::Translation3f t(p.position.x, p.position.y, p.position.z);
00118 Eigen::Affine3f trans = t * q;
00119 pcl::transformPointCloud(*cloud_in, *cloud_out, trans.inverse());
00120 }
00121
00122
00123
00124
00125 #endif