41 void COccupancyGridMap2D::TMapDefinition::loadFromConfigFile_map_specific(
47 sectionNamePrefix +
string(
"_creationOpts");
55 insertionOpts.loadFromConfigFile(
56 source, sectionNamePrefix +
string(
"_insertOpts"));
59 likelihoodOpts.loadFromConfigFile(
60 source, sectionNamePrefix +
string(
"_likelihoodOpts"));
63 void COccupancyGridMap2D::TMapDefinition::dumpToTextStream_map_specific(
72 this->insertionOpts.dumpToTextStream(out);
73 this->likelihoodOpts.dumpToTextStream(out);
91 std::vector<float> COccupancyGridMap2D::entropyTable;
93 static const float MAX_H = 0.69314718055994531f;
106 COccupancyGridMap2D::COccupancyGridMap2D(
107 float min_x,
float max_x,
float min_y,
float max_y,
float resolution)
116 precomputedLikelihood(),
117 precomputedLikelihoodToBeRecomputed(true),
121 voroni_free_threshold(),
122 updateInfoChangeOnly(),
160 float x_min,
float x_max,
float y_min,
float y_max,
float resolution,
167 ASSERT_(default_value >= 0 && default_value <= 1)
193 #ifdef ROWSIZE_MULTIPLE_16 220 float new_x_min,
float new_x_max,
float new_y_min,
float new_y_max,
221 float new_cells_default_value,
bool additionalMargin) noexcept
223 unsigned int extra_x_izq = 0, extra_y_arr = 0, new_size_x = 0,
225 std::vector<cellType> new_map;
227 if (new_x_min > new_x_max)
230 "[COccupancyGridMap2D::resizeGrid] Warning!! Ignoring call, since: " 231 "x_min=%f x_max=%f\n",
232 new_x_min, new_x_max);
235 if (new_y_min > new_y_max)
238 "[COccupancyGridMap2D::resizeGrid] Warning!! Ignoring call, since: " 239 "y_min=%f y_max=%f\n",
240 new_y_min, new_y_max);
245 if (new_x_min >= x_min && new_y_min >= y_min && new_x_max <= x_max &&
250 precomputedLikelihoodToBeRecomputed =
true;
253 if (additionalMargin)
255 if (new_x_min < x_min) new_x_min = floor(new_x_min - 4);
256 if (new_x_max > x_max) new_x_max = ceil(new_x_max + 4);
257 if (new_y_min < y_min) new_y_min = floor(new_y_min - 4);
258 if (new_y_max > y_max) new_y_max = ceil(new_y_max + 4);
262 new_x_min =
min(new_x_min, x_min);
263 new_x_max = max(new_x_max, x_max);
264 new_y_min =
min(new_y_min, y_min);
265 new_y_max = max(new_y_max, y_max);
269 if (fabs(new_x_min / resolution -
round(new_x_min / resolution)) > 0.05f)
270 new_x_min = resolution *
round(new_x_min / resolution);
271 if (fabs(new_y_min / resolution -
round(new_y_min / resolution)) > 0.05f)
272 new_y_min = resolution *
round(new_y_min / resolution);
273 if (fabs(new_x_max / resolution -
round(new_x_max / resolution)) > 0.05f)
274 new_x_max = resolution *
round(new_x_max / resolution);
275 if (fabs(new_y_max / resolution -
round(new_y_max / resolution)) > 0.05f)
276 new_y_max = resolution *
round(new_y_max / resolution);
279 extra_x_izq =
round((x_min - new_x_min) / resolution);
280 extra_y_arr =
round((y_min - new_y_min) / resolution);
282 new_size_x =
round((new_x_max - new_x_min) / resolution);
283 new_size_y =
round((new_y_max - new_y_min) / resolution);
285 assert(new_size_x >= size_x + extra_x_izq);
287 #ifdef ROWSIZE_MULTIPLE_16 289 size_t old_new_size_x = new_size_x;
290 if (0 != (new_size_x % 16))
292 int size_x_incr = 16 - (new_size_x % 16);
294 new_x_max += size_x_incr * resolution;
296 new_size_x =
round((new_x_max - new_x_min) / resolution);
297 assert(0 == (new_size_x % 16));
301 new_map.resize(new_size_x * new_size_y, p2l(new_cells_default_value));
305 cellType* dest_ptr = &new_map[extra_x_izq + extra_y_arr * new_size_x];
307 size_t row_size = size_x *
sizeof(
cellType);
309 for (
size_t y = 0;
y < size_y;
y++)
311 #if defined(_DEBUG) || (MRPT_ALWAYS_CHECKS_DEBUG) 312 assert(dest_ptr + row_size - 1 <= &new_map[new_map.size() - 1]);
313 assert(src_ptr + row_size - 1 <= &map[map.size() - 1]);
315 memcpy(dest_ptr, src_ptr, row_size);
316 dest_ptr += new_size_x;
335 m_voronoi_diagram.clear();
380 #ifdef OCCUPANCY_GRIDMAP_CELL_SIZE_8BITS 381 unsigned int N = 256;
383 unsigned int N = 65536;
391 for (i = 0; i < N; i++)
393 p =
l2p(static_cast<cellType>(i));
397 if (i == 0 || i == (N - 1)) h = 0;
411 it !=
map.end(); ++it)
416 if (h < (
MAX_H - 0.001f))
448 if (
p == 0 ||
p == 1)
484 if (static_cast<unsigned int>(
x) >=
size_x ||
485 static_cast<unsigned int>(
y) >=
size_y)
494 float old =
l2p(theCell);
495 float new_v = 1 / (1 + (1 -
v) * (1 - old) / (old *
v));
525 std::vector<cellType> newMap;
534 newMap.resize(newSizeX * newSizeY);
536 for (
int x = 0;
x < newSizeX;
x++)
538 for (
int y = 0;
y < newSizeY;
y++)
542 for (
int xx = 0; xx < downRatio; xx++)
543 for (
int yy = 0; yy < downRatio; yy++)
544 newCell +=
getCell(
x * downRatio + xx,
y * downRatio + yy);
546 newCell /= (downRatio * downRatio);
548 newMap[
x +
y * newSizeX] =
p2l(newCell);
570 params.offset_other_map_points,
params.decimation_other_map_points)
577 const size_t nLocalPoints = otherMap->size();
578 std::vector<float> x_locals(nLocalPoints), y_locals(nLocalPoints),
579 z_locals(nLocalPoints);
581 const float sin_phi = sin(otherMapPose.
phi);
582 const float cos_phi = cos(otherMapPose.
phi);
584 size_t nOtherMapPointsWithCorrespondence =
586 size_t nTotalCorrespondences = 0;
587 float _sumSqrDist = 0;
590 const int cellsSearchRange =
594 correspondences.clear();
597 if (!nLocalPoints)
return;
602 float local_x_min = std::numeric_limits<float>::max();
603 float local_x_max = -std::numeric_limits<float>::max();
604 float local_y_min = std::numeric_limits<float>::max();
605 float local_y_max = -std::numeric_limits<float>::max();
607 const std::vector<float>& otherMap_pxs = otherMap->getPointsBufferRef_x();
608 const std::vector<float>& otherMap_pys = otherMap->getPointsBufferRef_y();
609 const std::vector<float>& otherMap_pzs = otherMap->getPointsBufferRef_z();
612 for (
unsigned int localIdx =
params.offset_other_map_points;
613 localIdx < nLocalPoints;
614 localIdx +=
params.decimation_other_map_points)
617 const float xx = x_locals[localIdx] = otherMapPose.
x +
618 cos_phi * otherMap_pxs[localIdx] -
619 sin_phi * otherMap_pys[localIdx];
620 const float yy = y_locals[localIdx] = otherMapPose.
y +
621 sin_phi * otherMap_pxs[localIdx] +
622 cos_phi * otherMap_pys[localIdx];
623 z_locals[localIdx] = otherMap_pzs[localIdx];
626 local_x_min =
min(local_x_min, xx);
627 local_x_max = max(local_x_max, xx);
628 local_y_min =
min(local_y_min, yy);
629 local_y_max = max(local_y_max, yy);
634 if (local_x_min >
x_max || local_x_max < x_min || local_y_min >
y_max ||
641 for (
unsigned int localIdx =
params.offset_other_map_points;
642 localIdx < nLocalPoints;
643 localIdx +=
params.decimation_other_map_points)
646 float maxDistForCorrespondenceSquared =
650 const float x_local = x_locals[localIdx];
651 const float y_local = y_locals[localIdx];
652 const float z_local = z_locals[localIdx];
655 float min_dist = 1e6;
659 const int cx0 =
x2idx(x_local);
660 const int cy0 =
y2idx(y_local);
663 const int cx_min = max(0, cx0 - cellsSearchRange);
665 min(static_cast<int>(
size_x) - 1, cx0 + cellsSearchRange);
666 const int cy_min = max(0, cy0 - cellsSearchRange);
668 min(static_cast<int>(
size_y) - 1, cy0 + cellsSearchRange);
671 bool thisLocalHasCorr =
false;
674 for (
int cx = cx_min; cx <= cx_max; cx++)
676 for (
int cy = cy_min; cy <= cy_max; cy++)
682 const float residual_x =
idx2x(cx) - x_local;
683 const float residual_y =
idx2y(cy) - y_local;
686 maxDistForCorrespondenceSquared =
square(
687 params.maxAngularDistForCorrespondence *
688 params.angularDistPivotPoint.distanceTo(
690 params.maxDistForCorrespondence);
693 const float this_dist =
696 if (this_dist < maxDistForCorrespondenceSquared)
698 if (!
params.onlyKeepTheClosest)
701 nTotalCorrespondences++;
708 mp.
other_x = otherMap_pxs[localIdx];
709 mp.
other_y = otherMap_pys[localIdx];
710 mp.
other_z = otherMap_pzs[localIdx];
711 correspondences.push_back(mp);
716 if (this_dist < min_dist)
718 min_dist = this_dist;
723 closestCorr.
this_z = z_local;
725 closestCorr.
other_x = otherMap_pxs[localIdx];
726 closestCorr.
other_y = otherMap_pys[localIdx];
727 closestCorr.
other_z = otherMap_pzs[localIdx];
732 thisLocalHasCorr =
true;
739 if (
params.onlyKeepTheClosest &&
740 (min_dist < maxDistForCorrespondenceSquared))
742 nTotalCorrespondences++;
743 correspondences.push_back(closestCorr);
747 if (thisLocalHasCorr)
749 nOtherMapPointsWithCorrespondence++;
752 _sumSqrDist += min_dist;
757 extraResults.correspondencesRatio =
758 nOtherMapPointsWithCorrespondence /
759 static_cast<float>(nLocalPoints /
params.decimation_other_map_points);
760 extraResults.sumSqrDist = _sumSqrDist;
776 return e1.first > e2.first;
783 float x1,
float y1,
float x2,
float y2)
const 790 for (
int i = 0; i < nSteps; i++)
792 float x = x1 + (x2 - x1) * i / static_cast<float>(nSteps);
793 float y = y1 + (y2 - y1) * i / static_cast<float>(nSteps);
798 return sumCost /
static_cast<float>(nSteps);
Virtual base for specifying the kind and parameters of one map (normally, to be inserted into mrpt::m...
Parameters for CMetricMap::compute3DMatchingRatio()
void clear()
Erase the contents of all the cells.
Classes for serialization, sockets, ini-file manipulation, streams, list of properties-values, timewatch, extensions to STL.
float getResolution() const
Returns the resolution of the grid map.
#define ASSERT_ABOVE_(__A, __B)
mrpt::maps::COccupancyGridMap2D::TInsertionOptions insertionOpts
Observations insertion options.
mrpt::utils::CDynamicGrid< uint8_t > m_basis_map
Used for Voronoi calculation.Same struct as "map", but contains a "0" if not a basis point...
double effectiveMappedArea
The target variable for the area of cells with information, i.e.
#define IMPLEMENTS_SERIALIZABLE(class_name, base, NameSpace)
This must be inserted in all CSerializable classes implementation files.
float resolution
Cell size, i.e.
static double H(double p)
Entropy computation internal function:
#define ASSERT_BELOW_(__A, __B)
bool derivedFrom(const TRuntimeClassId *pBaseClass) const
#define LOADABLEOPTS_DUMP_VAR(variableName, variableType)
Macro for dumping a variable to a stream, within the method "dumpToTextStream(out)" (Variable types a...
virtual const mrpt::utils::TRuntimeClassId * GetRuntimeClass() const override
Returns information about the class of an object in runtime.
void updateCell(int x, int y, float v)
Performs the Bayesian fusion of a new observation of a cell.
struct mrpt::maps::COccupancyGridMap2D::TUpdateCellsInfoChangeOnly updateInfoChangeOnly
const Scalar * const_iterator
static const cellType OCCGRID_CELLTYPE_MAX
std::pair< double, mrpt::math::TPoint2D > TPairLikelihoodIndex
Auxiliary private class.
GLsizei GLsizei GLuint * obj
void freeMap()
Frees the dynamic memory buffers of map.
std::vector< cellType > map
Store of cell occupancy values.
This class allows loading and storing values and vectors of different types from a configuration text...
T square(const T x)
Inline function for the square of a number.
This base class is used to provide a unified interface to files,memory buffers,..Please see the deriv...
A cloud of points in 2D or 3D, which can be built from a sequence of laser scans or other sensors...
double H
The target variable for absolute entropy, computed as: H(map)=Sumx,y{ -p(x,y)*ln(p(x,y)) -(1-p(x,y))*ln(1-p(x,y)) }
This base provides a set of functions for maths stuff.
#define CLASS_ID(T)
Access to runtime class ID for a defined class name.
#define MRPT_UNUSED_PARAM(a)
Can be used to avoid "not used parameters" warnings from the compiler.
bool isEmpty() const override
Returns true upon map construction or after calling clear(), the return changes to false upon success...
float idx2x(const size_t cx) const
Transform a cell index into a coordinate value.
void copyMapContentFrom(const COccupancyGridMap2D &otherMap)
copy the gridmap contents, but not all the options, from another map instance
double I
The target variable for absolute "information", defining I(x) = 1 - H(x)
This namespace contains representation of robot actions and observations.
void subSample(int downRatio)
Performs a downsampling of the gridmap, by a given factor: resolution/=ratio.
double I_change
The cummulative change in Information: This is updated only from the "updateCell" method...
static CLogOddsGridMapLUT< COccupancyGridMap2D::cellType > logodd_lut
GLsizei const GLchar ** string
Classes for 2D/3D geometry representation, both of single values and probability density distribution...
double mean_H
The target variable for mean entropy, defined as entropy per cell: mean_H(map) = H(map) / (cells) ...
bool precomputedLikelihoodToBeRecomputed
A class for storing an occupancy grid map.
static const cellType OCCGRID_CELLTYPE_MIN
Discrete to float conversion factors: The min/max values of the integer cell type, eg.
This is the global namespace for all Mobile Robot Programming Toolkit (MRPT) libraries.
#define MAP_DEFINITION_REGISTER(_CLASSNAME_STRINGS, _CLASSNAME_WITH_NS)
Registers one map class into TMetricMapInitializer factory.
unsigned long effectiveMappedCells
The mapped area in cells.
static cellType p2l(const float p)
Scales a real valued probability in [0,1] to an integer representation of: log(p)-log(1-p) in the val...
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).
int cellsUpdated
The cummulative updated cells count: This is updated only from the "updateCell" method.
virtual ~COccupancyGridMap2D()
Destructor.
static std::vector< float > entropyTable
Internally used to speed-up entropy calculation.
bool m_is_empty
True upon construction; used by isEmpty()
virtual void internal_clear() override
Clear the map: It set all cells to their default occupancy value (0.5), without changing the resoluti...
mrpt::maps::COccupancyGridMap2D::TLikelihoodOptions likelihoodOpts
Probabilistic observation likelihood options.
float min_x
See COccupancyGridMap2D::COccupancyGridMap2D.
GLsizei GLsizei GLchar * source
float idx2y(const size_t cy) const
int round(const T value)
Returns the closer integer (int) to x.
virtual void determineMatching2D(const mrpt::maps::CMetricMap *otherMap, const mrpt::poses::CPose2D &otherMapPose, mrpt::utils::TMatchingPairList &correspondences, const TMatchingParams ¶ms, TMatchingExtraResults &extraResults) const override
See the base class for more details: In this class it is implemented as correspondences of the passed...
void computeEntropy(TEntropyInfo &info) const
Computes the entropy and related values of this grid map.
float compute3DMatchingRatio(const mrpt::maps::CMetricMap *otherMap, const mrpt::poses::CPose3D &otherMapPose, const TMatchingRatioParams ¶ms) const override
See docs in base class: in this class this always returns 0.
uint32_t size_x
The size of the grid in cells.
void fill(float default_value=0.5f)
Fills all the cells with a default value.
void resizeGrid(float new_x_min, float new_x_max, float new_y_min, float new_y_max, float new_cells_default_value=0.5f, bool additionalMargin=true) noexcept
Change the size of gridmap, maintaining previous contents.
float x_min
The limits of the grid in "units" (meters)
float getPos(float x, float y) const
Read the real valued [0,1] contents of a cell, given its coordinates.
void setSize(float x_min, float x_max, float y_min, float y_max, float resolution, float default_value=0.5f)
Change the size of gridmap, erasing all its previous contents.
#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...
uint16_t cellTypeUnsigned
float computePathCost(float x1, float y1, float x2, float y2) const
Compute the 'cost' of traversing a segment of the map according to the occupancy of traversed cells...
double mean_I
The target variable for mean information, defined as information per cell: mean_I(map) = I(map) / (ce...
Parameters for the determination of matchings between point clouds, etc.
Used for returning entropy related information.
bool operator<(const COccupancyGridMap2D::TPairLikelihoodIndex &e1, const COccupancyGridMap2D::TPairLikelihoodIndex &e2)
GLenum const GLfloat * params
int16_t cellType
The type of the map cells:
int x2idx(float x) const
Transform a coordinate value into a cell index.
double phi
Orientation (rads)
A structure for holding correspondences between two sets of points or points-like entities in 2D or 3...
float getCell(int x, int y) const
Read the real valued [0,1] contents of a cell, given its index.
static float l2p(const cellType l)
Scales an integer representation of the log-odd into a real valued probability in [0...
One static instance of this struct should exist in any class implementing CLogOddsGridMap2D to hold t...
void memcpy(void *dest, size_t destSize, const void *src, size_t copyCount) noexcept
An OS and compiler independent version of "memcpy".
bool enabled
If set to false (default), this struct is not used.
mrpt::utils::CDynamicGrid< uint16_t > m_voronoi_diagram
Used to store the Voronoi diagram.