32 float threshold,
size_t N,
float noiseStd,
unsigned int decimation,
33 float angleNoiseStd)
const 43 CPose2D sensorPose(sensorPose3D);
48 double A = sensorPose.
phi() +
53 const float free_thres = 1.0f - threshold;
55 for (
size_t i = 0; i < N; i += decimation, A += AA * decimation)
60 sensorPose.
x(), sensorPose.
y(), A, out_range, valid,
61 inout_Scan.
maxRange, free_thres, noiseStd, angleNoiseStd);
71 float threshold,
float rangeNoiseStd,
float angleNoiseStd)
const 73 const float free_thres = 1.0f - threshold;
76 itR != inout_observation.
end(); ++itR)
78 const CPose2D sensorAbsolutePose =
87 double direction = sensorAbsolutePose.
phi() -
91 float min_detected_obs = 0;
92 for (
size_t i = 0; i < nRays; i++, direction += Adir)
97 sensorAbsolutePose.
x(), sensorAbsolutePose.
y(), direction,
99 free_thres, rangeNoiseStd, angleNoiseStd);
101 if (valid && (sim_rang < min_detected_obs || !i))
102 min_detected_obs = sim_rang;
105 itR->sensedDistance = min_detected_obs;
110 const double start_x,
const double start_y,
const double angle_direction,
111 float& out_range,
bool& out_valid,
const double max_range_meters,
112 const float threshold_free,
const double noiseStd,
113 const double angleNoiseStd)
const 124 ::sincos(A_, &Ary, &Arx);
126 const double Arx = cos(A_);
127 const double Ary = sin(A_);
131 const unsigned int max_ray_len =
mrpt::round(max_range_meters / resolution);
132 unsigned int ray_len = 0;
135 #define INTPRECNUMBIT 10 136 #define int_x2idx(_X) (_X >> INTPRECNUMBIT) 137 #define int_y2idx(_Y) (_Y >> INTPRECNUMBIT) 145 RAYTRACE_STEP_SIZE_IN_CELL_UNITS * Arx * (1L <<
INTPRECNUMBIT));
147 RAYTRACE_STEP_SIZE_IN_CELL_UNITS * Ary * (1L <<
INTPRECNUMBIT));
150 const cellType threshold_free_int = p2l(threshold_free);
154 x < static_cast<int>(size_x) &&
y < static_cast<int>(size_y) &&
155 (hitCellOcc_int = map[
x +
y * size_x]) > threshold_free_int &&
156 ray_len < max_ray_len)
166 if (abs(hitCellOcc_int) <= 1 || static_cast<unsigned>(
x) >= size_x ||
167 static_cast<unsigned>(
y) >= size_y)
170 out_range = max_range_meters;
174 out_range = RAYTRACE_STEP_SIZE_IN_CELL_UNITS * ray_len * resolution;
175 out_valid = (ray_len < max_ray_len);
177 if (noiseStd > 0 && out_valid)
185 : method(sumUnscented),
214 Eigen::VectorXd& y_scanRanges)
224 CPose3D(x_pose[0], x_pose[1], .0, x_pose[2], .0, .0) +
227 const CPose2D sensorPose(sensorPose3D);
230 y_scanRanges.resize(N);
232 double A = sensorPose.
phi() +
247 sensorPose.
x(), sensorPose.
y(), A,
range, valid,
258 const Eigen::Vector3d robPoseMean =
262 simulData.
grid =
this;
263 simulData.
params = &in_params;
295 throw std::runtime_error(
296 "[laserScanSimulatorWithUncertainty] Unknown `method` value");
307 for (
unsigned i = 0; i < in_params.
nRays; i++)
const COccupancyGridMap2D::TLaserSimulUncertaintyParams * params
mrpt::poses::CPosePDFGaussian robotPose
The robot pose Gaussian, in map coordinates.
A namespace of pseudo-random numbers generators of diferent distributions.
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::DEG2RAD(.0)) const
Simulates a laser range scan into the current grid map.
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.
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)
double DEG2RAD(const double x)
Degrees to radians.
float resolution
Cell size, i.e.
Output params for laserScanSimulatorWithUncertainty()
Montecarlo-based estimation.
int16_t cellType
The type of the map cells:
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.
float maxRange
The maximum range allowed by the device, in meters (e.g.
#define ASSERT_(f)
Defines an assertion mechanism.
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.
unsigned int decimation
(Default: 1) The rays that will be simulated are at indexes: 0, D, 2D, 3D,...
void sonarSimulator(mrpt::obs::CObservationRange &inout_observation, const mrpt::poses::CPose2D &robotPose, float threshold=0.5f, float rangeNoiseStd=0.f, float angleNoiseStd=mrpt::DEG2RAD(0.f)) const
Simulates the observations of a sonar rig into the current grid map.
double UT_alpha
[sumUnscented] UT parameters.
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...
std::deque< TMeasurement >::iterator iterator
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)...
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...
float maxRange
(Default: 80) The maximum range allowed by the device, in meters (e.g.
Performs an unscented transform.
CRandomGenerator & getRandomGenerator()
A static instance of a CRandomGenerator class, for use in single-thread applications.
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.
double drawGaussian1D_normalized()
Generate a normalized (mean=0, std=1) normally distributed sample.
void setScanRangeValidity(const size_t i, const bool val)
int round(const T value)
Returns the closer integer (int) to x.