37 "CGasConcentrationGridMap2D,gasGrid",
57 sectionNamePrefix +
string(
"_creationOpts");
64 sSectCreation,
"mapType", mapType);
66 insertionOpts.loadFromConfigFile(
67 source, sectionNamePrefix +
string(
"_insertOpts"));
84 this->insertionOpts.dumpToTextStream(out);
105 #define LUT_TABLE (*(LUT.table)) 111 TMapRepresentation mapType,
float x_min,
float x_max,
float y_min,
112 float y_max,
float resolution)
117 insertionOptions.GMRF_saturate_min = 0;
118 insertionOptions.GMRF_saturate_max = 1;
119 insertionOptions.GMRF_lambdaObsLoss = 1.0;
127 windGrid_module.setSize(x_min, x_max, y_min, y_max, resolution);
128 windGrid_direction.setSize(x_min, x_max, y_min, y_max, resolution);
134 CGasConcentrationGridMap2D::~CGasConcentrationGridMap2D() {}
186 robotPose2D =
CPose2D(*robotPose);
187 robotPose3D = (*robotPose);
221 sensorReading =
math::mean(it->readingsVoltage);
227 for (i = 0; i < it->sensorTypes.size(); i++)
229 if (it->sensorTypes.at(i) ==
234 if (i < it->sensorTypes.size())
236 sensorReading = it->readingsVoltage[i];
240 cout <<
"Sensor especified not found, compute default " 243 sensorReading =
math::mean(it->readingsVoltage);
318 #if MRPT_IS_BIG_ENDIAN 322 <<
m_map[i].dmv_var_mean;
384 vector<TOldCellTypeInVersion1> old_map(
n);
385 in.ReadBuffer(&old_map[0],
sizeof(old_map[0]) * old_map.size());
389 for (
size_t k = 0; k <
n; k++)
392 (old_map[k].w != 0) ? old_map[k].wr : old_map[k].
mean;
394 (old_map[k].w != 0) ? old_map[k].
w : old_map[k].
std;
406 #if MRPT_IS_BIG_ENDIAN 409 m_map[i].dmv_var_mean;
458 gasSensorLabel(
"MCEnose"),
462 windSensorLabel(
"windSensor"),
463 useWindInformation(false),
464 std_windNoise_phi(0.2f),
465 std_windNoise_mod(0.2f),
466 default_wind_direction(0.0f),
467 default_wind_speed(1.0f)
478 "\n----------- [CGasConcentrationGridMap2D::TInsertionOptions] " 479 "------------ \n\n");
480 out.
printf(
"[TInsertionOptions.Common] ------------ \n\n");
481 internal_dumpToTextStream_common(
484 out.
printf(
"[TInsertionOptions.GasSpecific] ------------ \n\n");
486 "gasSensorLabel = %s\n",
487 gasSensorLabel.c_str());
489 "enose_id = %u\n", (
unsigned)enose_id);
491 "gasSensorType = %u\n",
492 (
unsigned)gasSensorType);
494 "windSensorLabel = %s\n",
495 windSensorLabel.c_str());
497 "useWindInformation = %u\n", useWindInformation);
499 out.
printf(
"advectionFreq = %f\n", advectionFreq);
501 "default_wind_direction = %f\n",
502 default_wind_direction);
504 "default_wind_speed = %f\n", default_wind_speed);
506 "std_windNoise_phi = %f\n", std_windNoise_phi);
508 "std_windNoise_mod = %f\n", std_windNoise_mod);
520 internal_loadFromConfigFile_common(iniFile, section);
524 section.c_str(),
"gasSensorLabel",
"Full_MCEnose",
true);
525 enose_id = iniFile.
read_int(section.c_str(),
"enoseID", enose_id);
529 iniFile.
read_string(section.c_str(),
"gasSensorType",
"-1",
true);
531 stringstream convert(sensorType_str);
532 convert >> std::hex >> tmpSensorType;
534 if (tmpSensorType >= 0)
537 gasSensorType = tmpSensorType;
542 section.c_str(),
"KF_sensorType", gasSensorType,
true);
546 section.c_str(),
"windSensorLabel",
"Full_MCEnose",
true);
550 iniFile.
read_bool(section.c_str(),
"useWindInformation",
"false",
true);
553 default_wind_direction =
554 iniFile.
read_float(section.c_str(),
"default_wind_direction", 0,
false);
557 iniFile.
read_float(section.c_str(),
"default_wind_speed", 0,
false);
561 iniFile.
read_float(section.c_str(),
"std_windNoise_phi", 0,
false);
564 iniFile.
read_float(section.c_str(),
"std_windNoise_mod", 0,
false);
568 iniFile.
read_float(section.c_str(),
"advectionFreq", 1,
true);
604 size_t arrow_separation =
615 unsigned int wind_map_size =
620 if (
m_map.size() != wind_map_size)
622 cout <<
" GAS MAP DIMENSIONS DO NOT MATCH WIND MAP " << endl;
627 vector<float> xs, ys;
630 xs.resize(floor((x_max - x_min) / (arrow_separation * resol)));
631 for (cx = 0; cx < xs.size(); cx++)
632 xs[cx] = x_min + arrow_separation * resol * cx;
635 ys.resize(floor((y_max - y_min) / (arrow_separation * resol)));
636 for (cy = 0; cy < ys.size(); cy++)
637 ys[cy] = y_min + arrow_separation * resol * cy;
639 for (cy = 0; cy < ys.size(); cy++)
641 for (cx = 0; cx < xs.size(); cx++)
648 xs[cx], ys[cy], 0, xs[cx] +
scale * cos(dir_xy),
656 windObj->insert(
obj);
665 const double STD_increase_value)
672 for (
size_t it = 0; it <
m_map.size(); it++)
699 const double& STD_increase_value)
708 cout << endl <<
" - At since last simulation = " << At <<
"seconds" << endl;
718 int cell_i_cx, cell_i_cy;
719 float mu_phi, mu_r, mu_modwind;
720 const size_t N =
m_map.size();
724 double* row_sum = (
double*)calloc(N,
sizeof(
double));
729 unsigned int wind_map_size =
734 if (N != wind_map_size)
736 cout <<
" GAS MAP DIMENSIONS DO NOT MATCH WIND INFORMATION " 744 for (i = 0; i < N; i++)
751 cell_i_cx, cell_i_cy);
757 mu_r = mu_modwind * At;
766 vector<TGaussianCell>& cells_to_update =
770 for (
unsigned int ci = 0; ci < cells_to_update.size(); ci++)
772 int final_cx = cell_i_cx + cells_to_update[ci].cx;
773 int final_cy = cell_i_cy + cells_to_update[ci].cy;
775 if ((final_cx >= 0) && (final_cx < (int)
getSizeX()) &&
776 (final_cy >= 0) && (final_cy < (int)
getSizeY()))
778 int final_idx = final_cx + final_cy *
getSizeX();
781 if (cells_to_update[ci].
value != 0.0)
783 A(final_idx, i) = cells_to_update[ci].value;
784 row_sum[final_idx] += cells_to_update[ci].value;
790 cout <<
" - SA matrix computed in " << tictac.
Tac() <<
"s" << endl
793 catch (std::exception& e)
795 cout <<
" ######### EXCEPTION computing Transition Matrix (A) " 798 cout <<
"on cell i= " << i <<
" c=" <<
c << endl << endl;
808 double* new_means = (
double*)calloc(N,
sizeof(
double));
810 double* new_variances = (
double*)calloc(N,
sizeof(
double));
812 for (
size_t it_i = 0; it_i < N; it_i++)
817 for (
size_t it_j = 0; it_j < N; it_j++)
819 if (
m_map[it_j].kf_mean != 0 && A(it_i, it_j) != 0)
821 if (row_sum[it_i] >= 1)
822 new_means[it_i] += (A(it_i, it_j) / row_sum[it_i]) *
825 new_means[it_i] += A(it_i, it_j) *
m_map[it_j].kf_mean;
833 if (row_sum[it_i] < 1)
834 new_variances[it_i] =
835 (1 - row_sum[it_i]) *
838 for (
size_t it_j = 0; it_j < N; it_j++)
840 if (A(it_i, it_j) != 0)
842 if (row_sum[it_i] >= 1)
843 new_variances[it_i] +=
844 (A(it_i, it_j) / row_sum[it_i]) *
848 new_variances[it_i] +=
857 for (
size_t it_i = 0; it_i < N; it_i++)
859 m_map[it_i].kf_mean = new_means[it_i];
863 for (
size_t it_j = 0; it_j < N; it_j++)
874 cout <<
" - Mean&Var updated in " << tictac.
Tac() <<
"s" << endl;
881 catch (std::exception& e)
883 cout <<
" ######### EXCEPTION Updating Covariances ##########\n: " 885 cout <<
"on row i= " << i <<
" column c=" <<
c << endl << endl;
924 cout << endl <<
"---------------------------------" << endl;
925 cout <<
" BUILDING GAUSSIAN WIND WEIGHTS " << endl;
926 cout <<
"---------------------------------" << endl << endl;
939 "Gaussian_Wind_Weights_res(%f)_stdPhi(%f)_stdR(%f).gz",
LUT.
resolution,
951 LUT.
table =
new vector<vector<vector<TGaussianCell>>>(
953 vector<vector<TGaussianCell>>(
LUT.
r_count, vector<TGaussianCell>()));
965 cout <<
"Looking for file: " << filename.c_str() << endl;
970 cout <<
"LookUp table found for this configuration. Loading..." << endl;
976 cout <<
"LookUp table NOT found. Generating table..." << endl;
983 debug_file =
fopen(
"simple_LUT.txt",
"w");
985 debug_file,
" phi_inc = %.4f \n r_inc = %.4f \n",
LUT.
phi_inc,
988 debug_file,
" std_phi = %.4f \n std_r = %.4f \n",
LUT.
std_phi,
990 fprintf(debug_file,
"[ phi ] [ r ] ---> (cx,cy)=Value\n");
991 fprintf(debug_file,
"----------------------------------\n");
995 for (
size_t phi_indx = 0; phi_indx <
LUT.
phi_count; phi_indx++)
1001 for (
size_t r_indx = 0; r_indx <
LUT.
r_count; r_indx++)
1008 fprintf(debug_file,
"\n[%.2f] [%.2f] ---> ", phi,
r);
1037 std::vector<double> vertex_x, vertex_y;
1038 vertex_x.resize(14);
1039 vertex_y.resize(14);
1041 double minBBox_x = 1000;
1042 double maxBBox_x = -1000;
1043 double minBBox_y = 1000;
1044 double maxBBox_y = -1000;
1049 if (std_phi_BBox >
M_PI / 3)
1051 std_phi_BBox =
M_PI / 3;
1059 for (
int sd = (-3); sd <= (3); sd++)
1063 (
r + sr *
LUT.
std_r) * cos(phi + sd * std_phi_BBox);
1064 if (vertex_x[indx] < minBBox_x) minBBox_x = vertex_x[indx];
1065 if (vertex_x[indx] > maxBBox_x) maxBBox_x = vertex_x[indx];
1069 (
r + sr *
LUT.
std_r) * sin(phi + sd * std_phi_BBox);
1070 if (vertex_y[indx] < minBBox_y) minBBox_y = vertex_y[indx];
1071 if (vertex_y[indx] > maxBBox_y) maxBBox_y = vertex_y[indx];
1076 for (
int sd = (3); sd >= (-3); sd--)
1080 (
r + sr *
LUT.
std_r) * cos(phi + sd * std_phi_BBox);
1081 if (vertex_x[indx] < minBBox_x) minBBox_x = vertex_x[indx];
1082 if (vertex_x[indx] > maxBBox_x) maxBBox_x = vertex_x[indx];
1086 (
r + sr *
LUT.
std_r) * sin(phi + sd * std_phi_BBox);
1087 if (vertex_y[indx] < minBBox_y) minBBox_y = vertex_y[indx];
1088 if (vertex_y[indx] > maxBBox_y) maxBBox_y = vertex_y[indx];
1107 int num_cells_affected =
1108 (max_cx - min_cx + 1) * (max_cy - min_cy + 1);
1110 if (num_cells_affected == 1)
1114 gauss_info.
cx = min_cx;
1115 gauss_info.
cy = min_cy;
1116 gauss_info.
value = 1;
1119 LUT_TABLE[phi_indx][r_indx].push_back(gauss_info);
1125 debug_file,
"(%d,%d)=%.4f", gauss_info.
cx,
1126 gauss_info.
cy, gauss_info.
value);
1135 const int BB_x_subcells =
1136 (int)(floor((maxBBox_x - minBBox_x) / subcell_pres) + 1);
1137 const int BB_y_subcells =
1138 (int)(floor((maxBBox_y - minBBox_y) / subcell_pres) + 1);
1140 double subcell_pres_x =
1141 (maxBBox_x - minBBox_x) / BB_x_subcells;
1142 double subcell_pres_y =
1143 (maxBBox_y - minBBox_y) / BB_y_subcells;
1146 std::map<std::pair<int, int>,
float> w_values;
1147 std::map<std::pair<int, int>,
float>
::iterator it;
1150 for (
int scy = 0; scy < BB_y_subcells; scy++)
1152 for (
int scx = 0; scx < BB_x_subcells; scx++)
1156 minBBox_x + (scx + 0.5f) * subcell_pres_x;
1158 minBBox_y + (scy + 0.5f) * subcell_pres_y;
1162 square(subcell_a_x - cell_i_x) +
1163 square(subcell_a_y - cell_i_y));
1164 float phi_ia = atan2(
1165 subcell_a_y - cell_i_y, subcell_a_x - cell_i_x);
1191 (
w * (subcell_pres_x * subcell_pres_y) /
1195 int cell_cx =
static_cast<int>(
1197 int cell_cy =
static_cast<int>(
1202 w_values.find(std::make_pair(cell_cx, cell_cy));
1203 if (it != w_values.end())
1204 w_values[std::make_pair(cell_cx, cell_cy)] +=
w;
1206 w_values[std::make_pair(cell_cx, cell_cy)] =
w;
1213 for (it = w_values.begin(); it != w_values.end(); it++)
1216 (it->second) / sum_w;
1218 if (w_final >= 0.001)
1223 gauss_info.
cx = it->first.first;
1224 gauss_info.
cy = it->first.second;
1225 gauss_info.
value = w_final;
1228 LUT_TABLE[phi_indx][r_indx].push_back(gauss_info);
1234 debug_file,
"(%d,%d)=%.6f ",
1235 gauss_info.
cx, gauss_info.
cy,
1335 if (debug)
fclose(debug_file);
1346 cout <<
"Saving to File ....";
1350 "Gaussian_Wind_Weights_res(%f)_stdPhi(%f)_stdR(%f).gz",
1353 if (!f.fileOpenCorrectly())
1356 cout <<
"WARNING: Gaussian_Wind_Weights file NOT SAVED" << endl;
1375 for (
size_t phi_indx = 0; phi_indx <
LUT.
phi_count; phi_indx++)
1377 for (
size_t r_indx = 0; r_indx <
LUT.
r_count; r_indx++)
1380 size_t N =
LUT_TABLE[phi_indx][r_indx].size();
1383 for (
size_t i = 0; i < N; i++)
1385 f << (float)
LUT_TABLE[phi_indx][r_indx][i].cx;
1386 f << (float)
LUT_TABLE[phi_indx][r_indx][i].cy;
1387 f <<
LUT_TABLE[phi_indx][r_indx][i].value;
1391 cout <<
"DONE" << endl;
1398 <<
"------------------------------------------------------------" 1400 cout <<
"EXCEPTION WHILE SAVING LUT TO FILE" << endl;
1401 cout <<
"Exception = " << e.what() << endl;
1410 cout <<
"Loading from File ....";
1416 "Gaussian_Wind_Weights_res(%f)_stdPhi(%f)_stdR(%f).gz",
1421 cout <<
"WARNING WHILE READING FROM: Gaussian_Wind_Weights" << endl;
1426 unsigned int t_uint;
1442 t_uint = (
unsigned int)t_float;
1452 t_uint = (
unsigned int)t_float;
1458 for (
size_t phi_indx = 0; phi_indx <
LUT.
phi_count; phi_indx++)
1460 for (
size_t r_indx = 0; r_indx <
LUT.
r_count; r_indx++)
1465 N = (size_t)t_float;
1467 for (
size_t i = 0; i < N; i++)
1471 gauss_info.
cx = (int)t_float;
1474 gauss_info.
cy = (int)t_float;
1476 f >> gauss_info.
value;
1479 LUT_TABLE[phi_indx][r_indx].push_back(gauss_info);
1483 cout <<
"DONE" << endl;
1489 <<
"------------------------------------------------------------" 1491 cout <<
"EXCEPTION WHILE LOADING LUT FROM FILE" << endl;
1492 cout <<
"Exception = " << e.what() << endl;
#define ASSERT_EQUAL_(__A, __B)
float min_x
See CGasConcentrationGridMap2D::CGasConcentrationGridMap2D.
void internal_clear() override
Erase all the contents of the map.
double getXMax() const
Returns the "x" coordinate of right side of grid map.
double x() const
Common members of all points & poses classes.
Virtual base for specifying the kind and parameters of one map (normally, to be inserted into mrpt::m...
std::string gasSensorLabel
The label of the CObservationGasSensor used to generate the map.
float sigma
The sigma of the "Parzen"-kernel Gaussian.
void getWindAs3DObject(mrpt::opengl::CSetOfObjects::Ptr &windObj) const
Returns the 3D object representing the wind grid information.
bool read_bool(const std::string §ion, const std::string &name, bool defaultValue, bool failIfNotFound=false) const
Classes for serialization, sockets, ini-file manipulation, streams, list of properties-values, timewatch, extensions to STL.
IMPLEMENTS_SERIALIZABLE(CGasConcentrationGridMap2D, CRandomFieldGridMap2D, mrpt::maps) CGasConcentrationGridMap2D
float read_float(const std::string §ion, const std::string &name, float defaultValue, bool failIfNotFound=false) const
bool enableSaveAs3DObject
(Default=true) If false, calling CMetricMap::getAs3DObject() will have no effects ...
double m_average_normreadings_mean
float KF_defaultCellMeanValue
The default value for the mean of cells' concentration.
int void fclose(FILE *f)
An OS-independent version of fclose.
GLenum GLenum GLenum GLenum GLenum scale
void readFromStream(mrpt::utils::CStream &in, int version) override
Introduces a pure virtual method responsible for loading from a CStream This can not be used directly...
#define THROW_EXCEPTION(msg)
mrpt::utils::CDynamicGrid< double > windGrid_direction
uint16_t enose_id
id for the enose used to generate this map (must be < gasGrid_count)
#define LOADABLEOPTS_DUMP_VAR(variableName, variableType)
Macro for dumping a variable to a stream, within the method "dumpToTextStream(out)" (Variable types a...
This file implements several operations that operate element-wise on individual or pairs of container...
void WriteBuffer(const void *Buffer, size_t Count)
Writes a block of bytes to the stream from Buffer.
bool fileExists(const std::string &fileName)
Test if a given file (or directory) exists.
double getYMin() const
Returns the "y" coordinate of top side of grid map.
mrpt::math::CMatrixD m_cov
The whole covariance matrix, used for the Kalman Filter map representation.
double getXMin() const
Returns the "x" coordinate of left side of grid map.
mrpt::system::TTimeStamp now()
A shortcut for system::getCurrentTime.
size_t getSizeY() const
Returns the vertical size of grid map in cells count.
std::string read_string(const std::string §ion, const std::string &name, const std::string &defaultValue, bool failIfNotFound=false) const
The structure for each e-nose.
TMapRepresentation
The type of map representation to be used, see CRandomFieldGridMap2D for a discussion.
virtual void getAs3DObject(mrpt::opengl::CSetOfObjects::Ptr &outObj) const override
Returns a 3D object representing the map.
TMapGenericParams genericMapParams
Common params to all maps.
mrpt::maps::CGasConcentrationGridMap2D::TInsertionOptions insertionOpts
Observations insertion options.
float cutoffRadius
The cutoff radius for updating cells.
void fill(const T &value)
Fills all the cells with the same value.
TInsertionOptions()
Default values loader.
void Tic()
Starts the stopwatch.
GLsizei GLsizei GLuint * obj
void clear()
Clear the contents of this container.
GLubyte GLubyte GLubyte GLubyte w
void idx2cxcy(const int &idx, int &cx, int &cy) const
Transform a global (linear) cell index value into its corresponding (x,y) cell indexes.
virtual void getAs3DObject(mrpt::opengl::CSetOfObjects::Ptr &outObj) const override
Returns a 3D object representing the map (mean)
void recoverMeanAndCov() const
In the KF2 implementation, takes the auxiliary matrices and from them update the cells' mean and std ...
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.
TMapRepresentation m_mapType
The map representation type of this map, as passed in the constructor.
T * cellByPos(double x, double y)
Returns a pointer to the contents of a cell given by its coordinates, or nullptr if it is out of the ...
int read_int(const std::string §ion, const std::string &name, int defaultValue, bool failIfNotFound=false) const
float KF_observationModelNoise
The sensor model noise (in normalized concentration units).
This base class is used to provide a unified interface to files,memory buffers,..Please see the deriv...
float R_min
Limits for normalization of sensor readings.
This base provides a set of functions for maths stuff.
void dumpToTextStream(mrpt::utils::CStream &out) const override
This method should clearly display all the contents of the structure in textual form, sending it to a CStream.
CGasConcentrationGridMap2D(TMapRepresentation mapType=mrAchim, float x_min=-2, float x_max=2, float y_min=-2, float y_max=2, float resolution=0.1)
Constructor.
double getYMax() const
Returns the "y" coordinate of bottom side of grid map.
static Ptr Create(Args &&... args)
math::TPose3D eNosePoseOnTheRobot
The pose of the sensors on the robot.
float advectionFreq
Indicates if wind information must be used.
#define MRPT_UNUSED_PARAM(a)
Can be used to avoid "not used parameters" warnings from the compiler.
The contents of each cell in a CRandomFieldGridMap2D map.
A helper class that can convert an enum value into its textual representation, and viceversa...
uint16_t gasSensorType
The sensor type for the gas concentration map (0x0000 ->mean of all installed sensors, 0x2600, 0x6810, ...)
#define MRPT_THROW_UNKNOWN_SERIALIZATION_VERSION(__V)
For use in CSerializable implementations.
size_t m_average_normreadings_count
std::vector< TRandomFieldCell > m_map
The cells.
This class implements a high-performance stopwatch.
size_t getSizeX() const
Returns the horizontal size of grid map in cells count.
mrpt::utils::CDynamicGrid< double > windGrid_module
Gridmaps of the wind Direction/Module.
void writeToStream(mrpt::utils::CStream &out, int *getVersion) const override
Introduces a pure virtual method responsible for writing to a CStream.
std::shared_ptr< CSetOfObjects > Ptr
bool simulateAdvection(const double &STD_increase_value)
Implements the transition model of the gasConcentration map using the information of the wind maps...
This namespace contains representation of robot actions and observations.
std::string format(const char *fmt,...) MRPT_printf_format_check(1
A std::string version of C sprintf.
Declares a class derived from "CObservation" that represents a set of readings from gas sensors...
GLsizei const GLchar ** string
T * cellByIndex(unsigned int cx, unsigned int cy)
Returns a pointer to the contents of a cell given by its cell indexes, or nullptr if it is out of the...
std::vector< std::vector< std::vector< TGaussianCell > > > * table
void loadFromConfigFile(const mrpt::utils::CConfigFileBase &source, const std::string §ion) override
This method load the options from a ".ini"-like file or memory-stored string list.
Classes for 2D/3D geometry representation, both of single values and probability density distribution...
bool m_hasToRecoverMeanAndCov
Only for the KF2 implementation.
int fprintf(FILE *fil, const char *format,...) noexcept MRPT_printf_format_check(2
An OS-independent version of fprintf.
mrpt::system::TTimeStamp timeLastSimulated
The timestamp of the last time the advection simulation was executed.
std::string sensorLabel
An arbitrary label that can be used to identify the sensor.
unsigned __int64 uint64_t
double internal_computeObservationLikelihood(const mrpt::obs::CObservation *obs, const mrpt::poses::CPose3D &takenFrom) override
Internal method called by computeObservationLikelihood()
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.
CRandomFieldGridMap2D represents a 2D grid map where each cell is associated one real-valued property...
#define CFileGZOutputStream
Saves data to a file and transparently compress the data using the given compression level...
GLdouble GLdouble GLdouble r
double getResolution() const
Returns the resolution of the grid map.
float KF_covSigma
The "sigma" for the initial covariance value between cells (in meters).
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).
Declares a class that represents any robot's observation.
std::vector< TObservationENose > m_readings
One entry per e-nose on the robot.
mrpt::maps::CGasConcentrationGridMap2D::TMapRepresentation mapType
The kind of map representation (see CGasConcentrationGridMap2D::CGasConcentrationGridMap2D) ...
#define IS_CLASS(ptrObj, class_name)
Evaluates to true if the given pointer to an object (derived from mrpt::utils::CSerializable) is of t...
void jet2rgb(const float color_index, float &r, float &g, float &b)
Computes the RGB color components (range [0,1]) for the corresponding color index in the range [0...
virtual void internal_clear() override
Erase all the contents of the map.
double m_average_normreadings_var
bool build_Gaussian_Wind_Grid()
Builds a LookUp table with the values of the Gaussian Weights result of the wind advection for a spec...
uint16_t KF_W_size
[mrKalmanApproximate] The size of the window of neighbor cells.
double mean(const CONTAINER &v)
Computes the mean value of a vector.
double Tac()
Stops the stopwatch.
GLsizei GLsizei GLchar * source
virtual void increaseUncertainty(const double STD_increase_value)
Increase the kf_std of all cells from the m_map This mehod is usually called by the main_map to simul...
int round(const T value)
Returns the closer integer (int) to x.
void dyngridcommon_writeToStream(mrpt::utils::CStream &out) const
void loadFromConfigFile_map_specific(const mrpt::utils::CConfigFileBase &source, const std::string §ionNamePrefix) override
Load all map-specific params.
FILE * fopen(const char *fileName, const char *mode) noexcept
An OS-independent version of fopen.
mrpt::math::CMatrixD m_stackedCov
The compressed band diagonal matrix for the KF2 implementation.
GLsizei const GLfloat * value
void dumpToTextStream_map_specific(mrpt::utils::CStream &out) const override
CGasConcentrationGridMap2D represents a PDF of gas concentrations over a 2D area. ...
double timeDifference(const mrpt::system::TTimeStamp t_first, const mrpt::system::TTimeStamp t_later)
Returns the time difference from t1 to t2 (positive if t2 is posterior to t1), in seconds...
std::vector< float > readingsVoltage
The set of readings (in volts) from the array of sensors (size of "sensorTypes" is the same that the ...
#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...
This class is a "CSerializable" wrapper for "CMatrixFloat".
bool load_Gaussian_Wind_Grid_From_File()
unsigned __int32 uint32_t
void dyngridcommon_readFromStream(mrpt::utils::CStream &in, bool cast_from_float=false)
static mrpt::maps::CMetricMap * internal_CreateFromMapDefinition(const mrpt::maps::TMetricMapInitializer &def)
float KF_initialCellStd
The initial standard deviation of each cell's concentration (will be stored both at each cell's struc...
EIGEN_STRONG_INLINE double mean() const
Computes the mean of the entire matrix.
float std_windNoise_phi
Frequency for simulating advection (only used.
float default_wind_direction
The std to consider on.
virtual int printf(const char *fmt,...) MRPT_printf_format_check(2
Writes a string to the stream in a textual form.
mrpt::maps::CGasConcentrationGridMap2D::TInsertionOptions insertionOptions
bool internal_insertObservation(const mrpt::obs::CObservation *obs, const mrpt::poses::CPose3D *robotPose=nullptr) override
Internal method called by insertObservation()
struct mrpt::maps::CGasConcentrationGridMap2D::TGaussianWindTable LUT
void insertIndividualReading(const double sensorReading, const mrpt::math::TPoint2D &point, const bool update_map=true, const bool time_invariant=true, const double reading_stddev=.0)
Direct update of the map with a reading in a given position of the map, using the appropriate method ...
bool save_Gaussian_Wind_Grid_To_File()
std::shared_ptr< CArrow > Ptr