15 #include <mrpt/core/exceptions.h>
16 #include <mrpt/core/round.h>
17 #include <mrpt/version.h>
25 mrpt::system::COutputLogger::setLoggerName(
"Matcher_Point2Line");
33 MCP_LOAD_REQ(params,
knn);
40 const mrpt::maps::CMetricMap& pcGlobalMap,
const mrpt::maps::CPointsMap& pcLocal,
41 const mrpt::poses::CPose3D& localPose,
MatchState& ms,
47 const mrpt::maps::NearestNeighborsCapable& nnGlobal =
50 out.potential_pairings += pcLocal.size();
53 if (pcGlobalMap.isEmpty() || pcLocal.empty())
return;
59 if (!pcGlobalMap.boundingBox().intersection(
60 {tl.localMin, tl.localMax},
65 out.paired_pt2pl.reserve(
out.paired_pt2pl.size() + pcLocal.size() / 10);
71 const auto& lxs = pcLocal.getPointsBufferRef_x();
72 const auto& lys = pcLocal.getPointsBufferRef_y();
73 const auto& lzs = pcLocal.getPointsBufferRef_z();
75 std::vector<float> kddSqrDist;
76 std::vector<uint64_t> kddIdxs;
77 std::vector<mrpt::math::TPoint3Df> kddPts;
78 std::vector<float> kddXs, kddYs, kddZs;
80 for (
size_t i = 0; i < tl.
x_locals.size(); i++)
82 const size_t localIdx = tl.
idxs.has_value() ? (*tl.
idxs)[i] : i;
98 nnGlobal.nn_multiple_search(
100 knn, kddPts, kddSqrDist, kddIdxs);
105 if (!kddSqrDist.empty() && kddSqrDist.back() < maxDistForCorrespondenceSquared)
111 for (
size_t j = 0; j < kddSqrDist.size(); j++)
113 if (kddSqrDist[j] > maxDistForCorrespondenceSquared)
116 kddSqrDist.resize(j);
128 kddXs.data(), kddYs.data(), kddZs.data(), std::nullopt, kddPts.size());
132 std::cout <<
"eig values: " << eig.
eigVals[0] <<
" " << eig.
eigVals[1]
134 <<
" eigvec0: " << eig.
eigVectors[0].asString() <<
"\n"
135 <<
" eigvec1: " << eig.
eigVectors[1].asString() <<
"\n"
136 <<
" eigvec2: " << eig.
eigVectors[2].asString() <<
"\n";
143 auto& p =
out.paired_pt2ln.emplace_back();
144 p.pt_local = {lxs[localIdx], lys[localIdx], lzs[localIdx]};
148 p.ln_global.director = normal.unitarize();