16 #include <mrpt/containers/yaml.h>
17 #include <mrpt/maps/CVoxelMap.h>
36 mrpt::system::COutputLogger::setLoggerName(
"FilterRemoveByVoxelOccupancy");
43 MRPT_LOG_DEBUG_STREAM(
"Loading these params:\n" << c);
69 "Input point cloud layer '%s' could not be converted into a "
70 "point cloud (class='%s')",
81 const auto voxelPtr = std::dynamic_pointer_cast<mrpt::maps::CVoxelMap>(voxelMapPtr);
85 "Input voxel layer '%s' not of type mrpt::maps::CVoxelMap"
86 "(actual class='%s')",
96 pcPtr->GetRuntimeClass()->className);
97 if (outPcStatic) outPcStatic->reserve(outPcStatic->size() + pcPtr->size() / 2);
104 pcPtr->GetRuntimeClass()->className);
105 if (outPcDynamic) outPcDynamic->reserve(outPcDynamic->size() + pcPtr->size() / 2);
108 outPcStatic || outPcDynamic,
109 "At least one 'output_layer_static_objects' or "
110 "'output_layer_dynamic_objects' output layers must be provided.");
115 const double occThres = 1.0 - occFree;
118 const auto& xs = pcPtr->getPointsBufferRef_x();
119 const auto& ys = pcPtr->getPointsBufferRef_y();
120 const auto& zs = pcPtr->getPointsBufferRef_z();
121 const size_t N = xs.size();
123 size_t nStatic = 0, nDynamic = 0;
125 for (
size_t i = 0; i < N; i++)
127 double prob_occupancy = 0.5;
128 bool withinMap = voxelPtr->getPointOccupancy(xs[i], ys[i], zs[i], prob_occupancy);
129 if (!withinMap)
continue;
131 mrpt::maps::CPointsMap* trgMap =
nullptr;
133 if (prob_occupancy > occThres)
135 trgMap = outPcStatic.get();
138 else if (prob_occupancy < occFree)
140 trgMap = outPcDynamic.get();
144 if (!trgMap)
continue;
146 trgMap->insertPointFrom(*pcPtr, i);
149 MRPT_LOG_DEBUG_STREAM(
150 "Parsed " << N <<
" points: static=" << nStatic <<
", dynamic=" << nDynamic);