53 : insertionOptions(), likelihoodOptions(), m_x(), m_y(), m_z()
62 CPointsMap::~CPointsMap() =
default;
68 bool CPointsMap::save2D_to_text_file(
const string& file)
const 73 for (
unsigned int i = 0; i < m_x.size(); i++)
85 bool CPointsMap::save3D_to_text_file(
const string& file)
const 90 for (
unsigned int i = 0; i < m_x.size(); i++)
91 os::fprintf(f,
"%f %f %f\n", m_x[i], m_y[i], m_z[i]);
102 bool CPointsMap::load2Dor3D_from_text_file(
103 const std::string& file,
const bool is_3D)
110 if (!f)
return false;
113 char *ptr, *ptr1, *ptr2, *ptr3;
122 if (!fgets(str,
sizeof(str), f))
break;
126 while (ptr[0] && (ptr[0] ==
' ' || ptr[0] ==
'\t' || ptr[0] ==
'\r' ||
131 float xx = strtod(ptr, &ptr1);
134 float yy = strtod(ptr1, &ptr2);
139 this->insertPoint(xx, yy, 0);
143 float zz = strtod(ptr2, &ptr3);
146 this->insertPoint(xx, yy, zz);
167 mxArray* CPointsMap::writeToMatlab()
const 170 MRPT_TODO(
"Create 3xN array xyz of points coordinates")
171 const
char* fields[] = {
"x",
"y",
"z"};
172 mexplus::MxArray map_struct(
173 mexplus::MxArray::Struct(
sizeof(fields) /
sizeof(fields[0]), fields));
175 map_struct.set(
"x", m_x);
176 map_struct.set(
"y", m_y);
177 map_struct.set(
"z", m_z);
178 return map_struct.release();
188 void CPointsMap::getPoint(
size_t index,
float& x,
float& y)
const 194 void CPointsMap::getPoint(
size_t index,
float& x,
float& y,
float& z)
const 201 void CPointsMap::getPoint(
size_t index,
double& x,
double& y)
const 207 void CPointsMap::getPoint(
size_t index,
double& x,
double& y,
double& z)
const 218 void CPointsMap::getPointsBuffer(
219 size_t& outPointsCount,
const float*& xs,
const float*& ys,
220 const float*& zs)
const 222 outPointsCount =
size();
224 if (outPointsCount > 0)
232 xs = ys = zs =
nullptr;
239 void CPointsMap::clipOutOfRangeInZ(
float zMin,
float zMax)
241 const size_t n =
size();
242 vector<bool> deletionMask(n);
245 for (
size_t i = 0; i < n; i++)
246 deletionMask[i] = (m_z[i] < zMin || m_z[i] > zMax);
249 applyDeletionMask(deletionMask);
257 void CPointsMap::clipOutOfRange(
const TPoint2D& p,
float maxRange)
259 size_t i, n =
size();
260 vector<bool> deletionMask;
263 deletionMask.resize(n);
265 const auto max_sq = maxRange * maxRange;
268 for (i = 0; i < n; i++)
269 deletionMask[i] =
square(p.
x - m_x[i]) +
square(p.
y - m_y[i]) > max_sq;
272 applyDeletionMask(deletionMask);
277 void CPointsMap::determineMatching2D(
288 params.offset_other_map_points,
params.decimation_other_map_points);
290 const auto* otherMap =
static_cast<const CPointsMap*
>(otherMap2);
293 otherMapPose_.
x(), otherMapPose_.
y(), otherMapPose_.
phi());
295 const size_t nLocalPoints = otherMap->
size();
296 const size_t nGlobalPoints = this->
size();
297 float _sumSqrDist = 0;
298 size_t _sumSqrCount = 0;
299 size_t nOtherMapPointsWithCorrespondence =
302 float local_x_min = std::numeric_limits<float>::max(),
303 local_x_max = -std::numeric_limits<float>::max();
304 float global_x_min = std::numeric_limits<float>::max(),
305 global_x_max = -std::numeric_limits<float>::max();
306 float local_y_min = std::numeric_limits<float>::max(),
307 local_y_max = -std::numeric_limits<float>::max();
308 float global_y_min = std::numeric_limits<float>::max(),
309 global_y_max = -std::numeric_limits<float>::max();
311 double maxDistForCorrespondenceSquared;
312 float x_local, y_local;
313 unsigned int localIdx;
315 const float *x_other_it, *y_other_it, *z_other_it;
318 correspondences.clear();
319 correspondences.reserve(nLocalPoints);
320 extraResults.correspondencesRatio = 0;
323 _correspondences.reserve(nLocalPoints);
326 if (!nGlobalPoints || !nLocalPoints)
return;
328 const double sin_phi = sin(otherMapPose.phi);
329 const double cos_phi = cos(otherMapPose.phi);
337 size_t nPackets = nLocalPoints / 4;
339 Eigen::ArrayXf x_locals(nLocalPoints), y_locals(nLocalPoints);
342 const __m128 cos_4val = _mm_set1_ps(cos_phi);
343 const __m128 sin_4val = _mm_set1_ps(sin_phi);
344 const __m128 x0_4val = _mm_set1_ps(otherMapPose.x);
345 const __m128 y0_4val = _mm_set1_ps(otherMapPose.y);
348 __m128 x_mins = _mm_set1_ps(std::numeric_limits<float>::max());
349 __m128 x_maxs = _mm_set1_ps(std::numeric_limits<float>::min());
350 __m128 y_mins = x_mins;
351 __m128 y_maxs = x_maxs;
353 const float* ptr_in_x = &otherMap->m_x[0];
354 const float* ptr_in_y = &otherMap->m_y[0];
355 float* ptr_out_x = &x_locals[0];
356 float* ptr_out_y = &y_locals[0];
358 for (; nPackets; nPackets--, ptr_in_x += 4, ptr_in_y += 4, ptr_out_x += 4,
361 const __m128 xs = _mm_loadu_ps(ptr_in_x);
362 const __m128 ys = _mm_loadu_ps(ptr_in_y);
364 const __m128 lxs = _mm_add_ps(
366 _mm_sub_ps(_mm_mul_ps(xs, cos_4val), _mm_mul_ps(ys, sin_4val)));
367 const __m128 lys = _mm_add_ps(
369 _mm_add_ps(_mm_mul_ps(xs, sin_4val), _mm_mul_ps(ys, cos_4val)));
370 _mm_store_ps(ptr_out_x, lxs);
371 _mm_store_ps(ptr_out_y, lys);
373 x_mins = _mm_min_ps(x_mins, lxs);
374 x_maxs = _mm_max_ps(x_maxs, lxs);
375 y_mins = _mm_min_ps(y_mins, lys);
376 y_maxs = _mm_max_ps(y_maxs, lys);
380 alignas(MRPT_MAX_STATIC_ALIGN_BYTES)
float temp_nums[4];
382 _mm_store_ps(temp_nums, x_mins);
384 min(min(temp_nums[0], temp_nums[1]), min(temp_nums[2], temp_nums[3]));
385 _mm_store_ps(temp_nums, y_mins);
387 min(min(temp_nums[0], temp_nums[1]), min(temp_nums[2], temp_nums[3]));
388 _mm_store_ps(temp_nums, x_maxs);
390 max(max(temp_nums[0], temp_nums[1]), max(temp_nums[2], temp_nums[3]));
391 _mm_store_ps(temp_nums, y_maxs);
393 max(max(temp_nums[0], temp_nums[1]), max(temp_nums[2], temp_nums[3]));
396 for (
size_t k = 0; k < nLocalPoints % 4; k++)
398 float x = ptr_in_x[k];
399 float y = ptr_in_y[k];
400 float out_x = otherMapPose.x + cos_phi * x - sin_phi * y;
401 float out_y = otherMapPose.y + sin_phi * x + cos_phi * y;
403 local_x_min = std::min(local_x_min, out_x);
404 local_x_max = std::max(local_x_max, out_x);
406 local_y_min = std::min(local_y_min, out_y);
407 local_y_max = std::max(local_y_max, out_y);
409 ptr_out_x[k] = out_x;
410 ptr_out_y[k] = out_y;
416 const_cast<float*>(&otherMap->m_x[0]), otherMap->m_x.size(), 1);
418 const_cast<float*>(&otherMap->m_y[0]), otherMap->m_y.size(), 1);
420 Eigen::Array<float, Eigen::Dynamic, 1> x_locals =
421 otherMapPose.x + cos_phi * x_org.array() - sin_phi * y_org.array();
422 Eigen::Array<float, Eigen::Dynamic, 1> y_locals =
423 otherMapPose.y + sin_phi * x_org.array() + cos_phi * y_org.array();
425 local_x_min = x_locals.minCoeff();
426 local_y_min = y_locals.minCoeff();
427 local_x_max = x_locals.maxCoeff();
428 local_y_max = y_locals.maxCoeff();
432 float global_z_min, global_z_max;
434 global_x_min, global_x_max, global_y_min, global_y_max, global_z_min,
439 if (local_x_min > global_x_max || local_x_max < global_x_min ||
440 local_y_min > global_y_max || local_y_max < global_y_min)
445 for (localIdx =
params.offset_other_map_points,
446 x_other_it = &otherMap->m_x[
params.offset_other_map_points],
447 y_other_it = &otherMap->m_y[
params.offset_other_map_points],
448 z_other_it = &otherMap->m_z[
params.offset_other_map_points];
449 localIdx < nLocalPoints;
450 x_other_it +=
params.decimation_other_map_points,
451 y_other_it +=
params.decimation_other_map_points,
452 z_other_it +=
params.decimation_other_map_points,
453 localIdx +=
params.decimation_other_map_points)
456 x_local = x_locals[localIdx];
457 y_local = y_locals[localIdx];
466 float tentativ_err_sq;
467 unsigned int tentativ_this_idx = kdTreeClosestPoint2D(
473 maxDistForCorrespondenceSquared =
square(
474 params.maxAngularDistForCorrespondence *
478 params.maxDistForCorrespondence);
481 if (tentativ_err_sq < maxDistForCorrespondenceSquared)
484 _correspondences.resize(_correspondences.size() + 1);
489 p.
this_x = m_x[tentativ_this_idx];
490 p.
this_y = m_y[tentativ_this_idx];
491 p.
this_z = m_z[tentativ_this_idx];
501 nOtherMapPointsWithCorrespondence++;
514 if (
params.onlyUniqueRobust)
517 params.onlyKeepTheClosest,
518 "ERROR: onlyKeepTheClosest must be also set to true when " 519 "onlyUniqueRobust=true.");
521 nGlobalPoints, correspondences);
525 correspondences.swap(_correspondences);
531 extraResults.sumSqrDist =
532 _sumSqrDist /
static_cast<double>(_sumSqrCount);
534 extraResults.sumSqrDist = 0;
537 extraResults.correspondencesRatio =
params.decimation_other_map_points *
538 nOtherMapPointsWithCorrespondence /
547 void CPointsMap::changeCoordinatesReference(
const CPose2D& newBase)
549 const size_t N = m_x.size();
551 const CPose3D newBase3D(newBase);
553 for (
size_t i = 0; i < N; i++)
555 m_x[i], m_y[i], m_z[i],
556 m_x[i], m_y[i], m_z[i]
565 void CPointsMap::changeCoordinatesReference(
const CPose3D& newBase)
567 const size_t N = m_x.size();
569 for (
size_t i = 0; i < N; i++)
571 m_x[i], m_y[i], m_z[i],
572 m_x[i], m_y[i], m_z[i]
581 void CPointsMap::changeCoordinatesReference(
585 changeCoordinatesReference(newBase);
591 bool CPointsMap::isEmpty()
const {
return m_x.empty(); }
595 CPointsMap::TInsertionOptions::TInsertionOptions()
596 : horizontalTolerance(0.05_deg)
605 const int8_t version = 0;
608 out << minDistBetweenLaserPoints << addToExistingPointsMap
609 << also_interpolate << disableDeletion << fuseWithExisting
610 << isPlanarMap << horizontalTolerance << maxDistForInterpolatePoints
611 << insertInvalidPoints;
623 in >> minDistBetweenLaserPoints >> addToExistingPointsMap >>
624 also_interpolate >> disableDeletion >> fuseWithExisting >>
625 isPlanarMap >> horizontalTolerance >>
626 maxDistForInterpolatePoints >> insertInvalidPoints;
641 const int8_t version = 0;
643 out << sigma_dist << max_corr_distance << decimation;
655 in >> sigma_dist >> max_corr_distance >> decimation;
666 const int8_t version = 0;
680 in >> point_size >> this->color;
691 out <<
"\n----------- [CPointsMap::TInsertionOptions] ------------ \n\n";
710 out <<
"\n----------- [CPointsMap::TLikelihoodOptions] ------------ \n\n";
719 out <<
"\n----------- [CPointsMap::TRenderOptions] ------------ \n\n";
777 obj->loadFromPointsMap(
this);
780 obj->enableColorFromZ(
false);
786 obj->loadFromPointsMap(
this);
790 obj->recolorizeByCoordinate(
824 float maxDistSq = 0, d;
825 for (
auto X =
m_x.begin(), Y =
m_y.begin(), Z =
m_z.begin();
826 X !=
m_x.end(); ++X, ++Y, ++Z)
829 maxDistSq = max(d, maxDistSq);
842 vector<float>& xs, vector<float>& ys,
size_t decimation)
const 848 xs = vector<float>(
m_x.begin(),
m_x.end());
849 ys = vector<float>(
m_y.begin(),
m_y.end());
853 size_t N =
m_x.size() / decimation;
858 auto X =
m_x.begin();
859 auto Y =
m_y.begin();
860 for (
auto oX = xs.begin(), oY = ys.begin(); oX != xs.end();
861 X += decimation, Y += decimation, ++oX, ++oY)
874 float x0,
float y0)
const 882 float x1, y1, x2, y2, d1, d2;
893 if (d12 > 0.20f * 0.20f || d12 < 0.03f * 0.03f)
899 double interp_x, interp_y;
917 float& min_x,
float& max_x,
float& min_y,
float& max_y,
float& min_z,
922 const size_t nPoints =
m_x.size();
937 size_t nPackets = nPoints / 4;
940 __m128 x_mins = _mm_set1_ps(std::numeric_limits<float>::max());
941 __m128 x_maxs = _mm_set1_ps(std::numeric_limits<float>::min());
942 __m128 y_mins = x_mins, y_maxs = x_maxs;
943 __m128 z_mins = x_mins, z_maxs = x_maxs;
945 const float* ptr_in_x = &
m_x[0];
946 const float* ptr_in_y = &
m_y[0];
947 const float* ptr_in_z = &
m_z[0];
950 nPackets--, ptr_in_x += 4, ptr_in_y += 4, ptr_in_z += 4)
952 const __m128 xs = _mm_loadu_ps(ptr_in_x);
953 x_mins = _mm_min_ps(x_mins, xs);
954 x_maxs = _mm_max_ps(x_maxs, xs);
956 const __m128 ys = _mm_loadu_ps(ptr_in_y);
957 y_mins = _mm_min_ps(y_mins, ys);
958 y_maxs = _mm_max_ps(y_maxs, ys);
960 const __m128 zs = _mm_loadu_ps(ptr_in_z);
961 z_mins = _mm_min_ps(z_mins, zs);
962 z_maxs = _mm_max_ps(z_maxs, zs);
966 alignas(MRPT_MAX_STATIC_ALIGN_BYTES)
float temp_nums[4];
968 _mm_store_ps(temp_nums, x_mins);
970 min(min(temp_nums[0], temp_nums[1]),
971 min(temp_nums[2], temp_nums[3]));
972 _mm_store_ps(temp_nums, y_mins);
974 min(min(temp_nums[0], temp_nums[1]),
975 min(temp_nums[2], temp_nums[3]));
976 _mm_store_ps(temp_nums, z_mins);
978 min(min(temp_nums[0], temp_nums[1]),
979 min(temp_nums[2], temp_nums[3]));
980 _mm_store_ps(temp_nums, x_maxs);
982 max(max(temp_nums[0], temp_nums[1]),
983 max(temp_nums[2], temp_nums[3]));
984 _mm_store_ps(temp_nums, y_maxs);
986 max(max(temp_nums[0], temp_nums[1]),
987 max(temp_nums[2], temp_nums[3]));
988 _mm_store_ps(temp_nums, z_maxs);
990 max(max(temp_nums[0], temp_nums[1]),
991 max(temp_nums[2], temp_nums[3]));
994 for (
size_t k = 0; k < nPoints % 4; k++)
1008 (std::numeric_limits<float>::max)();
1011 -(std::numeric_limits<float>::max)();
1013 for (
auto xi =
m_x.begin(), yi =
m_y.begin(), zi =
m_z.begin();
1014 xi !=
m_x.end(); xi++, yi++, zi++)
1051 params.offset_other_map_points,
params.decimation_other_map_points);
1054 const auto* otherMap =
static_cast<const CPointsMap*
>(otherMap2);
1056 const size_t nLocalPoints = otherMap->
size();
1057 const size_t nGlobalPoints = this->
size();
1058 float _sumSqrDist = 0;
1059 size_t _sumSqrCount = 0;
1060 size_t nOtherMapPointsWithCorrespondence =
1063 float local_x_min = std::numeric_limits<float>::max(),
1064 local_x_max = -std::numeric_limits<float>::max();
1065 float local_y_min = std::numeric_limits<float>::max(),
1066 local_y_max = -std::numeric_limits<float>::max();
1067 float local_z_min = std::numeric_limits<float>::max(),
1068 local_z_max = -std::numeric_limits<float>::max();
1070 double maxDistForCorrespondenceSquared;
1073 correspondences.clear();
1074 correspondences.reserve(nLocalPoints);
1077 _correspondences.reserve(nLocalPoints);
1080 if (!nGlobalPoints || !nLocalPoints)
return;
1084 vector<float> x_locals(nLocalPoints), y_locals(nLocalPoints),
1085 z_locals(nLocalPoints);
1087 for (
unsigned int localIdx =
params.offset_other_map_points;
1088 localIdx < nLocalPoints;
1089 localIdx +=
params.decimation_other_map_points)
1091 float x_local, y_local, z_local;
1093 otherMap->m_x[localIdx], otherMap->m_y[localIdx],
1094 otherMap->m_z[localIdx], x_local, y_local, z_local);
1096 x_locals[localIdx] = x_local;
1097 y_locals[localIdx] = y_local;
1098 z_locals[localIdx] = z_local;
1101 local_x_min = min(local_x_min, x_local);
1102 local_x_max = max(local_x_max, x_local);
1103 local_y_min = min(local_y_min, y_local);
1104 local_y_max = max(local_y_max, y_local);
1105 local_z_min = min(local_z_min, z_local);
1106 local_z_max = max(local_z_max, z_local);
1110 float global_x_min, global_x_max, global_y_min, global_y_max, global_z_min,
1113 global_x_min, global_x_max, global_y_min, global_y_max, global_z_min,
1118 if (local_x_min > global_x_max || local_x_max < global_x_min ||
1119 local_y_min > global_y_max || local_y_max < global_y_min)
1124 for (
unsigned int localIdx =
params.offset_other_map_points;
1125 localIdx < nLocalPoints;
1126 localIdx +=
params.decimation_other_map_points)
1129 const float x_local = x_locals[localIdx];
1130 const float y_local = y_locals[localIdx];
1131 const float z_local = z_locals[localIdx];
1139 float tentativ_err_sq;
1141 x_local, y_local, z_local,
1146 maxDistForCorrespondenceSquared =
square(
1147 params.maxAngularDistForCorrespondence *
1148 params.angularDistPivotPoint.distanceTo(
1149 TPoint3D(x_local, y_local, z_local)) +
1150 params.maxDistForCorrespondence);
1153 if (tentativ_err_sq < maxDistForCorrespondenceSquared)
1156 _correspondences.resize(_correspondences.size() + 1);
1166 p.
other_x = otherMap->m_x[localIdx];
1167 p.
other_y = otherMap->m_y[localIdx];
1168 p.
other_z = otherMap->m_z[localIdx];
1173 nOtherMapPointsWithCorrespondence++;
1187 if (
params.onlyUniqueRobust)
1190 params.onlyKeepTheClosest,
1191 "ERROR: onlyKeepTheClosest must be also set to true when " 1192 "onlyUniqueRobust=true.");
1194 nGlobalPoints, correspondences);
1198 correspondences.swap(_correspondences);
1203 extraResults.sumSqrDist =
1204 (_sumSqrCount) ? _sumSqrDist / static_cast<double>(_sumSqrCount) : 0;
1205 extraResults.correspondencesRatio =
params.decimation_other_map_points *
1206 nOtherMapPointsWithCorrespondence /
1216 const TPoint2D& center,
const double radius,
const double zmin,
1220 for (
size_t k = 0; k <
m_x.size(); k++)
1222 if ((
m_z[k] <= zmax &&
m_z[k] >= zmin) &&
1234 double R,
double G,
double B)
1237 double minX, maxX, minY, maxY, minZ, maxZ;
1238 minX = min(corner1.
x, corner2.
x);
1239 maxX = max(corner1.
x, corner2.
x);
1240 minY = min(corner1.
y, corner2.
y);
1241 maxY = max(corner1.
y, corner2.
y);
1242 minZ = min(corner1.
z, corner2.
z);
1243 maxZ = max(corner1.
z, corner2.
z);
1244 for (
size_t k = 0; k <
m_x.size(); k++)
1246 if ((
m_x[k] >= minX &&
m_x[k] <= maxX) &&
1247 (
m_y[k] >= minY &&
m_y[k] <= maxY) &&
1248 (
m_z[k] >= minZ &&
m_z[k] <= maxZ))
1259 float& correspondencesRatio)
1264 const auto* otherMap =
static_cast<const CPointsMap*
>(otherMap2);
1266 const size_t nLocalPoints = otherMap->
size();
1267 const size_t nGlobalPoints = this->
size();
1268 size_t nOtherMapPointsWithCorrespondence =
1272 correspondences.clear();
1273 correspondences.reserve(nLocalPoints);
1274 correspondencesRatio = 0;
1278 _correspondences.reserve(nLocalPoints);
1281 if (!nGlobalPoints)
return;
1284 if (!nLocalPoints)
return;
1287 float local_x_min, local_x_max, local_y_min, local_y_max, local_z_min,
1289 otherMap->boundingBox(
1290 local_x_min, local_x_max, local_y_min, local_y_max, local_z_min,
1294 float global_x_min, global_x_max, global_y_min, global_y_max, global_z_min,
1297 global_x_min, global_x_max, global_y_min, global_y_max, global_z_min,
1302 if (local_x_min > global_x_max || local_x_max < global_x_min ||
1303 local_y_min > global_y_max || local_y_max < global_y_min)
1307 std::vector<std::vector<size_t>> vIdx;
1311 std::vector<float> outX, outY, outZ, tentativeErrSq;
1312 std::vector<size_t> outIdx;
1313 for (
unsigned int localIdx = 0; localIdx < nLocalPoints; ++localIdx)
1316 const float x_local = otherMap->m_x[localIdx];
1317 const float y_local = otherMap->m_y[localIdx];
1318 const float z_local = otherMap->m_z[localIdx];
1326 x_local, y_local, z_local,
1334 const float mX = (outX[0] + outX[1] + outX[2]) / 3.0;
1335 const float mY = (outY[0] + outY[1] + outY[2]) / 3.0;
1336 const float mZ = (outZ[0] + outZ[1] + outZ[2]) / 3.0;
1342 if (distanceForThisPoint < maxDistForCorrespondence)
1345 _correspondences.resize(_correspondences.size() + 1);
1349 p.
this_idx = nOtherMapPointsWithCorrespondence++;
1357 p.
other_x = otherMap->m_x[localIdx];
1358 p.
other_y = otherMap->m_y[localIdx];
1359 p.
other_z = otherMap->m_z[localIdx];
1364 std::sort(outIdx.begin(), outIdx.end());
1365 vIdx.push_back(outIdx);
1374 std::map<size_t, std::map<size_t, std::map<size_t, pair<size_t, float>>>>
1376 TMatchingPairList::iterator it;
1377 for (it = _correspondences.begin(); it != _correspondences.end(); ++it)
1379 const size_t i0 = vIdx[it->this_idx][0];
1380 const size_t i1 = vIdx[it->this_idx][1];
1381 const size_t i2 = vIdx[it->this_idx][2];
1383 if (best.find(i0) != best.end() &&
1384 best[i0].find(i1) != best[i0].end() &&
1385 best[i0][i1].find(i2) !=
1389 if (best[i0][i1][i2].second > it->errorSquareAfterTransformation)
1391 best[i0][i1][i2].first = it->this_idx;
1392 best[i0][i1][i2].second = it->errorSquareAfterTransformation;
1397 best[i0][i1][i2].first = it->this_idx;
1398 best[i0][i1][i2].second = it->errorSquareAfterTransformation;
1402 for (it = _correspondences.begin(); it != _correspondences.end(); ++it)
1404 const size_t i0 = vIdx[it->this_idx][0];
1405 const size_t i1 = vIdx[it->this_idx][1];
1406 const size_t i2 = vIdx[it->this_idx][2];
1408 if (best[i0][i1][i2].first == it->this_idx)
1409 correspondences.push_back(*it);
1413 correspondencesRatio =
1414 nOtherMapPointsWithCorrespondence /
d2f(nLocalPoints);
1421 const float* zs,
const std::size_t num_pts)
1425 float closest_x, closest_y, closest_z;
1428 double sumSqrDist = 0;
1430 std::size_t nPtsForAverage = 0;
1431 for (std::size_t i = 0; i < num_pts;
1437 pc_in_map.
composePoint(xs[i], ys[i], zs[i], xg, yg, zg);
1441 closest_x, closest_y,
1449 sumSqrDist +=
static_cast<double>(closest_err);
1451 if (nPtsForAverage) sumSqrDist /= nPtsForAverage;
1474 const size_t N = scanPoints->
m_x.size();
1475 if (!N || !this->
size())
return -100;
1477 const float* xs = &scanPoints->m_x[0];
1478 const float* ys = &scanPoints->m_y[0];
1479 const float* zs = &scanPoints->m_z[0];
1483 double sumSqrDist = 0;
1484 float closest_x, closest_y;
1486 const float max_sqr_err =
1492 const double ccos = cos(takenFrom2D.
phi);
1493 const double csin = sin(takenFrom2D.
phi);
1494 int nPtsForAverage = 0;
1496 for (
size_t i = 0; i < N;
1501 const float xg = takenFrom2D.
x + ccos * xs[i] - csin * ys[i];
1502 const float yg = takenFrom2D.
y + csin * xs[i] + ccos * ys[i];
1506 closest_x, closest_y,
1513 sumSqrDist +=
static_cast<double>(closest_err);
1515 sumSqrDist /= nPtsForAverage;
1523 takenFrom, xs, ys, zs, N);
1531 if (!o.point_cloud.size())
1534 const size_t N = o.point_cloud.size();
1535 if (!N || !this->
size())
return -100;
1537 const CPose3D sensorAbsPose = takenFrom + o.sensorPose;
1539 const float* xs = &o.point_cloud.
x[0];
1540 const float* ys = &o.point_cloud.y[0];
1541 const float* zs = &o.point_cloud.z[0];
1544 sensorAbsPose, xs, ys, zs, N);
1551 if (!N || !this->
size())
return -100;
1553 const CPose3D sensorAbsPose = takenFrom + o.sensorPose;
1555 auto xs = o.pointcloud->getPointsBufferRef_x();
1556 auto ys = o.pointcloud->getPointsBufferRef_y();
1557 auto zs = o.pointcloud->getPointsBufferRef_z();
1560 sensorAbsPose, &xs[0], &ys[0], &zs[0], N);
1583 if (out_map)
return;
1585 out_map = std::make_shared<CSimplePointsMap>();
1589 *static_cast<const CPointsMap::TInsertionOptions*>(insertOps);
1591 out_map->insertObservation(obs,
nullptr);
1633 pt_has_color =
false;
1644 const size_t nThis = this->
size();
1645 const size_t nOther = anotherMap.
size();
1647 const size_t nTot = nThis + nOther;
1651 for (
size_t i = 0, j = nThis; i < nOther; i++, j++)
1653 m_x[j] = anotherMap.
m_x[i];
1654 m_y[j] = anotherMap.
m_y[i];
1655 m_z[j] = anotherMap.
m_z[i];
1671 const size_t n = mask.size();
1674 for (i = 0, j = 0; i < n; i++)
1696 const size_t N_this =
size();
1697 const size_t N_other = otherMap->
size();
1700 this->
resize(N_this + N_other);
1704 for (src = 0, dst = N_this; src < N_other; src++, dst++)
1728 if (
this == &obj)
return;
1761 robotPose2D =
CPose2D(*robotPose);
1762 robotPose3D = (*robotPose);
1778 bool reallyInsertIt;
1784 reallyInsertIt =
true;
1788 std::vector<bool> checkForDeletion;
1819 const float *xs, *ys, *zs;
1826 for (
size_t i = 0; i < n; i++)
1828 if (checkForDeletion[i])
1836 checkForDeletion[i] =
1872 bool reallyInsertIt;
1878 reallyInsertIt =
true;
1932 this->
size() + o.sensedData.size() * 30);
1934 for (
auto it = o.begin(); it != o.end(); ++it)
1936 const CPose3D sensorPose = robotPose3D +
CPose3D(it->sensorPose);
1937 const double rang = it->sensedDistance;
1939 if (rang <= 0 || rang < o.minSensorDistance ||
1940 rang > o.maxSensorDistance)
1945 const double arc_len = o.sensorConeApperture * rang;
1946 const unsigned int nSteps =
round(1 + arc_len / 0.05);
1947 const double Aa = o.sensorConeApperture / double(nSteps);
1950 for (
double a1 = -aper_2;
a1 < aper_2;
a1 += Aa)
1952 for (
double a2 = -aper_2;
a2 < aper_2;
a2 += Aa)
1954 loc.
x = cos(
a1) * cos(
a2) * rang;
1955 loc.
y = cos(
a1) * sin(
a2) * rang;
1956 loc.
z = sin(
a1) * rang;
1975 if (!o.point_cloud.size())
2035 std::vector<bool>* notFusedPoints)
2039 const CPose2D nullPose(0, 0, 0);
2044 const size_t nOther = otherMap->
size();
2051 params.maxAngularDistForCorrespondence = 0;
2052 params.maxDistForCorrespondence = minDistForFuse;
2057 correspondences,
params, extraResults);
2062 notFusedPoints->clear();
2063 notFusedPoints->reserve(
m_x.size() + nOther);
2064 notFusedPoints->resize(
m_x.size(),
true);
2073 for (
size_t i = 0; i < nOther; i++)
2079 int closestCorr = -1;
2080 float minDist = std::numeric_limits<float>::max();
2081 for (
auto corrsIt = correspondences.begin();
2082 corrsIt != correspondences.end(); ++corrsIt)
2084 if (corrsIt->other_idx == i)
2086 float dist =
square(corrsIt->other_x - corrsIt->this_x) +
2087 square(corrsIt->other_y - corrsIt->this_y) +
2088 square(corrsIt->other_z - corrsIt->this_z);
2092 closestCorr = corrsIt->this_idx;
2097 if (closestCorr != -1)
2104 const float F = 1.0f / (w_a + w_b);
2106 m_x[closestCorr] = F * (w_a * a.
x + w_b * b.
x);
2107 m_y[closestCorr] = F * (w_a * a.
y + w_b * b.
y);
2108 m_z[closestCorr] = F * (w_a * a.
z + w_b * b.
z);
2113 if (notFusedPoints) (*notFusedPoints)[closestCorr] =
false;
2118 if (notFusedPoints) (*notFusedPoints).push_back(
false);
2141 const size_t nOldPtsCount = this->
size();
2143 const size_t nNewPtsCount = nOldPtsCount + nScanPts;
2144 this->
resize(nNewPtsCount);
2146 const float K = 1.0f / 255;
2151 sensorGlobalPose = *robotPose + scan.
sensorPose;
2158 const double m00 = HM(0, 0), m01 = HM(0, 1), m02 = HM(0, 2), m03 = HM(0, 3);
2159 const double m10 = HM(1, 0), m11 = HM(1, 1), m12 = HM(1, 2), m13 = HM(1, 3);
2160 const double m20 = HM(2, 0), m21 = HM(2, 1), m22 = HM(2, 2), m23 = HM(2, 3);
2163 for (
size_t i = 0; i < nScanPts; i++)
2170 const double gx = m00 * lx + m01 * ly + m02 * lz + m03;
2171 const double gy = m10 * lx + m11 * ly + m12 * lz + m13;
2172 const double gz = m20 * lx + m21 * ly + m22 * lz + m23;
2175 nOldPtsCount + i, gx, gy, gz,
void clear()
Erase all the contents of the map.
#define IMPLEMENTS_VIRTUAL_SERIALIZABLE(class_name, base_class, NS)
This must be inserted as implementation of some required members for virtual CSerializable classes: ...
void dumpToTextStream(std::ostream &out) const override
This method should clearly display all the contents of the structure in textual form, sending it to a std::ostream.
float errorSquareAfterTransformation
void closestFromPointToLine(double Px, double Py, double x1, double y1, double x2, double y2, double &out_x, double &out_y)
Computes the closest point from a given point to a (infinite) line.
void writeToStream(mrpt::serialization::CArchive &out) const
Binary dump to stream - used in derived classes' serialization.
TLikelihoodOptions()
Initilization of default parameters.
void writeToStream(mrpt::serialization::CArchive &out) const
Binary dump to stream - for usage in derived classes' serialization.
void kdTreeNClosestPoint3DWithIdx(float x0, float y0, float z0, size_t knn, std::vector< float > &out_x, std::vector< float > &out_y, std::vector< float > &out_z, std::vector< size_t > &out_idx, std::vector< float > &out_dist_sqr) const
KD Tree-based search for the N closest points to some given 3D coordinates.
void insertAnotherMap(const CPointsMap *otherMap, const mrpt::poses::CPose3D &otherPose)
Insert the contents of another map into this one with some geometric transformation, without fusing close points.
Parameters for CMetricMap::compute3DMatchingRatio()
void keep_min(T &var, const K test_val)
If the second argument is below the first one, set the first argument to this lower value...
void getPoint(size_t index, float &x, float &y, float &z) const
Access to a given point from map, as a 2D point.
void colormap(const TColormap &color_map, const float color_index, float &r, float &g, float &b)
Transform a float number in the range [0,1] into RGB components.
A compile-time fixed-size numeric matrix container.
bool isPlanarMap
If set to true, only HORIZONTAL (in the XY plane) measurements will be inserted in the map (Default v...
mrpt::img::TColormap colormap
Colormap for points (index is "z" coordinates)
virtual void addFrom(const CPointsMap &anotherMap)
Adds all the points from anotherMap to this map, without fusing.
void getPointFast(size_t index, float &x, float &y, float &z) const
Just like getPoint() but without checking out-of-bound index and without returning the point weight...
Declares a class derived from "CObservation" that encapsules a single range measurement, and associated parameters.
A CObservation-derived class for RAW DATA (and optionally, point cloud) of scans from 3D Velodyne LID...
virtual void loadFromRangeScan(const mrpt::obs::CObservation2DRangeScan &rangeScan, const mrpt::poses::CPose3D *robotPose=nullptr)=0
Transform the range scan into a set of cartessian coordinated points.
void loadFromConfigFile(const mrpt::config::CConfigFileBase &source, const std::string §ion) override
This method load the options from a ".ini"-like file or memory-stored string list.
static Ptr Create(Args &&... args)
#define MRPT_TRY_END
The end of a standard MRPT "try...catch()" block that allows tracing throw the call stack after an ex...
void internal_build_points_map_from_scan2D(const mrpt::obs::CObservation2DRangeScan &obs, mrpt::maps::CMetricMap::Ptr &out_map, const void *insertOps)
float sensorConeApperture
Cone aperture of each ultrasonic beam, in radians.
#define THROW_EXCEPTION(msg)
An observation from any sensor that can be summarized as a pointcloud.
bool enableSaveAs3DObject
(Default=true) If false, calling CMetricMap::getAs3DObject() will have no effects ...
size_t size(const MATRIXLIKE &m, const int dim)
int void fclose(FILE *f)
An OS-independent version of fclose.
#define ASSERT_BELOW_(__A, __B)
const POINTSMAP * buildAuxPointsMap(const void *options=nullptr) const
Returns a cached points map representing this laser scan, building it upon the first call...
bool isHorizontal(const double tolerance=0) const
Return true if the 6D pose represents a Z axis almost exactly vertical (upwards or downwards)...
mrpt::img::TColorf color
Color of points.
virtual void setPointAllFieldsFast(const size_t index, const std::vector< float > &point_data)=0
Set all the data fields for one point as a vector: depending on the implementation class this can be ...
void getAs3DObject(mrpt::opengl::CSetOfObjects::Ptr &outObj) const override
Returns a 3D object representing the map.
void base_copyFrom(const CPointsMap &obj)
Helper method for ::copyFrom()
void setAllVertices(const std::vector< double > &x, const std::vector< double > &y)
Set all vertices at once.
A range or depth 3D scan measurement, as from a time-of-flight range camera or a structured-light dep...
void loadFromVelodyneScan(const mrpt::obs::CObservationVelodyneScan &scan, const mrpt::poses::CPose3D *robotPose=nullptr)
Like loadFromRangeScan() for Velodyne 3D scans.
mrpt::vision::TStereoCalibParams params
A wrapper of a TPolygon2D class, implementing CSerializable.
A cloud of points in 2D or 3D, which can be built from a sequence of laser scans. ...
void internal_set_build_points_map_from_scan2D(scan2pts_functor fn)
void insertPoint(float x, float y, float z=0)
Provides a way to insert (append) individual points into the map: the missing fields of child classes...
virtual void getPointAllFieldsFast(const size_t index, std::vector< float > &point_data) const =0
Get all the data fields for one point as a vector: depending on the implementation class this can be ...
TMapGenericParams genericMapParams
Common params to all maps.
virtual unsigned int getPointWeight(size_t index) const
Gets the point weight, which is ignored in all classes (defaults to 1) but in those which actually st...
virtual void reserve(size_t newLength)=0
Reserves memory for a given number of points: the size of the map does not change, it only reserves the memory.
void loadFromConfigFile(const mrpt::config::CConfigFileBase &source, const std::string §ion) override
This method load the options from a ".ini"-like file or memory-stored string list.
bool m_boundingBoxIsUpdated
void generatePointCloud(const TGeneratePointCloudParameters ¶ms=TGeneratePointCloudParameters())
Generates the point cloud into the point cloud data fields in CObservationVelodyneScan::point_cloud w...
void PLY_import_set_vertex(const size_t idx, const mrpt::math::TPoint3Df &pt, const mrpt::img::TColorf *pt_color=nullptr) override
In a base class, will be called after PLY_import_set_vertex_count() once for each loaded point...
mrpt::poses::CPose3D sensorPose
The 6D pose of the sensor on the robot/vehicle frame of reference.
size_t PLY_export_get_vertex_count() const override
In a base class, return the number of vertices.
void dumpToTextStream(std::ostream &out) const override
This method should clearly display all the contents of the structure in textual form, sending it to a std::ostream.
mrpt::math::TPose2D asTPose() const
float maxDistForCorr
(Default: 0.10f) The minimum distance between 2 non-probabilistic map elements for counting them as a...
static Ptr Create(Args &&... args)
#define MRPT_THROW_UNKNOWN_SERIALIZATION_VERSION(__V)
For use in CSerializable implementations.
#define MRPT_TRY_START
The start of a standard MRPT "try...catch()" block that allows tracing throw the call stack after an ...
#define ASSERT_(f)
Defines an assertion mechanism.
TPointCloud point_cloud
Optionally, raw data can be converted into a 3D point cloud (local coordinates wrt the sensor...
float d2f(const double d)
shortcut for static_cast<float>(double)
A cloud of points in 2D or 3D, which can be built from a sequence of laser scans or other sensors...
This class allows loading and storing values and vectors of different types from a configuration text...
This base provides a set of functions for maths stuff.
double internal_computeObservationLikelihoodPointCloud3D(const mrpt::poses::CPose3D &pc_in_map, const float *xs, const float *ys, const float *zs, const std::size_t num_pts)
#define CLASS_ID(T)
Access to runtime class ID for a defined class name.
double phi() const
Get the phi angle of the 2D pose (in radians)
void ReadAsAndCastTo(CAST_TO_TYPE &read_here)
Read a value from a stream stored in a type different of the target variable, making the conversion v...
bool isPlanarScan(const double tolerance=0) const
Return true if the laser scanner is "horizontal", so it has an absolute value of "pitch" and "roll" l...
#define ASSERT_EQUAL_(__A, __B)
Assert comparing two values, reporting their actual values upon failure.
double sigma_dist
Sigma squared (variance, in meters) of the exponential used to model the likelihood (default= 0...
void getAllPoints(VECTOR &xs, VECTOR &ys, VECTOR &zs, size_t decimation=1) const
Returns a copy of the 2D/3D points as a std::vector of float coordinates.
void loadFromRangeScan(const mrpt::obs::CObservation2DRangeScan &rangeScan, const mrpt::poses::CPose3D *robotPose=nullptr) override
See CPointsMap::loadFromRangeScan()
bool PointIntoPolygon(double x, double y) const
Check if a point is inside the polygon.
#define IS_DERIVED(obj, class_name)
True if the given reference to object (derived from mrpt::rtti::CObject) is an instance of the given ...
bool m_largestDistanceFromOriginIsUpdated
Auxiliary variables used in "getLargestDistanceFromOrigin".
void readFromStream(mrpt::serialization::CArchive &in)
Binary dump to stream - used in derived classes' serialization.
void extractCylinder(const mrpt::math::TPoint2D ¢er, const double radius, const double zmin, const double zmax, CPointsMap *outMap)
Extracts the points in the map within a cylinder in 3D defined the provided radius and zmin/zmax valu...
void fuseWith(CPointsMap *anotherMap, float minDistForFuse=0.02f, std::vector< bool > *notFusedPoints=nullptr)
Insert the contents of another map into this one, fusing the previous content with the new one...
void writeToStream(mrpt::serialization::CArchive &out) const
Binary dump to stream - for usage in derived classes' serialization.
This namespace contains representation of robot actions and observations.
string iniFile(myDataDir+string("benchmark-options.ini"))
void extractPoints(const mrpt::math::TPoint3D &corner1, const mrpt::math::TPoint3D &corner2, CPointsMap *outMap, double R=1, double G=1, double B=1)
Extracts the points in the map within the area defined by two corners.
#define IMPLEMENTS_MEXPLUS_FROM(complete_type)
#define IS_CLASS(obj, class_name)
True if the given reference to object (derived from mrpt::rtti::CObject) is of the given class...
virtual void addFrom_classSpecific(const CPointsMap &anotherMap, const size_t nPreviousPoints)=0
Auxiliary method called from within addFrom() automatically, to finish the copying of class-specific ...
TPoint3D_< double > TPoint3D
Lightweight 3D point.
virtual void setPointWeight(size_t index, unsigned long w)
Sets the point weight, which is ignored in all classes but those which actually store that field (Not...
#define ASSERTMSG_(f, __ERROR_MSG)
Defines an assertion mechanism.
double x() const
Common members of all points & poses classes.
float getLargestDistanceFromOrigin() const
This method returns the largest distance from the origin to any of the points, such as a sphere cente...
void loadFromConfigFile(const mrpt::config::CConfigFileBase &source, const std::string §ion) override
This method load the options from a ".ini"-like file or memory-stored string list.
float m_largestDistanceFromOrigin
Auxiliary variables used in "getLargestDistanceFromOrigin".
void setPointFast(size_t index, float x, float y, float z)
Changes the coordinates of the given point (0-based index), without checking for out-of-bounds and wi...
mrpt::maps::CPointsMap::Ptr pointcloud
The pointcloud.
Classes for 2D/3D geometry representation, both of single values and probability density distribution...
void compute3DDistanceToMesh(const mrpt::maps::CMetricMap *otherMap2, const mrpt::poses::CPose3D &otherMapPose, float maxDistForCorrespondence, mrpt::tfest::TMatchingPairList &correspondences, float &correspondencesRatio)
Computes the matchings between this and another 3D points map.
virtual void insertPointRGB(float x, float y, float z, float R, float G, float B)
overload (RGB data is ignored in classes without color information)
A structure for holding correspondences between two sets of points or points-like entities in 2D or 3...
struct mxArray_tag mxArray
Forward declaration for mxArray (avoid #including as much as possible to speed up compiling) ...
Undefined colormap [New in MRPT 2.0].
void boundingBox(float &min_x, float &max_x, float &min_y, float &max_y, float &min_z, float &max_z) const
Computes the bounding box of all the points, or (0,0 ,0,0, 0,0) if there are no points.
#define LOADABLEOPTS_DUMP_VAR(variableName, variableType)
Macro for dumping a variable to a stream, within the method "dumpToTextStream(out)" (Variable types a...
int fprintf(FILE *fil, const char *format,...) noexcept MRPT_printf_format_check(2
An OS-independent version of fprintf.
return_t square(const num_t x)
Inline function for the square of a number.
#define MRPT_LOAD_CONFIG_VAR( variableName, variableType, configFileObject, sectionNameStr)
An useful macro for loading variables stored in a INI-like file under a key with the same name that t...
mrpt::aligned_std_vector< float > m_z
void dumpToTextStream(std::ostream &out) const override
This method should clearly display all the contents of the structure in textual form, sending it to a std::ostream.
double internal_computeObservationLikelihood(const mrpt::obs::CObservation &obs, const mrpt::poses::CPose3D &takenFrom) override
Internal method called by computeObservationLikelihood()
std::vector< uint8_t > intensity
Color [0,255].
A "CObservation"-derived class that represents a 2D range scan measurement (typically from a laser sc...
constexpr std::size_t size() const
virtual void resize(size_t newLength)=0
Resizes all point buffers so they can hold the given number of points: newly created points are set t...
void mark_as_modified() const
Users normally don't need to call this.
virtual const mrpt::rtti::TRuntimeClassId * GetRuntimeClass() const override
Returns information about the class of an object in runtime.
bool addToExistingPointsMap
Applicable to "loadFromRangeScan" only! If set to false, the points from the scan are loaded...
Virtual base class for "archives": classes abstracting I/O streams.
bool fuseWithExisting
If set to true (default=false), inserted points are "fused" with previously existent ones...
mrpt::aligned_std_vector< float > m_y
TLikelihoodOptions likelihoodOptions
void filterUniqueRobustPairs(const size_t num_elements_this_map, TMatchingPairList &out_filtered_list) const
Creates a filtered list of pairings with those ones which have a single correspondence which coincide...
void getPointsBuffer(size_t &outPointsCount, const float *&xs, const float *&ys, const float *&zs) const
Provides a direct access to points buffer, or nullptr if there is no points in the map...
void setPoint(size_t index, float x, float y, float z)
Changes a given point from map, with Z defaulting to 0 if not provided.
TRenderOptions renderOptions
Declares a virtual base class for all metric maps storage classes.
A class used to store a 2D pose, including the 2D coordinate point and a heading (phi) angle...
A class used to store a 3D pose (a 3D translation + a rotation in 3D).
mrpt::vision::TStereoCalibResults out
Declares a class that represents any robot's observation.
float compute3DMatchingRatio(const mrpt::maps::CMetricMap *otherMap, const mrpt::poses::CPose3D &otherMapPose, const TMatchingRatioParams ¶ms) const override
Computes the ratio in [0,1] of correspondences between "this" and the "otherMap" map, whose 6D pose relative to "this" is "otherMapPose" In the case of a multi-metric map, this returns the average between the maps.
void kdtree_mark_as_outdated() const
To be called by child classes when KD tree data changes.
#define ASSERT_ABOVE_(__A, __B)
An RGBA color - floats in the range [0,1].
#define LOADABLEOPTS_DUMP_VAR_DEG(variableName)
Macro for dumping a variable to a stream, transforming the argument from radians to degrees...
float horizontalTolerance
The tolerance in rads in pitch & roll for a laser scan to be considered horizontal, considered only when isPlanarMap=true (default=0).
void determineMatching2D(const mrpt::maps::CMetricMap *otherMap, const mrpt::poses::CPose2D &otherMapPose, mrpt::tfest::TMatchingPairList &correspondences, const TMatchingParams ¶ms, TMatchingExtraResults &extraResults) const override
Computes the matching between this and another 2D point map, which includes finding: ...
virtual void setPointRGB(size_t index, float x, float y, float z, float R, float G, float B)
overload (RGB data is ignored in classes without color information)
bool derivedFrom(const TRuntimeClassId *pBaseClass) const
void readFromStream(mrpt::serialization::CArchive &in)
Binary dump to stream - for usage in derived classes' serialization.
bool internal_insertObservation(const mrpt::obs::CObservation &obs, const mrpt::poses::CPose3D *robotPose) override
This is a common version of CMetricMap::insertObservation() for point maps (actually, CMetricMap::internal_insertObservation), so derived classes don't need to worry implementing that method unless something special is really necesary.
void(*)(const mrpt::obs::CObservation2DRangeScan &obs, mrpt::maps::CMetricMap::Ptr &out_map, const void *insertOps) scan2pts_functor
TInsertionOptions insertionOptions
The options used when inserting observations in the map.
double max_corr_distance
Maximum distance in meters to consider for the numerator divided by "sigma_dist", so that each point ...
FILE * fopen(const char *fileName, const char *mode) noexcept
An OS-independent version of fopen.
void composePoint(double lx, double ly, double lz, double &gx, double &gy, double &gz, mrpt::optional_ref< mrpt::math::CMatrixDouble33 > out_jacobian_df_dpoint=std::nullopt, mrpt::optional_ref< mrpt::math::CMatrixDouble36 > out_jacobian_df_dpose=std::nullopt, mrpt::optional_ref< mrpt::math::CMatrixDouble36 > out_jacobian_df_dse3=std::nullopt, bool use_small_rot_approx=false) const
An alternative, slightly more efficient way of doing with G and L being 3D points and P this 6D pose...
virtual const mrpt::maps::CSimplePointsMap * getAsSimplePointsMap() const
If the map is a simple points map or it's a multi-metric map that contains EXACTLY one simple points ...
static TAuxLoadFunctor dummy_loader
#define MRPT_LOAD_CONFIG_VAR_DEGREES( variableName, configFileObject, sectionNameStr)
Loads a double variable, stored as radians but entered in the INI-file as degrees.
size_t kdTreeClosestPoint2D(float x0, float y0, float &out_x, float &out_y, float &out_dist_sqr) const
KD Tree-based search for the closest point (only ONE) to some given 2D coordinates.
virtual void insertPointFast(float x, float y, float z=0)=0
The virtual method for insertPoint() without calling mark_as_modified()
void determineMatching3D(const mrpt::maps::CMetricMap *otherMap, const mrpt::poses::CPose3D &otherMapPose, mrpt::tfest::TMatchingPairList &correspondences, const TMatchingParams ¶ms, TMatchingExtraResults &extraResults) const override
Computes the matchings between this and another 3D points map - method used in 3D-ICP.
float squareDistanceToClosestCorrespondence(float x0, float y0) const override
Returns the square distance from the 2D point (x0,y0) to the closest correspondence in the map...
uint32_t decimation
Speed up the likelihood computation by considering only one out of N rays (default=10) ...
Parameters for the determination of matchings between point clouds, etc.
mrpt::aligned_std_vector< float > m_x
The point coordinates.
size_t size() const
Save the point cloud as a PCL PCD file, in either ASCII or binary format.
bool disableDeletion
If set to false (default=true) points in the same plane as the inserted scan and inside the free spac...
Functions for estimating the optimal transformation between two frames of references given measuremen...
void clear()
Clear the contents of this container.
void getHomogeneousMatrix(mrpt::math::CMatrixDouble44 &out_HM) const
Returns the corresponding 4x4 homogeneous transformation matrix for the point(translation) or pose (t...
double phi
Orientation (rads)
void PLY_export_get_vertex(const size_t idx, mrpt::math::TPoint3Df &pt, bool &pt_has_color, mrpt::img::TColorf &pt_color) const override
In a base class, will be called after PLY_export_get_vertex_count() once for each exported point...
float kdTreeClosestPoint2DsqrError(float x0, float y0) const
Like kdTreeClosestPoint2D, but just return the square error from some point to its closest neighbor...
void kdTreeTwoClosestPoint2D(float x0, float y0, float &out_x1, float &out_y1, float &out_x2, float &out_y2, float &out_dist_sqr1, float &out_dist_sqr2) const
KD Tree-based search for the TWO closest point to some given 2D coordinates.
double distance(const TPoint2D &p1, const TPoint2D &p2)
Gets the distance between two points in a 2D space.
void applyDeletionMask(const std::vector< bool > &mask)
Remove from the map the points marked in a bool's array as "true".
size_t kdTreeClosestPoint3D(float x0, float y0, float z0, float &out_x, float &out_y, float &out_z, float &out_dist_sqr) const
KD Tree-based search for the closest point (only ONE) to some given 3D coordinates.
float minDistBetweenLaserPoints
The minimum distance between points (in 3D): If two points are too close, one of them is not inserted...
#define MRPT_UNUSED_PARAM(a)
Determines whether this is an X86 or AMD64 platform.
void readFromStream(mrpt::serialization::CArchive &in)
Binary dump to stream - for usage in derived classes' serialization.
int round(const T value)
Returns the closer integer (int) to x.