37 m_has_intensity(false),
39 intensity( m_intensity ),
40 validRange( m_validRange ),
54 intensity( m_intensity ),
55 validRange( m_validRange )
116 itScan++, itValid++, k++ )
119 float x = (*itScan)*cos(ang);
121 if( min_height != 0 || max_height != 0 )
123 ASSERT_( max_height > min_height );
124 if( *itScan < min_distance || ang > max_angle ||
x > h - min_height ||
x < h - max_height )
128 if( *itScan < min_distance || ang > max_angle )
153 in.ReadBufferFixEndianness( &
m_scan[0], N);
206 in.ReadBufferFixEndianness( &
m_scan[0], N);
249 const char* fields[] = {
"class",
251 "scan",
"validRange",
"intensity"
252 "aperture",
"rightToLeft",
"maxRange",
253 "stdError",
"beamAperture",
"deltaPitch",
256 mexplus::MxArray obs_struct( mexplus::MxArray::Struct(
sizeof(fields)/
sizeof(fields[0]),fields) );
263 obs_struct.set(
"scan", this->
m_scan);
267 obs_struct.set(
"aperture", this->
aperture);
269 obs_struct.set(
"maxRange", this->
maxRange);
270 obs_struct.set(
"stdError", this->
stdError);
272 obs_struct.set(
"deltaPitch", this->
deltaPitch);
275 return obs_struct.release();
302 if (areas.empty())
return;
311 if (!sizeRangeScan)
return;
321 dA = -
aperture / (sizeRangeScan-1);
336 const double Lx = *scan_it * cos( Ang );
337 const double Ly = *scan_it * sin( Ang );
347 if ( i->first.PointIntoPolygon(Gx,Gy) &&
348 (Gz>=i->second.first && Gz<=i->second.second) )
364 if (areas.empty())
return;
367 for (
size_t i=0;i<areas.size();i++)
369 TListExclusionAreasWithRanges::value_type dat;
370 dat.first = areas[i];
371 dat.second.first = -std::numeric_limits<double>::max();
372 dat.second.second = std::numeric_limits<double>::max();
384 if (angles.empty())
return;
389 const size_t sizeRangeScan =
scan.
size();
393 if (!sizeRangeScan)
return;
403 dA = -
aperture / (sizeRangeScan-1);
407 for (vector<pair<double,double> >::
const_iterator itA=angles.begin();itA!=angles.end();++itA)
412 if (ap_idx_ini<0) ap_idx_ini=0;
413 if (ap_idx_end<0) ap_idx_end=0;
415 if (ap_idx_ini>(
int)sizeRangeScan) ap_idx_ini=sizeRangeScan-1;
416 if (ap_idx_end>(
int)sizeRangeScan) ap_idx_end=sizeRangeScan-1;
418 const size_t idx_ini = ap_idx_ini;
419 const size_t idx_end = ap_idx_end;
421 if (idx_end>=idx_ini)
423 for (
size_t i=idx_ini;i<=idx_end;i++)
428 for (
size_t i=0;i<idx_end;i++)
431 for (
size_t i=idx_ini;i<sizeRangeScan;i++)
455 throw std::runtime_error(
"[CObservation2DRangeScan::buildAuxPointsMap] ERROR: This function needs linking against mrpt-maps.\n");
457 (*ptr_internal_build_points_map_from_scan2D)(*
this,
m_cachedMap, options);
470 if (
a.nRays !=
b.nRays)
return a.nRays<
b.nRays;
471 if (
a.aperture !=
b.aperture)
return a.aperture <
b.aperture;
472 if (
a.rightToLeft !=
b.rightToLeft)
return a.rightToLeft;
480 o <<
"Homogeneous matrix for the sensor's 3D pose, relative to robot base:\n";
483 o <<
format(
"Samples direction: %s\n", (
rightToLeft) ?
"Right->Left" :
"Left->Right");
490 o <<
format(
"Invalid points in the scan: %u\n", (
unsigned)inval);
495 o <<
"Raw scan values: [";
499 o <<
"Raw valid-scan values: [";
504 o <<
"Raw intensity values: [";
579 for (
size_t i=0;i<nRays;i++) {
580 m_scan[i] = scanRanges[i];
struct mxArray_tag mxArray
Forward declaration for mxArray (avoid #including as much as possible to speed up compiling)
#define IMPLEMENTS_MEXPLUS_FROM(complete_type)
#define IMPLEMENTS_SERIALIZABLE(class_name, base, NameSpace)
This must be inserted in all CSerializable classes implementation files.
This class is a "CSerializable" wrapper for "CMatrixFloat".
A "CObservation"-derived class that represents a 2D range scan measurement (typically from a laser sc...
mrpt::maps::CMetricMapPtr m_cachedMap
A points map, build only under demand by the methods getAuxPointsMap() and buildAuxPointsMap().
std::vector< char > m_validRange
It's false (=0) on no reflected rays, referenced to elements in scan.
bool getScanRangeValidity(const size_t i) const
void resizeScanAndAssign(const size_t len, const float rangeVal, const bool rangeValidity, const int32_t rangeIntensity=0)
Resizes all data vectors to allocate a given number of scan rays and assign default values.
void writeToStream(mrpt::utils::CStream &out, int *getVersion) const
Introduces a pure virtual method responsible for writing to a CStream.
std::vector< int32_t > m_intensity
The intensity values of the scan. If available, must have same length than validRange.
float maxRange
The maximum range allowed by the device, in meters (e.g. 80m, 50m,...)
void filterByExclusionAngles(const std::vector< std::pair< double, double > > &angles)
Mark as invalid the ranges in any of a given set of "forbiden angle ranges", given as pairs<min_angle...
void getDescriptionAsText(std::ostream &o) const MRPT_OVERRIDE
Build a detailed, multi-line textual description of the observation contents and dump it to the outpu...
float beamAperture
The aperture of each beam, in radians, used to insert "thick" rays in the occupancy grid.
mrpt::utils::ContainerReadOnlyProxyAccessor< std::vector< char > > validRange
It's false (=0) on no reflected rays, referenced to elements in scan.
void setScanIntensity(const size_t i, const int val)
bool hasIntensity() const
Return true if scan has intensity.
int32_t getScanIntensity(const size_t i) const
double deltaPitch
If the laser gathers data by sweeping in the pitch/elevation angle, this holds the increment in "pitc...
float aperture
The "aperture" or field-of-view of the range finder, in radians (typically M_PI = 180 degrees).
void loadFromVectors(size_t nRays, const float *scanRanges, const char *scanValidity)
std::vector< float > m_scan
The range values of the scan, in meters. Must have same length than validRange.
std::vector< std::pair< mrpt::math::CPolygon, std::pair< double, double > > > TListExclusionAreasWithRanges
Used in filterByExclusionAreas.
size_t getScanSize() const
Get number of scan rays.
void filterByExclusionAreas(const TListExclusionAreas &areas)
Mark as invalid sensed points that fall within any of a set of "exclusion areas", given in coordinate...
void truncateByDistanceAndAngle(float min_distance, float max_angle, float min_height=0, float max_height=0, float h=0)
A general method to truncate the scan by defining a minimum valid distance and a maximum valid angle ...
mrpt::poses::CPose3D sensorPose
The 6D pose of the sensor on the robot at the moment of starting the scan.
virtual const mrpt::utils::TRuntimeClassId * GetRuntimeClass() const
Returns information about the class of an object in runtime.
void internal_buildAuxPointsMap(const void *options=NULL) const
Internal method, used from buildAuxPointsMap()
bool rightToLeft
The scanning direction: true=counterclockwise; false=clockwise.
float getScanRange(const size_t i) const
bool isPlanarScan(const double tolerance=0) const
Return true if the laser scanner is "horizontal", so it has an absolute value of "pitch" and "roll" l...
mrpt::utils::ContainerReadOnlyProxyAccessor< std::vector< float > > scan
The range values of the scan, in meters. Must have same length than validRange.
void resizeScan(const size_t len)
Resizes all data vectors to allocate a given number of scan rays.
void getScanProperties(T2DScanProperties &p) const
Fill out a T2DScanProperties structure with the parameters of this scan.
void readFromStream(mrpt::utils::CStream &in, int version)
Introduces a pure virtual method responsible for loading from a CStream This can not be used directly...
void setScanRangeValidity(const size_t i, const bool val)
float stdError
The "sigma" error of the device in meters, used while inserting the scan in an occupancy grid.
void setScanHasIntensity(bool setHasIntensityFlag)
Marks this scan as having or not intensity data.
bool m_has_intensity
Whether the intensity values are present or not. If not, space is saved during serialization.
virtual ~CObservation2DRangeScan()
Destructor.
void setScanRange(const size_t i, const float val)
Declares a class that represents any robot's observation.
virtual void getDescriptionAsText(std::ostream &o) const
Build a detailed, multi-line textual description of the observation contents and dump it to the outpu...
std::string sensorLabel
An arbitrary label that can be used to identify the sensor.
mrpt::system::TTimeStamp timestamp
The associated UTC time-stamp. Where available, this should contain the accurate satellite-based time...
A class used to store a 3D pose (a 3D translation + a rotation in 3D).
bool isHorizontal(const double tolerance=0) const
Return true if the 6D pose represents a Z axis almost exactly vertical (upwards or downwards),...
mrpt::math::CMatrixDouble44 getHomogeneousMatrixVal() const
void composePoint(double lx, double ly, double lz, double &gx, double &gy, double &gz, mrpt::math::CMatrixFixedNumeric< double, 3, 3 > *out_jacobian_df_dpoint=NULL, mrpt::math::CMatrixFixedNumeric< double, 3, 6 > *out_jacobian_df_dpose=NULL, mrpt::math::CMatrixFixedNumeric< double, 3, 6 > *out_jacobian_df_dse3=NULL, bool use_small_rot_approx=false) const
An alternative, slightly more efficient way of doing with G and L being 3D points and P this 6D pose...
virtual mxArray * writeToMatlab() const
Introduces a pure virtual method responsible for writing to a mxArray Matlab object,...
This base class is used to provide a unified interface to files,memory buffers,..Please see the deriv...
void WriteBuffer(const void *Buffer, size_t Count)
Writes a block of bytes to the stream from Buffer.
void WriteBufferFixEndianness(const T *ptr, size_t ElementCount)
Writes a sequence of elemental datatypes, taking care of reordering their bytes from the running arch...
const Scalar * const_iterator
GLubyte GLubyte GLubyte a
T wrapTo2Pi(T a)
Modifies the given angle to translate it into the [0,2pi[ range.
#define ASSERT_BELOW_(__A, __B)
#define MRPT_THROW_UNKNOWN_SERIALIZATION_VERSION(__V)
For use in CSerializable implementations.
This base provides a set of functions for maths stuff.
This namespace contains representation of robot actions and observations.
void OBS_IMPEXP(* ptr_internal_build_points_map_from_scan2D)(const mrpt::obs::CObservation2DRangeScan &obs, mrpt::maps::CMetricMapPtr &out_map, const void *insertOps)
bool OBS_IMPEXP operator<(const T2DScanProperties &a, const T2DScanProperties &b)
Order operator, so T2DScanProperties can appear in associative STL containers.
Classes for 2D/3D geometry representation, both of single values and probability density distribution...
Classes for serialization, sockets, ini-file manipulation, streams, list of properties-values,...
T length2length4N(T len)
Returns the smaller number >=len such that it's a multiple of 4.
This is the global namespace for all Mobile Robot Programming Toolkit (MRPT) libraries.
std::string BASE_IMPEXP format(const char *fmt,...) MRPT_printf_format_check(1
A std::string version of C sprintf.
unsigned __int32 uint32_t
Auxiliary struct that holds all the relevant geometry information about a 2D scan.
bool rightToLeft
Angles storage order: true=counterclockwise; false=clockwise.