14 #include <mrpt/maps/CVoxelMap.h>
22 mrpt::system::COutputLogger::setLoggerName(
"QualityEvaluator_Voxels");
26 const mrpt::containers::yaml& params)
34 double loss(
double x,
double y)
49 return 1.5 +
x + y - 12 *
x *
x + 22 *
x * y - 12 * y * y;
55 const mrpt::poses::CPose3D& localPose, [[maybe_unused]]
const Pairings& pairingsFromICP)
const
61 "Input global map was expected to contain a layer named '%s'",
66 "Input local map was expected to contain a layer named '%s'",
voxel_layer_name.c_str());
68 const mrpt::maps::CVoxelMap::Ptr globalVoxels =
72 "Input global map was expected to contain a layer named '%s' of "
76 const mrpt::maps::CVoxelMap::Ptr localVoxels =
81 "Input local map was expected to contain a layer named '%s' of "
91 auto& g =
const_cast<Bonxai::VoxelGrid<mrpt::maps::VoxelNodeOccupancy>&
>(globalVoxels->grid());
92 auto& l =
const_cast<Bonxai::VoxelGrid<mrpt::maps::VoxelNodeOccupancy>&
>(localVoxels->grid());
94 auto gAccessor = g.createAccessor();
95 auto lAccessor = l.createAccessor();
99 size_t dist_cells = 0;
101 auto lmbdPerLocalVoxel =
102 [&](mrpt::maps::CVoxelMap::voxel_node_t& data,
const Bonxai::CoordT& coord)
105 const auto ptLocal = Bonxai::CoordToPos(coord, l.resolution);
106 const auto ptGlobal = localPose.composePoint({ptLocal.x, ptLocal.y, ptLocal.z});
108 auto* cell = gAccessor.value(
109 Bonxai::PosToCoord({ptGlobal.x, ptGlobal.y, ptGlobal.z}, g.inv_resolution));
112 const float localOcc = localVoxels->l2p(data.occupancy);
113 const float globalOcc = globalVoxels->l2p(cell->occupancy);
116 if (std::abs(globalOcc - 0.5
f) < 0.01
f || std::abs(localOcc - 0.5
f) < 0.01
f)
return;
118 const double d = loss(localOcc, globalOcc);
124 l.forEachCell(lmbdPerLocalVoxel);
126 auto lmbdPerGlobalVoxel =
127 [&](mrpt::maps::CVoxelMap::voxel_node_t& data,
const Bonxai::CoordT& coord)
130 const auto ptGlobal = Bonxai::CoordToPos(coord, l.resolution);
131 const auto ptLocal = (-localPose).composePoint({ptGlobal.x, ptGlobal.y, ptGlobal.z});
133 auto* cell = lAccessor.value(
134 Bonxai::PosToCoord({ptLocal.x, ptLocal.y, ptLocal.z}, l.inv_resolution));
137 const float localOcc = localVoxels->l2p(cell->occupancy);
138 const float globalOcc = globalVoxels->l2p(data.occupancy);
141 if (std::abs(globalOcc - 0.5
f) < 0.01f || std::abs(localOcc - 0.5
f) < 0.01f)
return;
143 const double d = loss(localOcc, globalOcc);
148 g.forEachCell(lmbdPerGlobalVoxel);
158 MRPT_LOG_DEBUG_STREAM(
159 "dist: " << dist <<
" dist_cells: " << dist_cells <<
" quality: " << r.
quality);