42 #include <pcl/gpu/containers/device_array.h>
44 #include <pcl/point_cloud.h>
48 #include <pcl/gpu/kinfu_large_scale/tsdf_buffer.h>
50 #include <pcl/gpu/kinfu_large_scale/point_intensity.h>
65 using Ptr = shared_ptr<TsdfVolume>;
82 volume_element_size (sizeof(float)),
83 weights_element_size (sizeof(short))
86 Header (
const Eigen::Vector3i &res,
const Eigen::Vector3f &size)
89 volume_element_size (sizeof(float)),
90 weights_element_size (sizeof(short))
95 getVolumeSize ()
const {
return resolution[0] * resolution[1] * resolution[2]; };
97 friend inline std::ostream&
100 os <<
"(resolution = " << h.
resolution.transpose() <<
", volume size = " << h.
volume_size.transpose() <<
")";
109 enum { DEFAULT_CLOUD_BUFFER_SIZE = 10 * 1000 * 1000 };
133 const Eigen::Vector3f&
137 const Eigen::Vector3i&
141 const Eigen::Vector3f
235 setHeader (
const Eigen::Vector3i& resolution,
const Eigen::Vector3f& volume_size) {
236 header_ =
Header (resolution, volume_size);
237 if (volume_host_->size() != this->size())
238 pcl::console::print_warn (
"[TSDFVolume::setHeader] Header volume size (%d) doesn't fit underlying data size (%d)", volume_host_->size(), size());
244 return header_.getVolumeSize ();
253 const unsigned step = 2)
const;
256 inline const Eigen::Vector3i &
261 save (
const std::string &filename =
"tsdf_volume.dat",
bool binary =
true)
const;
265 load (
const std::string &filename,
bool binary =
true);
269 Eigen::Vector3f size_;
272 Eigen::Vector3i resolution_;
281 using VolumePtr = shared_ptr<std::vector<float> >;
282 using WeightsPtr = shared_ptr<std::vector<short> >;
285 VolumePtr volume_host_;
286 WeightsPtr weights_host_;
PointCloud represents the base class in PCL for storing collections of 3D points.
shared_ptr< PointCloud< PointT > > Ptr
void downloadTsdfAndWeights(std::vector< float > &tsdf, std::vector< short > &weights) const
Downloads TSDF volume and according voxel weights from GPU memory.
void releaseVolume()
Releases tsdf buffer on GPU.
const Eigen::Vector3f & getSize() const
Returns volume size in meters.
void downloadTsdfLocal() const
Downloads tsdf volume from GPU memory to local CPU buffer.
void setHeader(const Eigen::Vector3i &resolution, const Eigen::Vector3f &volume_size)
Set the header for data stored on host directly.
void fetchNormals(const DeviceArray< PointType > &cloud, DeviceArray< NormalType > &normals) const
Computes normals as gradient of tsdf for given points.
DeviceArray< PointType > fetchCloud(DeviceArray< PointType > &cloud_buffer) const
Generates cloud using GPU in connected6 mode only.
void pushSlice(const PointCloud< PointXYZI >::Ptr existing_data_cloud, const tsdf_buffer *buffer) const
Push a point cloud of previously scanned tsdf slice to the TSDF volume.
void setSize(const Eigen::Vector3f &size)
Sets Tsdf volume size for each dimension.
void downloadTsdf(std::vector< float > &tsdf) const
Downloads tsdf volume from GPU memory.
std::size_t size() const
Returns overall number of voxels in grid stored on host.
bool load(const std::string &filename, bool binary=true)
Loads local volume from file.
void convertToTsdfCloud(pcl::PointCloud< pcl::PointXYZI >::Ptr &cloud, const unsigned step=2) const
Converts volume stored on host to cloud of TSDF values.
DeviceArray2D< int > data() const
Returns tsdf volume container that point to data in GPU memory.
shared_ptr< TsdfVolume > Ptr
void fetchCloudHost(PointCloud< PointType > &cloud, bool connected26=false) const
Generates cloud using CPU (downloads volumetric representation to CPU memory)
void fetchCloudHost(PointCloud< PointXYZI > &cloud, bool connected26=false) const
Generates cloud using CPU (downloads volumetric representation to CPU memory)
shared_ptr< const TsdfVolume > ConstPtr
TsdfVolume(const Eigen::Vector3i &resolution)
Constructor.
void reset()
Resets tsdf volume data to uninitialized state.
void setTsdfTruncDist(float distance)
Sets Tsdf truncation distance.
void print_warn(const char *arg1, std::size_t size)
const Eigen::Vector3i & getResolution() const
Returns volume resolution.
const Eigen::Vector3f getVoxelSize() const
Returns volume voxel size in meters.
void downloadTsdfAndWeightsLocal() const
Downloads TSDF volume and according voxel weights from GPU memory to local CPU buffers.
std::size_t fetchSliceAsCloud(DeviceArray< PointType > &cloud_buffer_xyz, DeviceArray< float > &cloud_buffer_intensity, const tsdf_buffer *buffer, int shiftX, int shiftY, int shiftZ) const
Generates cloud using GPU in connected6 mode only.
void fetchNormals(const DeviceArray< PointType > &cloud, DeviceArray< PointType > &normals) const
Computes normals as gradient of tsdf for given points.
float getTsdfTruncDist() const
Returns tsdf truncation distance in meters.
bool save(const std::string &filename="tsdf_volume.dat", bool binary=true) const
Saves local volume buffer to file.
const Eigen::Vector3i & gridResolution() const
Returns the voxel grid resolution.
Defines all the PCL implemented PointT point type structures.
#define PCL_MAKE_ALIGNED_OPERATOR_NEW
Macro to signal a class requires a custom allocator.
Defines functions, macros and traits for allocating and using memory.
PCL_EXPORTS void print_warn(const char *format,...)
Print a warning message on stream with colors.
float distance(const PointT &p1, const PointT &p2)
std::ostream & operator<<(std::ostream &os, const float3 &v1)
Defines all the PCL and non-PCL macros used.
A point structure representing normal coordinates and the surface curvature estimate.
A point structure representing Euclidean xyz coordinates.
Structure to handle buffer addresses.