37 unsigned int decimation,
38 float angleNoiseStd )
const 48 CPose2D sensorPose(sensorPose3D);
56 const float free_thres = 1.0f - threshold;
58 for (
size_t i=0;i<N;i+=decimation,A+=AA*decimation)
63 sensorPose.
x(),sensorPose.
y(),A,
66 noiseStd, angleNoiseStd );
79 float angleNoiseStd)
const 81 const float free_thres = 1.0f - threshold;
94 float min_detected_obs=0;
95 for (
size_t i=0;i<nRays;i++, direction+=Adir )
100 sensorAbsolutePose.
x(), sensorAbsolutePose.
y(), direction,
103 rangeNoiseStd, angleNoiseStd );
105 if (valid && (sim_rang<min_detected_obs || !i))
106 min_detected_obs = sim_rang;
109 itR->sensedDistance = min_detected_obs;
114 const double start_x,
const double start_y,
const double angle_direction,
115 float &out_range,
bool &out_valid,
116 const double max_range_meters,
117 const float threshold_free,
118 const double noiseStd,
const double angleNoiseStd )
const 125 ::sincos(A_, &Ary,&Arx);
127 const double Arx = cos(A_);
128 const double Ary = sin(A_);
133 unsigned int ray_len=0;
136 #define INTPRECNUMBIT 10 137 #define int_x2idx(_X) (_X>>INTPRECNUMBIT) 138 #define int_y2idx(_Y) (_Y>>INTPRECNUMBIT) 147 const cellType threshold_free_int = p2l(threshold_free);
151 x<static_cast<int>(size_x) &&
y<static_cast<int>(size_y) && (hitCellOcc_int=map[
x+
y*size_x])>threshold_free_int &&
152 ray_len<max_ray_len )
162 if (abs(hitCellOcc_int)<=1 || static_cast<unsigned>(
x)>=size_x || static_cast<unsigned>(
y)>=size_y )
165 out_range = max_range_meters;
169 out_range = RAYTRACE_STEP_SIZE_IN_CELL_UNITS*ray_len*resolution;
170 out_valid = (ray_len<max_ray_len);
172 if (noiseStd>0 && out_valid)
179 method(sumUnscented),
180 UT_alpha(0.99), UT_kappa(.0), UT_beta(2.0),
214 const CPose2D sensorPose(sensorPose3D);
217 y_scanRanges.resize(N);
230 sensorPose.
x(),sensorPose.
y(),A,
245 simulData.
grid =
this;
246 simulData.
params = &in_params;
273 throw std::runtime_error(
"[laserScanSimulatorWithUncertainty] Unknown `method` value");
break;
283 for (
unsigned i=0;i<in_params.
nRays;i++) {
const COccupancyGridMap2D::TLaserSimulUncertaintyParams * params
mrpt::poses::CPosePDFGaussian robotPose
The robot pose Gaussian, in map coordinates. Recall that sensor pose relative to this robot pose must...
A namespace of pseudo-random numbers genrators of diferent distributions.
double x() const
Common members of all points & poses classes.
Declares a class derived from "CObservation" that encapsules a single range measurement, and associated parameters.
Classes for serialization, sockets, ini-file manipulation, streams, list of properties-values, timewatch, extensions to STL.
CPose2D mean
The mean value.
float threshold
(Default: 0.6f) The minimum occupancy threshold to consider a cell to be occupied ...
static void func_laserSimul_callback(const Eigen::Vector3d &x_pose, const TFunctorLaserSimulData &fixed_param, Eigen::VectorXd &y_scanRanges)
float sensorConeApperture
Cone aperture of each ultrasonic beam, in radians.
mrpt::obs::CObservation2DRangeScanWithUncertainty scanWithUncert
The scan + its uncertainty.
mrpt::math::CVectorDouble getAsVectorVal() const
Return the pose or point as a 1xN vector with all the components (see derived classes for each implem...
mrpt::poses::CPose3D sensorPose
(Default: at origin) The 6D pose of the sensor on the robot at the moment of starting the scan...
Eigen::VectorXd rangesMean
The same ranges than in rangeScan.scan[], for convenience as an Eigen container, and with double prec...
void setScanRange(const size_t i, const float val)
float resolution
Cell size, i.e. resolution of the grid map.
Output params for laserScanSimulatorWithUncertainty()
Montecarlo-based estimation.
BASE_IMPEXP CRandomGenerator randomGenerator
A static instance of a CRandomGenerator class, for use in single-thread applications.
void laserScanSimulator(mrpt::obs::CObservation2DRangeScan &inout_Scan, const mrpt::poses::CPose2D &robotPose, float threshold=0.6f, size_t N=361, float noiseStd=0, unsigned int decimation=1, float angleNoiseStd=mrpt::utils::DEG2RAD(0)) const
Simulates a laser range scan into the current grid map.
CObservation2DRangeScan rangeScan
The observation with the mean ranges in the scan field.
bool rightToLeft
(Default: true) The scanning direction: true=counterclockwise; false=clockwise
const COccupancyGridMap2D * grid
mrpt::math::CMatrixDouble33 cov
The 3x3 covariance matrix.
double drawGaussian1D_normalized(double *likelihood=NULL)
Generate a normalized (mean=0, std=1) normally distributed sample.
float maxRange
The maximum range allowed by the device, in meters (e.g. 80m, 50m,...)
TLaserSimulUncertaintyParams()
size_t MC_samples
[sumMonteCarlo] MonteCarlo parameter: number of samples (Default: 10)
float aperture
(Default: M_PI) The "aperture" or field-of-view of the range finder, in radians (typically M_PI = 180...
This namespace contains representation of robot actions and observations.
void sonarSimulator(mrpt::obs::CObservationRange &inout_observation, const mrpt::poses::CPose2D &robotPose, float threshold=0.5f, float rangeNoiseStd=0.f, float angleNoiseStd=mrpt::utils::DEG2RAD(0.f)) const
Simulates the observations of a sonar rig into the current grid map.
double UT_beta
[sumUnscented] UT parameters. Defaults: alpha=0.99, kappa=0, betta=2.0
unsigned int decimation
(Default: 1) The rays that will be simulated are at indexes: 0, D, 2D, 3D,...
Classes for 2D/3D geometry representation, both of single values and probability density distribution...
void laserScanSimulatorWithUncertainty(const TLaserSimulUncertaintyParams &in_params, TLaserSimulUncertaintyResult &out_results) const
Like laserScanSimulatorWithUncertainty() (see it for a discussion of most parameters) but taking into...
TLaserSimulUncertaintyResult()
A class for storing an occupancy grid map.
This is the global namespace for all Mobile Robot Programming Toolkit (MRPT) libraries.
A "CObservation"-derived class that represents a 2D range scan measurement (typically from a laser sc...
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).
Input params for laserScanSimulatorWithUncertainty()
void simulateScanRay(const double x, const double y, const double angle_direction, float &out_range, bool &out_valid, const double max_range_meters, const float threshold_free=0.4f, const double noiseStd=.0, const double angleNoiseStd=.0) const
Simulate just one "ray" in the grid map.
void resizeScan(const size_t len)
Resizes all data vectors to allocate a given number of scan rays.
const double & phi() const
Get the phi angle of the 2D pose (in radians)
TLaserSimulUncertaintyMethod method
(Default: sumMonteCarlo) Select the method to do the uncertainty propagation
Eigen::MatrixXd rangesCovar
The covariance matrix for all the ranges in rangeScan.scan[].
float aperture
The "aperture" or field-of-view of the range finder, in radians (typically M_PI = 180 degrees)...
int round(const T value)
Returns the closer integer (int) to x.
static double RAYTRACE_STEP_SIZE_IN_CELL_UNITS
(Default:1.0) Can be set to <1 if a more fine raytracing is needed in sonarSimulator() and laserScanS...
std::deque< TMeasurement >::iterator iterator
float maxRange
(Default: 80) The maximum range allowed by the device, in meters (e.g. 80m, 50m,...)
Performs an unscented transform.
int16_t cellType
The type of the map cells:
mrpt::poses::CPose3D sensorPose
The 6D pose of the sensor on the robot at the moment of starting the scan.
bool rightToLeft
The scanning direction: true=counterclockwise; false=clockwise.
void setScanRangeValidity(const size_t i, const bool val)