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