Go to the documentation of this file.
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);
235 if (i < it->sensorTypes.size())
241 cout <<
"Sensor especified not found, compute default "
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 std_windNoise_phi
Frequency for simulating advection (only used.
std::vector< TObservationENose > m_readings
One entry per e-nose on the robot.
size_t getSizeY() const
Returns the vertical size of grid map in cells count.
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 ...
std::string sensorLabel
An arbitrary label that can be used to identify the sensor.
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.
void loadFromConfigFile_map_specific(const mrpt::config::CConfigFileBase &source, const std::string §ionNamePrefix) override
Load all map-specific params.
virtual void getAs3DObject(mrpt::opengl::CSetOfObjects::Ptr &outObj) const override
Returns a 3D object representing the map.
TMapRepresentation m_mapType
The map representation type of this map, as passed in the constructor.
double getYMin() const
Returns the "y" coordinate of top side of grid map.
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.
CGasConcentrationGridMap2D represents a PDF of gas concentrations over a 2D area.
void clear()
Clear the contents of this container.
int void fclose(FILE *f)
An OS-independent version of fclose.
#define ASSERT_EQUAL_(__A, __B)
Assert comparing two values, reporting their actual values upon failure.
mrpt::math::CMatrixD m_stackedCov
The compressed band diagonal matrix for the KF2 implementation.
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.
A high-performance stopwatch, with typical resolution of nanoseconds.
#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...
bool enableSaveAs3DObject
(Default=true) If false, calling CMetricMap::getAs3DObject() will have no effects
IMPLEMENTS_SERIALIZABLE(CGasConcentrationGridMap2D, CRandomFieldGridMap2D, mrpt::maps) CGasConcentrationGridMap2D
uint8_t serializeGetVersion() const override
Must return the current versioning number of the object.
void serializeTo(mrpt::serialization::CArchive &out) const override
Pure virtual method for writing (serializing) to an abstract archive.
double getXMax() const
Returns the "x" coordinate of right side of grid map.
float KF_observationModelNoise
The sensor model noise (in normalized concentration units).
double mean(const CONTAINER &v)
Computes the mean value of a vector.
std::vector< std::vector< std::vector< TGaussianCell > > > * table
mrpt::maps::CGasConcentrationGridMap2D::TMapRepresentation mapType
The kind of map representation (see CGasConcentrationGridMap2D::CGasConcentrationGridMap2D)
double m_average_normreadings_var
#define MAP_DEFINITION_REGISTER(_CLASSNAME_STRINGS, _CLASSNAME_WITH_NS)
Registers one map class into TMetricMapInitializer factory.
GLsizei GLsizei GLuint * obj
mrpt::system::TTimeStamp now()
A shortcut for system::getCurrentTime.
#define MRPT_UNUSED_PARAM(a)
Determines whether this is an X86 or AMD64 platform.
float R_min
Limits for normalization of sensor readings.
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 m_hasToRecoverMeanAndCov
Only for the KF2 implementation.
uint16_t enose_id
id for the enose used to generate this map (must be < gasGrid_count)
void getWindAs3DObject(mrpt::opengl::CSetOfObjects::Ptr &windObj) const
Returns the 3D object representing the wind grid information.
mrpt::containers::CDynamicGrid< double > windGrid_module
Gridmaps of the wind Direction/Module.
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 ...
This is the global namespace for all Mobile Robot Programming Toolkit (MRPT) libraries.
void dumpToTextStream_map_specific(std::ostream &out) const override
GLubyte GLubyte GLubyte GLubyte w
void dumpToTextStream(std::ostream &out) const override
This method should clearly display all the contents of the structure in textual form,...
Virtual base for specifying the kind and parameters of one map (normally, to be inserted into mrpt::m...
static mrpt::maps::CMetricMap * internal_CreateFromMapDefinition(const mrpt::maps::TMetricMapInitializer &def)
TMapGenericParams genericMapParams
Common params to all maps.
float KF_covSigma
The "sigma" for the initial covariance value between cells (in meters).
#define THROW_EXCEPTION(msg)
#define ASSERT_(f)
Defines an assertion mechanism.
T square(const T x)
Inline function for the square of a number.
Classes for 2D/3D geometry representation, both of single values and probability density distribution...
bool fileExists(const std::string &fileName)
Test if a given file (or directory) exists.
struct mrpt::maps::CGasConcentrationGridMap2D::TGaussianWindTable LUT
std::vector< TRandomFieldCell > m_map
The cells
std::vector< int > sensorTypes
The kind of sensors in the array (size of "sensorTypes" is the same that the size of "readingsVoltage...
float KF_initialCellStd
The initial standard deviation of each cell's concentration (will be stored both at each cell's struc...
This namespace contains representation of robot actions and observations.
Virtual base class for "archives": classes abstracting I/O streams.
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...
GLsizei GLsizei GLchar * source
double Tac() noexcept
Stops the stopwatch.
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,...
float sigma
The sigma of the "Parzen"-kernel Gaussian.
double getXMin() const
Returns the "x" coordinate of left side of grid map.
virtual void internal_clear() override
Erase all the contents of the map.
GLdouble GLdouble GLdouble r
std::vector< float > readingsVoltage
The set of readings (in volts) from the array of sensors (size of "sensorTypes" is the same that the ...
Declares a virtual base class for all metric maps storage classes.
math::TPose3D eNosePoseOnTheRobot
The pose of the sensors on the robot.
void WriteBuffer(const void *Buffer, size_t Count)
Writes a block of bytes to the stream from Buffer.
size_t getSizeX() const
Returns the horizontal size of grid map in cells count.
float advectionFreq
Indicates if wind information must be used.
This class is a "CSerializable" wrapper for "CMatrixFloat".
int round(const T value)
Returns the closer integer (int) to x.
This class allows loading and storing values and vectors of different types from a configuration text...
std::string format(const char *fmt,...) MRPT_printf_format_check(1
A std::string version of C sprintf.
Saves data to a file and transparently compress the data using the given compression level.
A class used to store a 2D pose, including the 2D coordinate point and a heading (phi) angle.
float min_x
See CGasConcentrationGridMap2D::CGasConcentrationGridMap2D.
bool load_Gaussian_Wind_Grid_From_File()
double x() const
Common members of all points & poses classes.
A class used to store a 3D pose (a 3D translation + a rotation in 3D).
double getYMax() const
Returns the "y" coordinate of bottom side of grid map.
TMapRepresentation
The type of map representation to be used, see CRandomFieldGridMap2D for a discussion.
string iniFile(myDataDir+string("benchmark-options.ini"))
#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...
unsigned __int64 uint64_t
bool save_Gaussian_Wind_Grid_To_File()
uint16_t KF_W_size
[mrKalmanApproximate] The size of the window of neighbor cells.
double getResolution() const
Returns the resolution of the grid map.
mrpt::maps::CGasConcentrationGridMap2D::TInsertionOptions insertionOpts
Observations insertion options.
void Tic() noexcept
Starts the stopwatch.
double m_average_normreadings_mean
#define LOADABLEOPTS_DUMP_VAR(variableName, variableType)
Macro for dumping a variable to a stream, within the method "dumpToTextStream(out)" (Variable types a...
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
The structure for each e-nose.
void dyngridcommon_writeToStream(STREAM &out) const
mrpt::maps::CGasConcentrationGridMap2D::TInsertionOptions insertionOptions
GLenum GLenum GLenum GLenum GLenum scale
Declares a class derived from "CObservation" that represents a set of readings from gas sensors.
void idx2cxcy(const int &idx, int &cx, int &cy) const
Transform a global (linear) cell index value into its corresponding (x,y) cell indexes.
bool fileOpenCorrectly() const
Returns true if the file was open without errors.
static Ptr Create(Args &&... args)
bool internal_insertObservation(const mrpt::obs::CObservation *obs, const mrpt::poses::CPose3D *robotPose=nullptr) override
Internal method called by insertObservation()
int fprintf(FILE *fil, const char *format,...) noexcept MRPT_printf_format_check(2
An OS-independent version of fprintf.
CArchiveStreamBase< STREAM > archiveFrom(STREAM &s)
Helper function to create a templatized wrapper CArchive object for a: MRPT's CStream,...
void fill(const T &value)
Fills all the cells with the same value.
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...
void dyngridcommon_readFromStream(STREAM &in, bool cast_from_float=false)
uint16_t gasSensorType
The sensor type for the gas concentration map (0x0000 ->mean of all installed sensors,...
void internal_clear() override
Erase all the contents of the map.
CRandomFieldGridMap2D represents a 2D grid map where each cell is associated one real-valued property...
GLsizei const GLfloat * value
EIGEN_STRONG_INLINE double mean() const
Computes the mean of the entire matrix.
mrpt::containers::CDynamicGrid< double > windGrid_direction
Declares a class that represents any robot's observation.
This base provides a set of functions for maths stuff.
FILE * fopen(const char *fileName, const char *mode) noexcept
An OS-independent version of fopen.
float default_wind_direction
The std to consider on.
GLsizei const GLchar ** string
mrpt::system::TTimeStamp timeLastSimulated
The timestamp of the last time the advection simulation was executed.
void serializeFrom(mrpt::serialization::CArchive &in, uint8_t serial_version) override
Pure virtual method for reading (deserializing) from an abstract archive.
std::string gasSensorLabel
The label of the CObservationGasSensor used to generate the map.
The contents of each cell in a CRandomFieldGridMap2D map.
mrpt::math::CMatrixD m_cov
The whole covariance matrix, used for the Kalman Filter map representation.
float cutoffRadius
The cutoff radius for updating cells.
#define MRPT_THROW_UNKNOWN_SERIALIZATION_VERSION(__V)
For use in CSerializable implementations.
bool build_Gaussian_Wind_Grid()
Builds a LookUp table with the values of the Gaussian Weights result of the wind advection for a spec...
TInsertionOptions()
Default values loader.
unsigned __int32 uint32_t
size_t m_average_normreadings_count
double internal_computeObservationLikelihood(const mrpt::obs::CObservation *obs, const mrpt::poses::CPose3D &takenFrom) override
Internal method called by computeObservationLikelihood()
float KF_defaultCellMeanValue
The default value for the mean of cells' concentration.
Page generated by Doxygen 1.8.17 for MRPT 1.9.9 Git: ad3a9d8ae Tue May 1 23:10:22 2018 -0700 at mié 12 jul 2023 10:03:34 CEST | |