38 "CGasConcentrationGridMap2D,gasGrid",
58 sectionNamePrefix +
string(
"_creationOpts");
65 sSectCreation,
"mapType", mapType);
67 insertionOpts.loadFromConfigFile(
68 source, sectionNamePrefix +
string(
"_insertOpts"));
72 std::ostream& out)
const 85 this->insertionOpts.dumpToTextStream(out);
106 #define LUT_TABLE (*(LUT.table)) 112 TMapRepresentation mapType,
float x_min,
float x_max,
float y_min,
113 float y_max,
float resolution)
118 insertionOptions.GMRF_saturate_min = 0;
119 insertionOptions.GMRF_saturate_max = 1;
120 insertionOptions.GMRF_lambdaObsLoss = 1.0;
128 windGrid_module.setSize(x_min, x_max, y_min, y_max, resolution);
129 windGrid_direction.setSize(x_min, x_max, y_min, y_max, resolution);
135 CGasConcentrationGridMap2D::~CGasConcentrationGridMap2D() {}
187 robotPose2D =
CPose2D(*robotPose);
188 robotPose3D = (*robotPose);
222 sensorReading =
math::mean(it->readingsVoltage);
228 for (i = 0; i < it->sensorTypes.size(); i++)
230 if (it->sensorTypes.at(i) ==
235 if (i < it->sensorTypes.size())
237 sensorReading = it->readingsVoltage[i];
241 cout <<
"Sensor especified not found, compute default " 244 sensorReading =
math::mean(it->readingsVoltage);
313 #if MRPT_IS_BIG_ENDIAN 373 vector<TOldCellTypeInVersion1> old_map(
n);
374 in.ReadBuffer(&old_map[0],
sizeof(old_map[0]) * old_map.size());
378 for (
size_t k = 0; k <
n; k++)
381 (old_map[k].w != 0) ? old_map[k].wr : old_map[k].
mean;
383 (old_map[k].w != 0) ? old_map[k].
w : old_map[k].
std;
395 #if MRPT_IS_BIG_ENDIAN 398 m_map[i].dmv_var_mean;
447 gasSensorLabel(
"MCEnose"),
451 windSensorLabel(
"windSensor"),
452 useWindInformation(false),
453 std_windNoise_phi(0.2f),
454 std_windNoise_mod(0.2f),
455 default_wind_direction(0.0f),
456 default_wind_speed(1.0f)
461 std::ostream& out)
const 464 "\n----------- [CGasConcentrationGridMap2D::TInsertionOptions] " 465 "------------ \n\n");
466 out <<
mrpt::format(
"[TInsertionOptions.Common] ------------ \n\n");
467 internal_dumpToTextStream_common(
470 out <<
mrpt::format(
"[TInsertionOptions.GasSpecific] ------------ \n\n");
472 "gasSensorLabel = %s\n",
473 gasSensorLabel.c_str());
475 "enose_id = %u\n", (
unsigned)enose_id);
477 "gasSensorType = %u\n",
478 (
unsigned)gasSensorType);
480 "windSensorLabel = %s\n",
481 windSensorLabel.c_str());
483 "useWindInformation = %u\n", useWindInformation);
486 "advectionFreq = %f\n", advectionFreq);
488 "default_wind_direction = %f\n",
489 default_wind_direction);
491 "default_wind_speed = %f\n", default_wind_speed);
493 "std_windNoise_phi = %f\n", std_windNoise_phi);
495 "std_windNoise_mod = %f\n", std_windNoise_mod);
507 internal_loadFromConfigFile_common(
iniFile, section);
510 gasSensorLabel =
iniFile.read_string(
511 section.c_str(),
"gasSensorLabel",
"Full_MCEnose",
true);
512 enose_id =
iniFile.read_int(section.c_str(),
"enoseID", enose_id);
516 iniFile.read_string(section.c_str(),
"gasSensorType",
"-1",
true);
518 stringstream convert(sensorType_str);
519 convert >> std::hex >> tmpSensorType;
521 if (tmpSensorType >= 0)
524 gasSensorType = tmpSensorType;
528 gasSensorType =
iniFile.read_int(
529 section.c_str(),
"KF_sensorType", gasSensorType,
true);
532 windSensorLabel =
iniFile.read_string(
533 section.c_str(),
"windSensorLabel",
"Full_MCEnose",
true);
537 iniFile.read_bool(section.c_str(),
"useWindInformation",
"false",
true);
540 default_wind_direction =
541 iniFile.read_float(section.c_str(),
"default_wind_direction", 0,
false);
544 iniFile.read_float(section.c_str(),
"default_wind_speed", 0,
false);
548 iniFile.read_float(section.c_str(),
"std_windNoise_phi", 0,
false);
551 iniFile.read_float(section.c_str(),
"std_windNoise_mod", 0,
false);
555 iniFile.read_float(section.c_str(),
"advectionFreq", 1,
true);
591 size_t arrow_separation =
602 unsigned int wind_map_size =
607 if (
m_map.size() != wind_map_size)
609 cout <<
" GAS MAP DIMENSIONS DO NOT MATCH WIND MAP " << endl;
614 vector<float> xs, ys;
617 xs.resize(floor((x_max - x_min) / (arrow_separation * resol)));
618 for (cx = 0; cx < xs.size(); cx++)
619 xs[cx] = x_min + arrow_separation * resol * cx;
622 ys.resize(floor((y_max - y_min) / (arrow_separation * resol)));
623 for (cy = 0; cy < ys.size(); cy++)
624 ys[cy] = y_min + arrow_separation * resol * cy;
626 for (cy = 0; cy < ys.size(); cy++)
628 for (cx = 0; cx < xs.size(); cx++)
635 xs[cx], ys[cy], 0.f, xs[cx] +
scale * (
float)cos(dir_xy),
636 ys[cy] +
scale * (
float)sin(dir_xy), 0.f, 1.15f *
scale,
643 windObj->insert(
obj);
652 const double STD_increase_value)
659 for (
size_t it = 0; it <
m_map.size(); it++)
686 const double& STD_increase_value)
695 cout << endl <<
" - At since last simulation = " << At <<
"seconds" << endl;
705 int cell_i_cx, cell_i_cy;
706 float mu_phi, mu_r, mu_modwind;
707 const size_t N =
m_map.size();
711 double* row_sum = (
double*)calloc(N,
sizeof(
double));
716 unsigned int wind_map_size =
721 if (N != wind_map_size)
723 cout <<
" GAS MAP DIMENSIONS DO NOT MATCH WIND INFORMATION " 731 for (i = 0; i < N; i++)
738 cell_i_cx, cell_i_cy);
744 mu_r = mu_modwind * At;
753 vector<TGaussianCell>& cells_to_update =
757 for (
unsigned int ci = 0; ci < cells_to_update.size(); ci++)
759 int final_cx = cell_i_cx + cells_to_update[ci].cx;
760 int final_cy = cell_i_cy + cells_to_update[ci].cy;
762 if ((final_cx >= 0) && (final_cx < (int)
getSizeX()) &&
763 (final_cy >= 0) && (final_cy < (int)
getSizeY()))
765 int final_idx = final_cx + final_cy *
getSizeX();
768 if (cells_to_update[ci].
value != 0.0)
770 A(final_idx, i) = cells_to_update[ci].value;
771 row_sum[final_idx] += cells_to_update[ci].value;
777 cout <<
" - SA matrix computed in " << tictac.
Tac() <<
"s" << endl
780 catch (std::exception& e)
782 cout <<
" ######### EXCEPTION computing Transition Matrix (A) " 785 cout <<
"on cell i= " << i <<
" c=" <<
c << endl << endl;
795 double* new_means = (
double*)calloc(N,
sizeof(
double));
797 double* new_variances = (
double*)calloc(N,
sizeof(
double));
799 for (
size_t it_i = 0; it_i < N; it_i++)
804 for (
size_t it_j = 0; it_j < N; it_j++)
806 if (
m_map[it_j].kf_mean != 0 && A(it_i, it_j) != 0)
808 if (row_sum[it_i] >= 1)
809 new_means[it_i] += (A(it_i, it_j) / row_sum[it_i]) *
812 new_means[it_i] += A(it_i, it_j) *
m_map[it_j].kf_mean;
820 if (row_sum[it_i] < 1)
821 new_variances[it_i] =
822 (1 - row_sum[it_i]) *
825 for (
size_t it_j = 0; it_j < N; it_j++)
827 if (A(it_i, it_j) != 0)
829 if (row_sum[it_i] >= 1)
830 new_variances[it_i] +=
831 (A(it_i, it_j) / row_sum[it_i]) *
835 new_variances[it_i] +=
844 for (
size_t it_i = 0; it_i < N; it_i++)
846 m_map[it_i].kf_mean = new_means[it_i];
850 for (
size_t it_j = 0; it_j < N; it_j++)
861 cout <<
" - Mean&Var updated in " << tictac.
Tac() <<
"s" << endl;
868 catch (std::exception& e)
870 cout <<
" ######### EXCEPTION Updating Covariances ##########\n: " 872 cout <<
"on row i= " << i <<
" column c=" <<
c << endl << endl;
911 cout << endl <<
"---------------------------------" << endl;
912 cout <<
" BUILDING GAUSSIAN WIND WEIGHTS " << endl;
913 cout <<
"---------------------------------" << endl << endl;
926 "Gaussian_Wind_Weights_res(%f)_stdPhi(%f)_stdR(%f).gz",
LUT.
resolution,
938 LUT.
table =
new vector<vector<vector<TGaussianCell>>>(
940 vector<vector<TGaussianCell>>(
LUT.
r_count, vector<TGaussianCell>()));
952 cout <<
"Looking for file: " << filename.c_str() << endl;
957 cout <<
"LookUp table found for this configuration. Loading..." << endl;
963 cout <<
"LookUp table NOT found. Generating table..." << endl;
970 debug_file =
fopen(
"simple_LUT.txt",
"w");
972 debug_file,
" phi_inc = %.4f \n r_inc = %.4f \n",
LUT.
phi_inc,
975 debug_file,
" std_phi = %.4f \n std_r = %.4f \n",
LUT.
std_phi,
977 fprintf(debug_file,
"[ phi ] [ r ] ---> (cx,cy)=Value\n");
978 fprintf(debug_file,
"----------------------------------\n");
982 for (
size_t phi_indx = 0; phi_indx <
LUT.
phi_count; phi_indx++)
988 for (
size_t r_indx = 0; r_indx <
LUT.
r_count; r_indx++)
995 fprintf(debug_file,
"\n[%.2f] [%.2f] ---> ", phi,
r);
1024 std::vector<double> vertex_x, vertex_y;
1025 vertex_x.resize(14);
1026 vertex_y.resize(14);
1028 double minBBox_x = 1000;
1029 double maxBBox_x = -1000;
1030 double minBBox_y = 1000;
1031 double maxBBox_y = -1000;
1036 if (std_phi_BBox >
M_PI / 3)
1038 std_phi_BBox =
M_PI / 3;
1046 for (
int sd = (-3); sd <= (3); sd++)
1050 (
r + sr *
LUT.
std_r) * cos(phi + sd * std_phi_BBox);
1051 if (vertex_x[indx] < minBBox_x) minBBox_x = vertex_x[indx];
1052 if (vertex_x[indx] > maxBBox_x) maxBBox_x = vertex_x[indx];
1056 (
r + sr *
LUT.
std_r) * sin(phi + sd * std_phi_BBox);
1057 if (vertex_y[indx] < minBBox_y) minBBox_y = vertex_y[indx];
1058 if (vertex_y[indx] > maxBBox_y) maxBBox_y = vertex_y[indx];
1063 for (
int sd = (3); sd >= (-3); sd--)
1067 (
r + sr *
LUT.
std_r) * cos(phi + sd * std_phi_BBox);
1068 if (vertex_x[indx] < minBBox_x) minBBox_x = vertex_x[indx];
1069 if (vertex_x[indx] > maxBBox_x) maxBBox_x = vertex_x[indx];
1073 (
r + sr *
LUT.
std_r) * sin(phi + sd * std_phi_BBox);
1074 if (vertex_y[indx] < minBBox_y) minBBox_y = vertex_y[indx];
1075 if (vertex_y[indx] > maxBBox_y) maxBBox_y = vertex_y[indx];
1094 int num_cells_affected =
1095 (max_cx - min_cx + 1) * (max_cy - min_cy + 1);
1097 if (num_cells_affected == 1)
1101 gauss_info.
cx = min_cx;
1102 gauss_info.
cy = min_cy;
1103 gauss_info.
value = 1;
1106 LUT_TABLE[phi_indx][r_indx].push_back(gauss_info);
1112 debug_file,
"(%d,%d)=%.4f", gauss_info.
cx,
1113 gauss_info.
cy, gauss_info.
value);
1122 const int BB_x_subcells =
1123 (int)(floor((maxBBox_x - minBBox_x) / subcell_pres) + 1);
1124 const int BB_y_subcells =
1125 (int)(floor((maxBBox_y - minBBox_y) / subcell_pres) + 1);
1127 double subcell_pres_x =
1128 (maxBBox_x - minBBox_x) / BB_x_subcells;
1129 double subcell_pres_y =
1130 (maxBBox_y - minBBox_y) / BB_y_subcells;
1133 std::map<std::pair<int, int>,
float> w_values;
1134 std::map<std::pair<int, int>,
float>
::iterator it;
1137 for (
int scy = 0; scy < BB_y_subcells; scy++)
1139 for (
int scx = 0; scx < BB_x_subcells; scx++)
1143 minBBox_x + (scx + 0.5f) * subcell_pres_x;
1145 minBBox_y + (scy + 0.5f) * subcell_pres_y;
1149 square(subcell_a_x - cell_i_x) +
1150 square(subcell_a_y - cell_i_y));
1151 float phi_ia = atan2(
1152 subcell_a_y - cell_i_y, subcell_a_x - cell_i_x);
1178 (
w * (subcell_pres_x * subcell_pres_y) /
1182 int cell_cx =
static_cast<int>(
1184 int cell_cy =
static_cast<int>(
1189 w_values.find(std::make_pair(cell_cx, cell_cy));
1190 if (it != w_values.end())
1191 w_values[std::make_pair(cell_cx, cell_cy)] +=
w;
1193 w_values[std::make_pair(cell_cx, cell_cy)] =
w;
1200 for (it = w_values.begin(); it != w_values.end(); it++)
1203 (it->second) / sum_w;
1205 if (w_final >= 0.001)
1210 gauss_info.
cx = it->first.first;
1211 gauss_info.
cy = it->first.second;
1212 gauss_info.
value = w_final;
1215 LUT_TABLE[phi_indx][r_indx].push_back(gauss_info);
1221 debug_file,
"(%d,%d)=%.6f ",
1222 gauss_info.
cx, gauss_info.
cy,
1322 if (debug)
fclose(debug_file);
1333 cout <<
"Saving to File ....";
1337 "Gaussian_Wind_Weights_res(%f)_stdPhi(%f)_stdR(%f).gz",
1342 cout <<
"WARNING: Gaussian_Wind_Weights file NOT SAVED" << endl;
1362 for (
size_t phi_indx = 0; phi_indx <
LUT.
phi_count; phi_indx++)
1364 for (
size_t r_indx = 0; r_indx <
LUT.
r_count; r_indx++)
1367 size_t N =
LUT_TABLE[phi_indx][r_indx].size();
1370 for (
size_t i = 0; i < N; i++)
1372 f << (float)
LUT_TABLE[phi_indx][r_indx][i].cx;
1373 f << (float)
LUT_TABLE[phi_indx][r_indx][i].cy;
1374 f <<
LUT_TABLE[phi_indx][r_indx][i].value;
1378 cout <<
"DONE" << endl;
1384 <<
"------------------------------------------------------------" 1386 cout <<
"EXCEPTION WHILE SAVING LUT TO FILE" << endl;
1387 cout <<
"Exception = " << e.what() << endl;
1395 cout <<
"Loading from File ....";
1401 "Gaussian_Wind_Weights_res(%f)_stdPhi(%f)_stdR(%f).gz",
1405 cout <<
"WARNING WHILE READING FROM: Gaussian_Wind_Weights" << endl;
1411 unsigned int t_uint;
1427 t_uint = (
unsigned int)t_float;
1437 t_uint = (
unsigned int)t_float;
1443 for (
size_t phi_indx = 0; phi_indx <
LUT.
phi_count; phi_indx++)
1445 for (
size_t r_indx = 0; r_indx <
LUT.
r_count; r_indx++)
1450 N = (size_t)t_float;
1452 for (
size_t i = 0; i < N; i++)
1456 gauss_info.
cx = (int)t_float;
1459 gauss_info.
cy = (int)t_float;
1461 f >> gauss_info.
value;
1464 LUT_TABLE[phi_indx][r_indx].push_back(gauss_info);
1468 cout <<
"DONE" << endl;
1474 <<
"------------------------------------------------------------" 1476 cout <<
"EXCEPTION WHILE LOADING LUT FROM FILE" << endl;
1477 cout <<
"Exception = " << e.what() << endl;
float min_x
See CGasConcentrationGridMap2D::CGasConcentrationGridMap2D.
void internal_clear() override
Erase all the contents of the map.
double Tac() noexcept
Stops the stopwatch.
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...
void serializeTo(mrpt::serialization::CArchive &out) const override
Pure virtual method for writing (serializing) to an abstract archive.
std::vector< TRandomFieldCell > m_map
The cells.
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.
double getYMax() const
Returns the "y" coordinate of bottom side of grid map.
void fill(const T &value)
Fills all the cells with the same value.
IMPLEMENTS_SERIALIZABLE(CGasConcentrationGridMap2D, CRandomFieldGridMap2D, mrpt::maps) CGasConcentrationGridMap2D
#define THROW_EXCEPTION(msg)
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
double getResolution() const
Returns the resolution of the grid map.
uint16_t enose_id
id for the enose used to generate this map (must be < gasGrid_count)
This file implements several operations that operate element-wise on individual or pairs of container...
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.
A high-performance stopwatch, with typical resolution of nanoseconds.
mrpt::math::CMatrixD m_cov
The whole covariance matrix, used for the Kalman Filter map representation.
mrpt::system::TTimeStamp now()
A shortcut for system::getCurrentTime.
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.
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.
void WriteBuffer(const void *Buffer, size_t Count)
Writes a block of bytes to the stream from Buffer.
void dyngridcommon_writeToStream(STREAM &out) const
mrpt::maps::CGasConcentrationGridMap2D::TInsertionOptions insertionOpts
Observations insertion options.
float cutoffRadius
The cutoff radius for updating cells.
TInsertionOptions()
Default values loader.
GLsizei GLsizei GLuint * obj
bool fileOpenCorrectly() const
Returns true if the file was open without errors.
GLubyte GLubyte GLubyte GLubyte w
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 ...
TMapRepresentation m_mapType
The map representation type of this map, as passed in the constructor.
#define MRPT_THROW_UNKNOWN_SERIALIZATION_VERSION(__V)
For use in CSerializable implementations.
CArchiveStreamBase< STREAM > archiveFrom(STREAM &s)
Helper function to create a templatized wrapper CArchive object for a: MRPT's CStream, std::istream, std::ostream, std::stringstream
T square(const T x)
Inline function for the square of a number.
void serializeFrom(mrpt::serialization::CArchive &in, uint8_t serial_version) override
Pure virtual method for reading (deserializing) from an abstract archive.
float KF_observationModelNoise
The sensor model noise (in normalized concentration units).
#define ASSERT_(f)
Defines an assertion mechanism.
float R_min
Limits for normalization of sensor readings.
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 getXMin() const
Returns the "x" coordinate of left side of grid map.
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.
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.
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...
#define ASSERT_EQUAL_(__A, __B)
Assert comparing two values, reporting their actual values upon failure.
The contents of each cell in a CRandomFieldGridMap2D map.
uint16_t gasSensorType
The sensor type for the gas concentration map (0x0000 ->mean of all installed sensors, 0x2600, 0x6810, ...)
size_t m_average_normreadings_count
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 ...
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.
string iniFile(myDataDir+string("benchmark-options.ini"))
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...
Declares a class derived from "CObservation" that represents a set of readings from gas sensors...
size_t getSizeX() const
Returns the horizontal size of grid map in cells count.
void dyngridcommon_readFromStream(STREAM &in, bool cast_from_float=false)
GLsizei const GLchar ** string
std::vector< std::vector< std::vector< TGaussianCell > > > * table
mrpt::containers::CDynamicGrid< double > windGrid_module
Gridmaps of the wind Direction/Module.
Classes for 2D/3D geometry representation, both of single values and probability density distribution...
bool m_hasToRecoverMeanAndCov
Only for the KF2 implementation.
size_t getSizeY() const
Returns the vertical size of grid map in cells count.
#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.
mrpt::system::TTimeStamp timeLastSimulated
The timestamp of the last time the advection simulation was executed.
#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...
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...
Virtual base class for "archives": classes abstracting I/O streams.
GLdouble GLdouble GLdouble r
void loadFromConfigFile_map_specific(const mrpt::config::CConfigFileBase &source, const std::string §ionNamePrefix) override
Load all map-specific params.
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.
std::string format(const char *fmt,...) MRPT_printf_format_check(1
A std::string version of C sprintf.
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::rtti::CObject) is of the give...
virtual void internal_clear() override
Erase all the contents of the map.
void dumpToTextStream_map_specific(std::ostream &out) const override
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.
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...
double getXMax() const
Returns the "x" coordinate of right side of grid map.
mrpt::containers::CDynamicGrid< double > windGrid_direction
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
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 ...
void idx2cxcy(const int &idx, int &cx, int &cy) const
Transform a global (linear) cell index value into its corresponding (x,y) cell indexes.
Saves data to a file and transparently compress the data using the given compression level...
void Tic() noexcept
Starts the stopwatch.
This class is a "CSerializable" wrapper for "CMatrixFloat".
bool load_Gaussian_Wind_Grid_From_File()
unsigned __int32 uint32_t
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.
static mrpt::maps::CMetricMap * internal_CreateFromMapDefinition(const mrpt::maps::TMetricMapInitializer &def)
void clear()
Clear the contents of this container.
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.
mrpt::maps::CGasConcentrationGridMap2D::TInsertionOptions insertionOptions
uint8_t serializeGetVersion() const override
Must return the current versioning number of the object.
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()
#define MRPT_UNUSED_PARAM(a)
Determines whether this is an X86 or AMD64 platform.
int round(const T value)
Returns the closer integer (int) to x.