Point Cloud Library (PCL)  1.12.0
outofcore_node_data.h
1 /*
2  * Software License Agreement (BSD License)
3  *
4  * Point Cloud Library (PCL) - www.pointclouds.org
5  * Copyright (c) 2010-2012, Willow Garage, Inc.
6  *
7  * All rights reserved.
8  *
9  * Redistribution and use in source and binary forms, with or without
10  * modification, are permitted provided that the following conditions
11  * are met:
12  *
13  * * Redistributions of source code must retain the above copyright
14  * notice, this list of conditions and the following disclaimer.
15  * * Redistributions in binary form must reproduce the above
16  * copyright notice, this list of conditions and the following
17  * disclaimer in the documentation and/or other materials provided
18  * with the distribution.
19  * * Neither the name of Willow Garage, Inc. nor the names of its
20  * contributors may be used to endorse or promote products derived
21  * from this software without specific prior written permission.
22  *
23  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
24  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
25  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
26  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
27  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
28  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
29  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
30  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
31  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
32  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
33  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
34  * POSSIBILITY OF SUCH DAMAGE.
35  *
36  * $Id: outofcore_node_data.h 6915 2012-08-22 10:54:21Z stfox88 $
37  */
38 
39 #pragma once
40 
41 #include <pcl/memory.h>
42 #include <pcl/pcl_macros.h>
43 #include <pcl/outofcore/boost.h>
44 #include <pcl/outofcore/cJSON.h>
45 
46 #include <pcl/common/eigen.h>
47 
48 #include <ostream>
49 
50 namespace pcl
51 {
52  namespace outofcore
53  {
54  /** \class OutofcoreOctreeNodeMetadata
55  *
56  * \brief Encapsulated class to read JSON metadata into memory, and write the JSON metadata for each
57  * node.
58  *
59  * This class encapsulates the outofcore node metadata
60  * serialization/deserialization. At the time it was written,
61  * this depended on cJSON to write JSON objects to disk. This
62  * class can be extended to have arbitrary ascii metadata fields
63  * saved to the metadata object file on disk.
64  *
65  * The JSON file is formatted in the following way:
66  * \verbatim
67  {
68  "version": 3,
69  "bb_min": [xxx,yyy,zzz],
70  "bb_max": [xxx,yyy,zzz],
71  "bin": "path_to_data.pcd"
72  }
73  \endverbatim
74  *
75  * Any properties not stored in the metadata file are computed
76  * when the file is loaded (e.g. \ref midpoint_xyz_). By
77  * convention, the JSON files are stored on disk with .oct_idx
78  * extension.
79  *
80  * \ingroup outofcore
81  * \author Stephen Fox (foxstephend@gmail.com)
82  */
84  {
85 
86  public:
87  //public typedefs
88  using Ptr = shared_ptr<OutofcoreOctreeNodeMetadata>;
89  using ConstPtr = shared_ptr<const OutofcoreOctreeNodeMetadata>;
90 
91  /** \brief Empty constructor */
94 
95  /** \brief Copy constructor */
97 
98  /** \brief Get the lower bounding box corner */
99  const Eigen::Vector3d&
101  /** \brief Set the lower bounding box corner */
102  void
103  setBoundingBoxMin (const Eigen::Vector3d& min_bb);
104  /** \brief Get the upper bounding box corner */
105  const Eigen::Vector3d&
107  /** \brief Set the upper bounding box corner */
108  void
109  setBoundingBoxMax (const Eigen::Vector3d& max_bb);
110 
111  /** \brief Get the lower and upper corners of the bounding box enclosing this node */
112  void
113  getBoundingBox (Eigen::Vector3d &min_bb, Eigen::Vector3d &max_bb) const;
114  /** \brief Set the lower and upper corners of the bounding box */
115  void
116  setBoundingBox (const Eigen::Vector3d& min_bb, const Eigen::Vector3d& max_bb);
117 
118  /** \brief Get the directory path name; this is the parent_path of */
119  const boost::filesystem::path&
121  /** \brief Set the directory path name */
122  void
123  setDirectoryPathname (const boost::filesystem::path& directory_pathname);
124 
125  /** \brief Get the path to the PCD file */
126  const boost::filesystem::path&
127  getPCDFilename () const;
128  /** \brief Set the point filename; extension .pcd */
129  void
130  setPCDFilename (const boost::filesystem::path& point_filename);
131 
132  /** \brief et the outofcore version read from the "version" field of the JSON object */
133  int
135  /** \brief Set the outofcore version stored in the "version" field of the JSON object */
136  void
137  setOutofcoreVersion (const int version);
138 
139  /** \brief Sets the name of the JSON file */
140  const boost::filesystem::path&
142  /** \brief Gets the name of the JSON file */
143  void
144  setMetadataFilename (const boost::filesystem::path& path_to_metadata);
145 
146  /** \brief Get the midpoint of this node's bounding box */
147  const Eigen::Vector3d&
148  getVoxelCenter () const;
149 
150  /** \brief Writes the data to a JSON file located at \ref metadata_filename_ */
151  void
153 
154  /** \brief Loads the data from a JSON file located at \ref metadata_filename_ */
155  int
157  /** \brief Loads the data from a JSON file located at \ref metadata_filename_ */
158  int
159  loadMetadataFromDisk (const boost::filesystem::path& path_to_metadata);
160 
161  friend
162  std::ostream& operator<<(std::ostream& os, const OutofcoreOctreeNodeMetadata& metadata_arg);
163 
164  protected:
165  /** \brief The X,Y,Z axes-aligned minimum corner for the bounding box */
166  Eigen::Vector3d min_bb_;
167  /** \brief The X,Y,Z axes-aligned maximum corner for the bounding box */
168  Eigen::Vector3d max_bb_;
169  /** \brief Path to PCD file (i.e. "bin"ary point data) */
170  boost::filesystem::path binary_point_filename_;
171  /** \brief Voxel center; not stored on disk */
172  Eigen::Vector3d midpoint_xyz_;
173  /** \brief Directory this metadata belongs in */
174  boost::filesystem::path directory_;
175  /** \brief Metadata (JSON) file pathname (oct_idx extension JSON file) */
176  boost::filesystem::path metadata_filename_;
177  /** \brief Outofcore library version identifier */
179 
180  /** \brief Computes the midpoint; used when bounding box is changed */
181  inline void
183  {
184  midpoint_xyz_ = (this->max_bb_ + this->min_bb_)/static_cast<double>(2.0);
185  }
186  };
187  }//namespace outofcore
188 }//namespace pcl
Encapsulated class to read JSON metadata into memory, and write the JSON metadata for each node.
const boost::filesystem::path & getMetadataFilename() const
Sets the name of the JSON file.
const Eigen::Vector3d & getBoundingBoxMin() const
Get the lower bounding box corner.
const Eigen::Vector3d & getBoundingBoxMax() const
Get the upper bounding box corner.
shared_ptr< const OutofcoreOctreeNodeMetadata > ConstPtr
shared_ptr< OutofcoreOctreeNodeMetadata > Ptr
Eigen::Vector3d midpoint_xyz_
Voxel center; not stored on disk.
boost::filesystem::path metadata_filename_
Metadata (JSON) file pathname (oct_idx extension JSON file)
void setMetadataFilename(const boost::filesystem::path &path_to_metadata)
Gets the name of the JSON file.
const boost::filesystem::path & getDirectoryPathname() const
Get the directory path name; this is the parent_path of
void setPCDFilename(const boost::filesystem::path &point_filename)
Set the point filename; extension .pcd.
int loadMetadataFromDisk()
Loads the data from a JSON file located at metadata_filename_.
Eigen::Vector3d max_bb_
The X,Y,Z axes-aligned maximum corner for the bounding box.
void setOutofcoreVersion(const int version)
Set the outofcore version stored in the "version" field of the JSON object.
void updateVoxelCenter()
Computes the midpoint; used when bounding box is changed.
friend std::ostream & operator<<(std::ostream &os, const OutofcoreOctreeNodeMetadata &metadata_arg)
int outofcore_version_
Outofcore library version identifier.
boost::filesystem::path binary_point_filename_
Path to PCD file (i.e.
void setBoundingBox(const Eigen::Vector3d &min_bb, const Eigen::Vector3d &max_bb)
Set the lower and upper corners of the bounding box.
void setBoundingBoxMin(const Eigen::Vector3d &min_bb)
Set the lower bounding box corner.
void getBoundingBox(Eigen::Vector3d &min_bb, Eigen::Vector3d &max_bb) const
Get the lower and upper corners of the bounding box enclosing this node.
void serializeMetadataToDisk()
Writes the data to a JSON file located at metadata_filename_.
OutofcoreOctreeNodeMetadata(const OutofcoreOctreeNodeMetadata &orig)
Copy constructor.
void setDirectoryPathname(const boost::filesystem::path &directory_pathname)
Set the directory path name.
int loadMetadataFromDisk(const boost::filesystem::path &path_to_metadata)
Loads the data from a JSON file located at metadata_filename_.
const Eigen::Vector3d & getVoxelCenter() const
Get the midpoint of this node's bounding box.
boost::filesystem::path directory_
Directory this metadata belongs in.
const boost::filesystem::path & getPCDFilename() const
Get the path to the PCD file.
void setBoundingBoxMax(const Eigen::Vector3d &max_bb)
Set the upper bounding box corner.
Eigen::Vector3d min_bb_
The X,Y,Z axes-aligned minimum corner for the bounding box.
int getOutofcoreVersion() const
et the outofcore version read from the "version" field of the JSON object
Defines functions, macros and traits for allocating and using memory.
Defines all the PCL and non-PCL macros used.
#define PCL_EXPORTS
Definition: pcl_macros.h:323