30 class CSimplePointsMap;
31 class CObservation2DRangeScan;
32 class CObservation3DRangeScan;
61 public mrpt::utils::KDTreeCapable<CPointsMap>,
76 std::vector<unsigned int>
uVars;
88 std::vector<unsigned int>
uVars;
105 virtual void reserve(
size_t newLength) = 0;
111 virtual void resize(
size_t newLength) = 0;
117 virtual void setSize(
size_t newLength) = 0;
120 virtual void setPointFast(
size_t index,
float x,
float y,
float z)=0;
123 virtual void insertPointFast(
float x,
float y,
float z = 0 ) = 0;
126 virtual void copyFrom(
const CPointsMap &obj) = 0;
132 virtual void getPointAllFieldsFast(
const size_t index, std::vector<float> & point_data )
const = 0;
138 virtual void setPointAllFieldsFast(
const size_t index,
const std::vector<float> & point_data ) = 0;
143 virtual void addFrom_classSpecific(
const CPointsMap &anotherMap,
const size_t nPreviousPoints) = 0;
153 virtual float squareDistanceToClosestCorrespondence(
158 return squareDistanceToClosestCorrespondence(static_cast<float>(p0.
x),static_cast<float>(p0.
y));
172 void dumpToTextStream(
CStream &out)
const;
184 void writeToStream(
CStream &out)
const;
185 void readFromStream(
CStream &in);
201 void loadFromConfigFile(
203 const std::string §ion);
206 void dumpToTextStream(
CStream &out)
const;
208 void writeToStream(
CStream &out)
const;
209 void readFromStream(
CStream &in);
229 virtual void addFrom(
const CPointsMap &anotherMap);
234 this->addFrom(anotherMap);
242 void insertAnotherMap(
261 bool load2Dor3D_from_text_file(
const std::string &file,
const bool is_3D);
266 bool save2D_to_text_file(
const std::string &file)
const;
271 bool save3D_to_text_file(
const std::string &file)
const;
276 const std::string &filNamePrefix
279 std::string fil( filNamePrefix + std::string(
".txt") );
280 save3D_to_text_file( fil );
284 virtual bool savePCDFile(
const std::string &filename,
bool save_as_binary)
const;
287 virtual bool loadPCDFile(
const std::string &filename);
319 virtual bool saveLASFile(
const std::string &filename,
const LAS_WriteParams & params = LAS_WriteParams() )
const;
324 virtual bool loadLASFile(
const std::string &filename, LAS_HeaderInfo &out_headerInfo,
const LAS_LoadParams ¶ms = LAS_LoadParams() );
331 inline size_t size()
const {
return x.size(); }
338 unsigned long getPoint(
size_t index,
float &x,
float &y,
float &z)
const;
340 unsigned long getPoint(
size_t index,
float &x,
float &y)
const;
342 unsigned long getPoint(
size_t index,
double &x,
double &y,
double &z)
const;
344 unsigned long getPoint(
size_t index,
double &x,
double &y)
const;
354 virtual void getPoint(
size_t index,
float &x,
float &y,
float &z,
float &R,
float &G,
float &B )
const
356 getPoint(index,x,y,z);
362 inline void getPointFast(
size_t index,
float &x,
float &y,
float &z)
const { x=this->x[index]; y=this->y[index]; z=this->z[index]; }
370 inline void setPoint(
size_t index,
float x,
float y,
float z) {
372 setPointFast(index,x,y,z);
382 virtual void setPoint(
size_t index,
float x,
float y,
float z,
float R,
float G,
float B)
385 setPoint(index,x,y,z);
399 void getPointsBuffer(
size_t &outPointsCount,
const float *&xs,
const float *&ys,
const float *&zs )
const;
413 template <
class VECTOR>
414 void getAllPoints( VECTOR &xs, VECTOR &ys, VECTOR &zs,
size_t decimation = 1 )
const
418 const size_t Nout = x.size() / decimation;
422 size_t idx_in, idx_out;
423 for (idx_in=0,idx_out=0;idx_out<Nout;idx_in+=decimation,++idx_out)
425 xs[idx_out]=x[idx_in];
426 ys[idx_out]=y[idx_in];
427 zs[idx_out]=z[idx_in];
432 inline void getAllPoints(std::vector<TPoint3D> &ps,
size_t decimation=1)
const {
433 std::vector<float> dmy1,dmy2,dmy3;
434 getAllPoints(dmy1,dmy2,dmy3,decimation);
435 ps.resize(dmy1.size());
436 for (
size_t i=0;i<dmy1.size();i++) {
437 ps[i].x=
static_cast<double>(dmy1[i]);
438 ps[i].y=
static_cast<double>(dmy2[i]);
439 ps[i].z=
static_cast<double>(dmy3[i]);
447 void getAllPoints( std::vector<float> &xs, std::vector<float> &ys,
size_t decimation = 1 )
const;
449 inline void getAllPoints(std::vector<TPoint2D> &ps,
size_t decimation=1)
const {
450 std::vector<float> dmy1,dmy2;
451 getAllPoints(dmy1,dmy2,decimation);
452 ps.resize(dmy1.size());
453 for (
size_t i=0;i<dmy1.size();i++) {
454 ps[i].x=
static_cast<double>(dmy1[i]);
455 ps[i].y=
static_cast<double>(dmy2[i]);
462 inline void insertPoint(
float x,
float y,
float z=0 ) { insertPointFast(x,y,z); mark_as_modified(); }
466 virtual void insertPoint(
float x,
float y,
float z,
float R,
float G,
float B )
475 template <
typename VECTOR>
478 const size_t N = X.size();
480 ASSERT_(Z.size()==0 || Z.size()==X.size())
482 const bool z_valid = !Z.empty();
483 if (z_valid)
for (
size_t i=0;i<N;i++) { this->setPointFast(i,X[i],Y[i],Z[i]); }
484 else for (
size_t i=0;i<N;i++) { this->setPointFast(i,X[i],Y[i],0); }
489 inline void setAllPoints(
const std::vector<float> &X,
const std::vector<float> &Y,
const std::vector<float> &Z) {
490 setAllPointsTemplate(X,Y,Z);
494 inline void setAllPoints(
const std::vector<float> &X,
const std::vector<float> &Y) {
495 setAllPointsTemplate(X,Y);
503 getPointAllFieldsFast(index,point_data);
512 setPointAllFieldsFast(index,point_data);
518 void clipOutOfRangeInZ(
float zMin,
float zMax);
527 void applyDeletionMask(
const std::vector<bool> &mask );
530 virtual void determineMatching2D(
538 virtual void determineMatching3D(
546 float compute3DMatchingRatio(
549 float maxDistForCorr = 0.10f,
550 float maxMahaDistForCorr = 2.0f
566 void compute3DDistanceToMesh(
569 float maxDistForCorrespondence,
571 float &correspondencesRatio );
586 virtual void loadFromRangeScan(
588 const CPose3D *robotPose = NULL ) = 0;
599 virtual void loadFromRangeScan(
601 const CPose3D *robotPose = NULL ) = 0;
615 float minDistForFuse = 0.02f,
616 std::vector<bool> *notFusedPoints = NULL);
620 void changeCoordinatesReference(
const CPose2D &b);
624 void changeCoordinatesReference(
const CPose3D &b);
632 virtual bool isEmpty()
const;
635 inline bool empty()
const {
return isEmpty(); }
641 virtual void getAs3DObject ( mrpt::opengl::CSetOfObjectsPtr &outObj )
const;
651 float getLargestDistanceFromOrigin()
const;
655 output_is_valid = m_largestDistanceFromOriginIsUpdated;
656 return m_largestDistanceFromOrigin;
662 void boundingBox(
float &min_x,
float &max_x,
float &min_y,
float &max_y,
float &min_z,
float &max_z )
const;
665 float dmy1,dmy2,dmy3,dmy4,dmy5,dmy6;
666 boundingBox(dmy1,dmy2,dmy3,dmy4,dmy5,dmy6);
682 void extractPoints(
const TPoint3D &corner1,
const TPoint3D &corner2,
CPointsMap *outMap,
const double &R = 1,
const double &G = 1,
const double &B = 1 );
693 inline void setHeightFilterLevels(
const double _z_min,
const double _z_max) { m_heightfilter_z_min=_z_min; m_heightfilter_z_max=_z_max; }
695 inline void getHeightFilterLevels(
double &_z_min,
double &_z_max)
const { _z_min=m_heightfilter_z_min; _z_max=m_heightfilter_z_max; }
706 virtual double computeObservationLikelihood(
const CObservation *obs,
const CPose3D &takenFrom );
722 template <
class POINTCLOUD>
725 const size_t nThis = this->
size();
729 cloud.is_dense =
false;
730 cloud.points.resize(cloud.width * cloud.height);
731 for (
size_t i = 0; i < nThis; ++i) {
732 cloud.points[i].x =this->x[i];
733 cloud.points[i].y =this->y[i];
734 cloud.points[i].z =this->z[i];
748 template <
class POINTCLOUD>
751 const size_t N = cloud.points.size();
754 for (
size_t i=0;i<N;++i)
755 this->insertPointFast(cloud.points[i].x,cloud.points[i].y,cloud.points[i].z);
768 if (dim==0)
return this->x[idx];
769 else if (dim==1)
return this->y[idx];
770 else if (dim==2)
return this->z[idx];
else return 0;
778 const float d0 = p1[0]-x[idx_p2];
779 const float d1 = p1[1]-y[idx_p2];
784 const float d0 = p1[0]-x[idx_p2];
785 const float d1 = p1[1]-y[idx_p2];
786 const float d2 = p1[2]-z[idx_p2];
787 return d0*d0+d1*d1+d2*d2;
794 template <
typename BBOX>
799 bb[0].low, bb[0].high,
800 bb[1].low, bb[1].high,
803 bb[2].low = min_z; bb[2].high = max_z;
812 std::vector<float> x,y,
z;
827 mutable float m_bb_min_x,m_bb_max_x, m_bb_min_y,m_bb_max_y,
m_bb_min_z,m_bb_max_z;
833 m_largestDistanceFromOriginIsUpdated=
false;
834 m_boundingBoxIsUpdated =
false;
835 kdtree_mark_as_outdated();
842 bool internal_insertObservation(
865 virtual size_t PLY_export_get_vertex_count()
const;
873 virtual void PLY_export_get_vertex(
900 namespace global_settings
919 static const int HAS_RGB = 0;
920 static const int HAS_RGBf = 0;
921 static const int HAS_RGBu8 = 0;
926 inline size_t size()
const {
return m_obj.
size(); }
931 template <
typename T>
932 inline void getPointXYZ(
const size_t idx, T &x,T &y, T &z)
const {
936 inline void setPointXYZ(
const size_t idx,
const coords_t x,
const coords_t y,
const coords_t z) {
#define ASSERT_EQUAL_(__A, __B)
virtual CSimplePointsMap * getAsSimplePointsMap()
A "CObservation"-derived class that represents a 2D range scan measurement (typically from a laser sc...
bool isPlanarMap
If set to true, only HORIZONTAL (in the XY plane) measurements will be inserted in the map (Default v...
MAPS_IMPEXP float POINTSMAPS_3DOBJECT_POINTSIZE
The size of points when exporting with getAs3DObject() (default=3.0) Affects to:
virtual void setPointWeight(size_t index, unsigned long w)
Sets the point weight, which is ignored in all classes but those which actually store that field (Not...
virtual void PLY_import_set_face_count(const size_t N)
In a base class, reserve memory to prepare subsequent calls to PLY_import_set_face.
bool empty() const
STL-like method to check whether the map is empty:
bool m_largestDistanceFromOriginIsUpdated
Auxiliary variables used in "getLargestDistanceFromOrigin".
void getAllPoints(VECTOR &xs, VECTOR &ys, VECTOR &zs, size_t decimation=1) const
Returns a copy of the 2D/3D points as a std::vector of float coordinates.
unsigned long getPoint(size_t index, mrpt::math::TPoint2D &p) const
void setHeightFilterLevels(const double _z_min, const double _z_max)
Set the min/max Z levels for points to be actually inserted in the map (only if enableFilterByHeight(...
const std::vector< float > & getPointsBufferRef_y() const
Provides a direct access to a read-only reference of the internal point buffer.
bool load2D_from_text_file(const std::string &file)
Load from a text file.
void getPointFast(size_t index, float &x, float &y, float &z) const
Just like getPoint() but without checking out-of-bound index and without returning the point weight...
PointCloudAdapter(const mrpt::slam::CPointsMap &obj)
Constructor (accept a const ref for convenience)
virtual void setPointFast(size_t index, float x, float y, float z)=0
Changes the coordinates of the given point (0-based index), without checking for out-of-bounds and wi...
double max_corr_distance
Maximum distance in meters to consider for the numerator divided by "sigma_dist", so that each point ...
std::vector< uint8_t > bVars
#define MRPT_OVERRIDE
C++11 "override" for virtuals:
A helper base class for those PointCloudAdapter<> which do not handle RGB data; it declares needed in...
virtual bool hasColorPoints() const
Returns true if the point map has a color field for each point.
float kdtree_distance(const float *p1, const size_t idx_p2, size_t size) const
Returns the distance between the vector "p1[0:size-1]" and the data point with index "idx_p2" stored ...
bool disableDeletion
If set to false (default=true) points in the same plane as the inserted scan and inside the free spac...
void setAllPoints(const std::vector< float > &X, const std::vector< float > &Y)
Set all the points at once from vectors with X and Y coordinates (Z=0).
bool addToExistingPointsMap
Applicable to "loadFromRangeScan" only! If set to false, the points from the scan are loaded...
#define ASSERT_BELOW_(__A, __B)
void setAllPoints(const std::vector< float > &X, const std::vector< float > &Y, const std::vector< float > &Z)
Set all the points at once from vectors with X,Y and Z coordinates.
Options used when evaluating "computeObservationLikelihood" in the derived classes.
float scan_z
In internal_loadFromRangeScan3D_prepareOneRange, these are the local coordinates of the scan points b...
size_t size() const
Returns the number of stored points in the map.
bool insertInvalidPoints
Points with x,y,z coordinates set to zero will also be inserted.
bool m_heightfilter_enabled
Whether or not (default=not) filter the input points by height.
TLikelihoodOptions likelihoodOptions
void setPointAllFields(const size_t index, const std::vector< float > &point_data)
Set all the data fields for one point as a vector: depending on the implementation class this can be ...
void enableFilterByHeight(bool enable=true)
Enable/disable the filter-by-height functionality.
CMatrixDouble44 HM
Homog matrix of the local sensor pose within the robot.
With this struct options are provided to the observation insertion process.
float squareDistanceToClosestCorrespondenceT(const TPoint2D &p0) const
void resize(const size_t N)
Set number of points (to uninitialized values)
Optional settings for loadLASFile()
virtual void setPoint(size_t index, float x, float y, float z, float R, float G, float B)
double z
X,Y,Z coordinates.
TInsertionOptions insertionOptions
The options used when inserting observations in the map.
void mark_as_modified() const
Called only by this class or children classes, set m_largestDistanceFromOriginIsUpdated=false and suc...
std::vector< unsigned int > uVars
static float COLOR_3DSCENE_G
void setFromPCLPointCloud(const POINTCLOUD &cloud)
Loads a PCL point cloud into this MRPT class (note: this method ignores potential RGB information...
float horizontalTolerance
The tolerance in rads in pitch & roll for a laser scan to be considered horizontal, considered only when isPlanarMap=true (default=0).
unsigned long getPoint(size_t index, mrpt::math::TPoint3D &p) const
This class allows loading and storing values and vectors of different types from a configuration text...
#define DEFINE_VIRTUAL_SERIALIZABLE(class_name)
This declaration must be inserted in virtual CSerializable classes definition:
TLaserRange3DInsertContext(const CObservation3DRangeScan &_rangeScan)
Declares a virtual base class for all metric maps storage classes.
virtual void insertPoint(float x, float y, float z, float R, float G, float B)
static float COLOR_3DSCENE_R
The color [0,1] of points when extracted from getAs3DObject (default=blue)
This base class is used to provide a unified interface to files,memory buffers,..Please see the deriv...
void insertPoint(float x, float y, float z=0)
Provides a way to insert (append) individual points into the map: the missing fields of child classes...
A numeric matrix of compile-time fixed size.
This base provides a set of functions for maths stuff.
#define DEFINE_SERIALIZABLE_PRE_CUSTOM_BASE_LINKAGE(class_name, base_name, _LINKAGE_)
This declaration must be inserted in all CSerializable classes definition, before the class declarati...
void setPoint(size_t index, mrpt::math::TPoint2D &p)
Lightweight 3D point (float version).
virtual ~TLikelihoodOptions()
#define MRPT_UNUSED_PARAM(a)
Can be used to avoid "not used parameters" warnings from the compiler.
uint32_t decimation
Speed up the likelihood computation by considering only one out of N rays (default=10) ...
float m_largestDistanceFromOrigin
Auxiliary variables used in "getLargestDistanceFromOrigin".
Optional settings for saveLASFile()
const CObservation3DRangeScan & rangeScan
CMatrixDouble44 HM
Homog matrix of the local sensor pose within the robot.
bool kdtree_get_bbox(BBOX &bb) const
std::vector< T1 > & operator+=(std::vector< T1 > &a, const std::vector< T2 > &b)
a+=b (element-wise sum)
TLaserRange2DInsertContext(const CObservation2DRangeScan &_rangeScan)
Declares a class that represents any robot's observation.
Helper struct used for internal_loadFromRangeScan2D_prepareOneRange()
virtual size_t PLY_export_get_face_count() const
In a base class, return the number of faces.
EIGEN_STRONG_INLINE void setSize(size_t row, size_t col)
Changes the size of matrix, maintaining its previous content as possible and padding with zeros where...
bool load3D_from_text_file(const std::string &file)
Load from a text file.
void getPCLPointCloud(POINTCLOUD &cloud) const
Use to convert this MRPT point cloud object into a PCL point cloud object (PointCloud
).
size_t size() const
Get number of points.
A smart look-up-table (LUT) of sin/cos values for 2D laser scans.
Helper struct used for internal_loadFromRangeScan3D_prepareOneRange()
Parameters for the determination of matchings between point clouds, etc.
void boundingBox(TPoint3D &pMin, TPoint3D &pMax) const
A virtual base class that implements the capability of importing 3D point clouds and faces from a fil...
float getLargestDistanceFromOriginNoRecompute(bool &output_is_valid) const
Like getLargestDistanceFromOrigin() but returns in output_is_valid = false if the distance was not al...
virtual void getPoint(size_t index, float &x, float &y, float &z, float &R, float &G, float &B) const
Access to a given point from map, and its colors, if the map defines them (othersise, R=G=B=1.0).
void getHeightFilterLevels(double &_z_min, double &_z_max) const
Get the min/max Z levels for points to be actually inserted in the map.
void getAllPoints(std::vector< TPoint3D > &ps, size_t decimation=1) const
Classes for 2D/3D geometry representation, both of single values and probability density distribution...
double m_heightfilter_z_min
The minimum and maximum height for a certain laser scan to be inserted into this map.
std::vector< unsigned int > uVars
virtual void resize(size_t newLength)=0
Resizes all point buffers so they can hold the given number of points: newly created points are set t...
const std::vector< float > & getPointsBufferRef_z() const
Provides a direct access to a read-only reference of the internal point buffer.
std::vector< float > fVars
Extra variables to be used as desired by the derived class.
void insertPoint(const mrpt::math::TPoint3D &p)
This is the global namespace for all Mobile Robot Programming Toolkit (MRPT) libraries.
An adapter to different kinds of point cloud object.
void setPoint(size_t index, float x, float y)
void getPointXYZ(const size_t idx, T &x, T &y, T &z) const
Get XYZ coordinates of i'th point.
static float COLOR_3DSCENE_B
size_t size(const MATRIXLIKE &m, int dim)
A class used to store a 2D pose.
float kdtree_get_pt(const size_t idx, int dim) const
Returns the dim'th component of the idx'th point in the class:
bool isFilterByHeightEnabled() const
Return whether filter-by-height is enabled.
A class used to store a 3D pose (a 3D translation + a rotation in 3D).
bool m_boundingBoxIsUpdated
float coords_t
The type of each point XYZ coordinates.
bool fuseWithExisting
If set to true (default=false), inserted points are "fused" with previously existent ones...
double sigma_dist
Sigma (standard deviation, in meters) of the exponential used to model the likelihood (default= 0...
float minDistBetweenLaserPoints
The minimum distance between points (in 3D): If two points are too close, one of them is not inserted...
size_t kdtree_get_point_count() const
Must return the number of data points.
void setAllPointsTemplate(const VECTOR &X, const VECTOR &Y, const VECTOR &Z=VECTOR())
Set all the points at once from vectors with X,Y and Z coordinates (if Z is not provided, it will be set to all zeros).
const std::vector< float > & getPointsBufferRef_x() const
Provides a direct access to a read-only reference of the internal point buffer.
A RGB color - floats in the range [0,1].
virtual unsigned int getPointWeight(size_t index) const
Gets the point weight, which is ignored in all classes (defaults to 1) but in those which actually st...
bool also_interpolate
If set to true, far points (<1m) are interpolated with samples at "minDistSqrBetweenLaserPoints" inte...
A cloud of points in 2D or 3D, which can be built from a sequence of laser scans or other sensors...
float maxDistForInterpolatePoints
The maximum distance between two points to interpolate between them (ONLY when also_interpolate=true)...
void setPointXYZ(const size_t idx, const coords_t x, const coords_t y, const coords_t z)
Set XYZ coordinates of i'th point.
Declares a class derived from "CObservation" that encapsules a 3D range scan measurement (e...
virtual const CSimplePointsMap * getAsSimplePointsMap() const
If the map is a simple points map or it's a multi-metric map that contains EXACTLY one simple points ...
void setPoint(size_t index, mrpt::math::TPoint3D &p)
A cloud of points in 2D or 3D, which can be built from a sequence of laser scans. ...
#define DEFINE_SERIALIZABLE_POST_CUSTOM_BASE_LINKAGE(class_name, base_name, _LINKAGE_)
std::vector< uint8_t > bVars
void getPointAllFields(const size_t index, std::vector< float > &point_data) const
Get all the data fields for one point as a vector: depending on the implementation class this can be ...
A virtual base class that implements the capability of exporting 3D point clouds and faces to a file ...
mrpt::slam::CPointsMap & m_obj
std::vector< float > fVars
Extra variables to be used as desired by the derived class.
void getAllPoints(std::vector< TPoint2D > &ps, size_t decimation=1) const
void setPoint(size_t index, float x, float y, float z)
Changes a given point from map, with Z defaulting to 0 if not provided.
This is a virtual base class for sets of options than can be loaded from and/or saved to configuratio...
CSinCosLookUpTableFor2DScans m_scans_sincos_cache
Cache of sin/cos values for the latest 2D scan geometries.
const CObservation2DRangeScan & rangeScan
void saveMetricMapRepresentationToFile(const std::string &filNamePrefix) const
This virtual method saves the map to a file "filNamePrefix"+< some_file_extension >...
std::vector< float > z
The point coordinates.