27 #include <boost/serialization/access.hpp>
28 #include <boost/serialization/base_object.hpp>
29 #include <boost/serialization/nvp.hpp>
30 #include <boost/serialization/binary_object.hpp>
31 #include <boost/serialization/split_member.hpp>
32 #include <octomap/octomap.h>
42 , octree_(std::move(octree))
45 , binary_octree_(binary_octree)
60 double occupancy_threshold =
octree_->getOccupancyThres();
61 for (
auto it =
octree_->begin(
static_cast<unsigned char>(
octree_->getTreeDepth())), end =
octree_->end(); it != end;
63 if (it->getOccupancy() >= occupancy_threshold)
71 if (!octree.nodeChildExists(node, 0))
74 double occupancy_threshold = octree.getOccupancyThres();
76 const octomap::OcTreeNode* firstChild = octree.getNodeChild(node, 0);
77 if (octree.nodeHasChildren(firstChild) || firstChild->getOccupancy() < occupancy_threshold)
80 for (
unsigned int i = 1; i < 8; i++)
84 if (!octree.nodeChildExists(node, i))
87 if (octree.nodeHasChildren(octree.getNodeChild(node, i)))
90 if (octree.getNodeChild(node, i)->getOccupancy() < occupancy_threshold)
103 node->copyData(*(octree.getNodeChild(node, 0)));
106 for (
unsigned int i = 0; i < 8; i++)
108 octree.deleteNodeChild(node, i);
116 octomap::OcTreeNode* node,
118 unsigned int max_depth,
119 unsigned int& num_pruned)
123 if (depth < max_depth)
125 for (
unsigned int i = 0; i < 8; i++)
127 if (octree.nodeChildExists(node, i))
129 pruneRecurs(octree, octree.getNodeChild(node, i), depth + 1, max_depth, num_pruned);
146 if (octree.getRoot() ==
nullptr)
149 for (
unsigned int depth = octree.getTreeDepth() - 1; depth > 0; --depth)
151 unsigned int num_pruned = 0;
152 pruneRecurs(octree, octree.getRoot(), 0, depth, num_pruned);
172 equal &=
octree_->getNumLeafNodes() == rhs.
octree_->getNumLeafNodes();
175 for (
auto it =
octree_->begin(
static_cast<unsigned char>(
octree_->getTreeDepth())), end =
octree_->end(); it != end;
178 const auto coord = it.getCoordinate();
179 const auto* node = rhs.
octree_->search(coord);
194 template <
class Archive>
198 ar& BOOST_SERIALIZATION_BASE_OBJECT_NVP(
Geometry);
201 ar& BOOST_SERIALIZATION_NVP(
pruned_);
205 std::ostringstream s;
212 std::string data_string = s.str();
213 std::size_t octree_data_size = data_string.size();
214 ar& make_nvp(
"octree_data_size", octree_data_size);
215 ar& make_nvp(
"octree_data", make_binary_object(data_string.data(), octree_data_size));
218 template <
class Archive>
222 ar& BOOST_SERIALIZATION_BASE_OBJECT_NVP(
Geometry);
225 ar& BOOST_SERIALIZATION_NVP(
pruned_);
229 auto local_octree = std::make_shared<octomap::OcTree>(
resolution_);
232 std::size_t octree_data_size = 0;
233 ar& make_nvp(
"octree_data_size", octree_data_size);
234 std::string data_string;
235 data_string.resize(octree_data_size);
236 ar& make_nvp(
"octree_data", make_binary_object(data_string.data(), octree_data_size));
240 s.write(data_string.data(),
static_cast<std::streamsize
>(octree_data_size));
243 local_octree->readBinary(s);
245 local_octree = std::shared_ptr<octomap::OcTree>(
dynamic_cast<octomap::OcTree*
>(octomap::OcTree::read(s)));
250 template <
class Archive>
253 boost::serialization::split_member(ar, *
this, version);