42 likelihoodOpts.loadFromConfigFile(
source, sectionNamePrefix+
string(
"_likelihoodOpts") );
43 colourOpts.loadFromConfigFile(
source, sectionNamePrefix+
string(
"_colorOpts") );
48 this->insertionOpts.dumpToTextStream(out);
49 this->likelihoodOpts.dumpToTextStream(out);
50 this->colourOpts.dumpToTextStream(out);
69 # include <pcl/io/pcd_io.h> 70 # include <pcl/point_types.h> 77 CColouredPointsMap::CColouredPointsMap()
84 CColouredPointsMap::~CColouredPointsMap()
91 void CColouredPointsMap::reserve(
size_t newLength)
95 x.reserve( newLength );
96 y.reserve( newLength );
97 z.reserve( newLength );
98 m_color_R.reserve( newLength );
99 m_color_G.reserve( newLength );
100 m_color_B.reserve( newLength );
105 void CColouredPointsMap::resize(
size_t newLength)
107 this->reserve(newLength);
109 x.resize( newLength, 0 );
110 y.resize( newLength, 0 );
111 z.resize( newLength, 0 );
112 m_color_R.resize( newLength, 1 );
113 m_color_G.resize( newLength, 1 );
114 m_color_B.resize( newLength, 1 );
122 this->reserve(newLength);
124 x.assign( newLength, 0);
125 y.assign( newLength, 0);
126 z.assign( newLength, 0);
127 m_color_R.assign( newLength, 1 );
128 m_color_G.assign( newLength, 1 );
129 m_color_B.assign( newLength, 1 );
139 CPointsMap::base_copyFrom(
obj);
177 out << m_color_R << m_color_G << m_color_B;
179 out << genericMapParams;
180 insertionOptions.writeToStream(out);
181 likelihoodOptions.writeToStream(out);
207 in.ReadBufferFixEndianness(&
x[0],
n);
208 in.ReadBufferFixEndianness(&
y[0],
n);
209 in.ReadBufferFixEndianness(&
z[0],
n);
211 in >> m_color_R >> m_color_G >> m_color_B;
214 in >> genericMapParams;
217 bool disableSaveAs3DObject;
218 in >> disableSaveAs3DObject;
219 genericMapParams.enableSaveAs3DObject = !disableSaveAs3DObject;
221 insertionOptions.readFromStream(
in);
222 likelihoodOptions.readFromStream(
in);
244 in.ReadBufferFixEndianness(&
x[0],
n);
245 in.ReadBufferFixEndianness(&
y[0],
n);
246 in.ReadBufferFixEndianness(&
z[0],
n);
262 std::vector<uint32_t> dummy_pointWeight(
n);
263 in.ReadBufferFixEndianness(&dummy_pointWeight[0],
n);
268 std::vector<uint32_t> dummy_pointWeight(
n);
269 in.ReadBufferFixEndianness(&dummy_pointWeight[0],
n);
277 in >> insertionOptions.minDistBetweenLaserPoints
278 >> insertionOptions.addToExistingPointsMap
279 >> insertionOptions.also_interpolate
280 >> insertionOptions.disableDeletion
281 >> insertionOptions.fuseWithExisting
282 >> insertionOptions.isPlanarMap;
286 bool old_matchStaticPointsOnly;
287 in >> old_matchStaticPointsOnly;
290 in >> insertionOptions.maxDistForInterpolatePoints;
292 bool disableSaveAs3DObject;
293 in >> disableSaveAs3DObject;
294 genericMapParams.enableSaveAs3DObject = !disableSaveAs3DObject;
300 in >> insertionOptions.horizontalTolerance;
305 in >> m_color_R >> m_color_G >> m_color_B;
312 std::vector<float> dummy_dist;
318 m_color_R.assign(
x.size(),1.0f);
319 m_color_G.assign(
x.size(),1.0f);
320 m_color_B.assign(
x.size(),1.0f);
325 likelihoodOptions.readFromStream(
in);
328 in >> insertionOptions.insertInvalidPoints;
341 void CColouredPointsMap::internal_clear()
359 void CColouredPointsMap::setPoint(
size_t index,
float x,
float y,
float z,
float R,
float G,
float B)
361 if (
index>=this->x.size())
367 this->m_color_G[
index]=G;
368 this->m_color_B[
index]=B;
375 void CColouredPointsMap::setPointColor(
size_t index,
float R,
float G,
float B)
377 if (
index>=this->
x.size())
380 this->m_color_G[
index]=G;
381 this->m_color_B[
index]=B;
385 void CColouredPointsMap::insertPointFast(
float x,
float y,
float z )
387 this->x.push_back(
x);
388 this->y.push_back(
y);
389 this->z.push_back(
z);
390 m_color_R.push_back(1);
391 m_color_G.push_back(1);
392 m_color_B.push_back(1);
397 void CColouredPointsMap::insertPoint(
float x,
float y,
float z,
float R,
float G,
float B )
399 this->x.push_back(
x);
400 this->y.push_back(
y);
401 this->z.push_back(
z);
402 m_color_R.push_back(
R);
403 m_color_G.push_back(G);
404 m_color_B.push_back(B);
412 void CColouredPointsMap::getAs3DObject( mrpt::opengl::CSetOfObjectsPtr &outObj )
const 416 if (!genericMapParams.enableSaveAs3DObject)
return;
418 opengl::CPointCloudColouredPtr
obj = opengl::CPointCloudColoured::Create();
420 obj->loadFromPointsMap(
this);
421 obj->setColor(1,1,1, 1.0);
431 CColouredPointsMap::TColourOptions::TColourOptions() :
432 scheme(cmFromHeightRelativeToSensor),
457 out.
printf(
"\n----------- [CColouredPointsMap::TColourOptions] ------------ \n\n");
459 out.
printf(
"scheme = %u\n", (
unsigned)scheme);
460 out.
printf(
"z_min = %f\n", z_min );
461 out.
printf(
"z_max = %f\n", z_max );
462 out.
printf(
"d_max = %f\n", d_max );
470 if (
index >= this->x.size())
485 if (
index >= this->x.size())
501 if (
index >= this->
x.size())
515 bool accept_points_behind
520 const double x = P.
x/P.
z;
521 const double y = P.
y/P.
z;
525 const double r4 =
square(r2);
526 const double r6 = r2*r4;
545 cameraPoseW = robotPose + cameraPoseR;
552 std::vector<TPixelCoordf> projectedPoints;
554 std::vector<size_t> p_idx;
555 std::vector<float> p_dist;
556 std::vector<unsigned int> p_proj;
564 for(
size_t k = 0; k < p_idx.size(); k++ )
566 float d = sqrt(p_dist[k]);
567 size_t idx = p_idx[k];
572 projectedPoints.push_back(px);
578 unsigned int chR,chG,chB;
580 else { chR = 0; chG = 1; chB = 2; }
582 unsigned int n_proj = 0;
583 const float factor = 1.0f/255;
587 for( itProPoints = projectedPoints.begin(), k = 0;
588 itProPoints != projectedPoints.end();
592 if( itProPoints->x >= 0 && itProPoints->x < imgW && itProPoints->y > 0 && itProPoints->y < imgH )
594 unsigned int ii = p_idx[p_proj[k]];
595 uint8_t *
p = obs.
image( (
unsigned int)itProPoints->x, (
unsigned int)itProPoints->y );
620 if (!f)
return false;
622 for (
unsigned int i=0;i<
x.size();i++)
645 this->
setPoint(idx,pt.
x,pt.
y,pt.
z,pt_color->
R,pt_color->
G,pt_color->
B);
675 const size_t nOther = anotherMap.
size();
682 for (
size_t i=0,j=nPreviousPoints;i<nOther;i++, j++)
695 pcl::PointCloud<pcl::PointXYZRGB> cloud;
697 const size_t nThis = this->
size();
702 cloud.is_dense =
false;
703 cloud.points.resize (cloud.width * cloud.height);
705 const float f = 255.f;
713 for (
size_t i = 0; i < nThis; ++i)
715 cloud.points[i].x =this->
x[i];
716 cloud.points[i].y =this->
y[i];
717 cloud.points[i].z =this->
z[i];
723 cloud.points[i].rgb = aux_val.f;
726 return 0 == pcl::io::savePCDFile(filename, cloud, save_as_binary);
749 lric.
fVars.resize(4);
760 const float rel_z = gz - lric.
HM.get_unsafe(2,3);
763 float & pR = lric.
fVars[0];
764 float & pG = lric.
fVars[1];
765 float & pB = lric.
fVars[2];
766 const float &Az_1_color = lric.
fVars[3];
776 if (
q<0)
q=0;
else if (
q>1)
q=1;
802 float & pR = lric.
fVars[0];
803 float & pG = lric.
fVars[1];
804 float & pB = lric.
fVars[2];
825 lric.
fVars.resize(9);
826 float &cx = lric.
fVars[5];
827 float &cy = lric.
fVars[6];
828 float &fx = lric.
fVars[7];
829 float &fy = lric.
fVars[8];
836 lric.
uVars.resize(4);
837 unsigned int & imgW = lric.
uVars[0];
838 unsigned int & imgH = lric.
uVars[1];
839 unsigned int & img_idx_x = lric.
uVars[2];
840 unsigned int & img_idx_y = lric.
uVars[3];
846 lric.
bVars.resize(3);
853 lric.
fVars[4] = 1.0f/255;
855 hasValidIntensityImage =
false;
864 hasValidIntensityImage =
true;
894 float &pR = lric.
fVars[0];
895 float &pG = lric.
fVars[1];
896 float &pB = lric.
fVars[2];
897 float &Az_1_color = lric.
fVars[3];
898 float &K_8u = lric.
fVars[4];
899 float &cx = lric.
fVars[5];
900 float &cy = lric.
fVars[6];
901 float &fx = lric.
fVars[7];
902 float &fy = lric.
fVars[8];
904 unsigned int & imgW = lric.
uVars[0];
905 unsigned int & imgH = lric.
uVars[1];
906 unsigned int & img_idx_x = lric.
uVars[2];
907 unsigned int & img_idx_y = lric.
uVars[3];
911 const uint8_t & simple_3d_to_color_relation = lric.
bVars[2];
914 const float rel_z = gz - lric.
HM.get_unsafe(2,3);
924 if (
q<0)
q=0;
else if (
q>1)
q=1;
939 bool hasValidColor =
false;
940 if (simple_3d_to_color_relation)
955 img_idx_x = cx + fx * pt.
x/pt.
z;
956 img_idx_y = cy + fy * pt.
y/pt.
z;
964 if (hasValidColor && hasColorIntensityImg)
972 if (hasValidColor && hasValidIntensityImage)
992 float &pR = lric.
fVars[0];
993 float &pG = lric.
fVars[1];
994 float &pB = lric.
fVars[2];
1008 unsigned int & imgW = lric.
uVars[0];
1009 unsigned int & img_idx_x = lric.
uVars[2];
1010 unsigned int & img_idx_y = lric.
uVars[3];
1012 const uint8_t & hasValidIntensityImage = lric.
bVars[0];
1013 const uint8_t & simple_3d_to_color_relation = lric.
bVars[2];
1016 if (simple_3d_to_color_relation && hasValidIntensityImage)
1018 if (++img_idx_x>=imgW)
static void internal_loadFromRangeScan3D_prepareOneRange(CColouredPointsMap &me, const float gx, const float gy, const float gz, mrpt::maps::CPointsMap::TLaserRange3DInsertContext &lric)
Helper method fot the generic implementation of CPointsMap::loadFromRangeScan(), to be called once pe...
std::vector< float > m_color_G
A pair (x,y) of pixel coordinates (subpixel resolution).
double x() const
Common members of all points & poses classes.
Virtual base for specifying the kind and parameters of one map (normally, to be inserted into mrpt::m...
FILE BASE_IMPEXP * fopen(const char *fileName, const char *mode) MRPT_NO_THROWS
An OS-independent version of fopen.
TColouringMethod
The choices for coloring schemes:
Declares a class derived from "CObservation" that encapsules an image from a camera, whose relative pose to robot is also stored.
Classes for serialization, sockets, ini-file manipulation, streams, list of properties-values, timewatch, extensions to STL.
virtual void setSize(size_t newLength) MRPT_OVERRIDE
Resizes all point buffers so they can hold the given number of points, erasing all previous contents ...
void PLY_export_get_vertex(const size_t idx, mrpt::math::TPoint3Df &pt, bool &pt_has_color, mrpt::utils::TColorf &pt_color) const MRPT_OVERRIDE
In a base class, will be called after PLY_export_get_vertex_count() once for each exported point...
void loadFromConfigFile(const mrpt::utils::CConfigFileBase &source, const std::string §ionNamePrefix) MRPT_OVERRIDE
Load all params from a config file/source.
bool save3D_and_colour_to_text_file(const std::string &file) const
Save to a text file.
This namespace provides a OS-independent interface to many useful functions: filenames manipulation...
const mrpt::obs::CObservation3DRangeScan & rangeScan
mrpt::utils::TCamera cameraParamsIntensity
Projection parameters of the intensity (graylevel or RGB) camera.
int BASE_IMPEXP void BASE_IMPEXP fclose(FILE *f)
An OS-independent version of fclose.
void aux_projectPoint_with_distortion(const mrpt::math::TPoint3D &P, const mrpt::utils::TCamera ¶ms, mrpt::utils::TPixelCoordf &pixel, bool accept_points_behind)
mrpt::utils::TCamera cameraParams
Intrinsic and distortion parameters of the camera.
#define IMPLEMENTS_SERIALIZABLE(class_name, base, NameSpace)
This must be inserted in all CSerializable classes implementation files.
#define THROW_EXCEPTION(msg)
GLdouble GLdouble GLdouble GLdouble q
virtual void loadFromRangeScan(const mrpt::obs::CObservation2DRangeScan &rangeScan, const mrpt::poses::CPose3D *robotPose=NULL) MRPT_OVERRIDE
See CPointsMap::loadFromRangeScan()
double cy() const
Get the value of the principal point y-coordinate (in pixels).
const char * getChannelsOrder() const
Returns a string of the form "BGR","RGB" or "GRAY" indicating the channels ordering.
std::vector< float > m_color_B
Declares a class derived from "CObservation" that encapsules a 3D range scan measurement, as from a time-of-flight range camera or any other RGBD sensor.
virtual void PLY_import_set_vertex_count(const size_t N) MRPT_OVERRIDE
In a base class, reserve memory to prepare subsequent calls to PLY_import_set_vertex.
int BASE_IMPEXP fprintf(FILE *fil, const char *format,...) MRPT_NO_THROWS MRPT_printf_format_check(2
An OS-independent version of fprintf.
double z
X,Y,Z coordinates.
void kdTreeNClosestPoint2DIdx(float x0, float y0, size_t knn, std::vector< size_t > &out_idx, std::vector< float > &out_dist_sqr) const
KD Tree-based search for the N closest point to some given 2D coordinates and returns their indexes...
void dumpToTextStream(mrpt::utils::CStream &out) const MRPT_OVERRIDE
This method should clearly display all the contents of the structure in textual form, sending it to a CStream.
GLsizei GLsizei GLuint * obj
static void internal_loadFromRangeScan2D_prepareOneRange(CColouredPointsMap &me, const float gx, const float gy, const float gz, mrpt::maps::CPointsMap::TLaserRange2DInsertContext &lric)
Helper method fot the generic implementation of CPointsMap::loadFromRangeScan(), to be called once pe...
virtual void addFrom_classSpecific(const CPointsMap &anotherMap, const size_t nPreviousPoints) MRPT_OVERRIDE
Auxiliary method called from within addFrom() automatically, to finish the copying of class-specific ...
TColourOptions colorScheme
The options employed when inserting laser scans in the map.
float scan_z
In internal_loadFromRangeScan3D_prepareOneRange, these are the local coordinates of the scan points b...
This class allows loading and storing values and vectors of different types from a configuration text...
T square(const T x)
Inline function for the square of a number.
mrpt::maps::CPointsMap::TLikelihoodOptions likelihoodOpts
double fx() const
Get the value of the focal length x-value (in pixels).
void WriteBufferFixEndianness(const T *ptr, size_t ElementCount)
Writes a sequence of elemental datatypes, taking care of reordering their bytes from the running arch...
virtual bool savePCDFile(const std::string &filename, bool save_as_binary) const MRPT_OVERRIDE
Save the point cloud as a PCL PCD file, in either ASCII or binary format.
double fy() const
Get the value of the focal length y-value (in pixels).
This base class is used to provide a unified interface to files,memory buffers,..Please see the deriv...
A cloud of points in 2D or 3D, which can be built from a sequence of laser scans or other sensors...
This base provides a set of functions for maths stuff.
virtual void getPoint(size_t index, float &x, float &y, float &z, float &R, float &G, float &B) const MRPT_OVERRIDE
Retrieves a point and its color (colors range is [0,1])
mrpt::poses::CPose3D relativePoseIntensityWRTDepth
Relative pose of the intensity camera wrt the depth camera (which is the coordinates origin for this ...
Lightweight 3D point (float version).
T length2length4N(T len)
Returns the smaller number >=len such that it's a multiple of 4.
#define MRPT_UNUSED_PARAM(a)
Can be used to avoid "not used parameters" warnings from the compiler.
double norm() const
Returns the euclidean norm of vector: .
#define MRPT_THROW_UNKNOWN_SERIALIZATION_VERSION(__V)
For use in CSerializable implementations.
mrpt::math::CMatrixDouble44 HM
Homog matrix of the local sensor pose within the robot.
#define MRPT_LOAD_CONFIG_VAR_CAST(variableName, variableType, variableTypeCast, configFileObject, sectionNameStr)
static void internal_loadFromRangeScan2D_init(CColouredPointsMap &me, mrpt::maps::CPointsMap::TLaserRange2DInsertContext &lric)
Helper method fot the generic implementation of CPointsMap::loadFromRangeScan(), to be called only on...
This namespace contains representation of robot actions and observations.
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...
MAPS_IMPEXP float POINTSMAPS_3DOBJECT_POINTSIZE
The size of points when exporting with getAs3DObject() (default=3.0) Affects to:
std::vector< float > fVars
Extra variables to be used as desired by the derived class.
static void templ_loadFromRangeScan(Derived &obj, const mrpt::obs::CObservation2DRangeScan &rangeScan, const mrpt::poses::CPose3D *robotPose)
mrpt::maps::CColouredPointsMap::TColourOptions colourOpts
static void internal_loadFromRangeScan3D_postPushBack(CColouredPointsMap &me, mrpt::maps::CPointsMap::TLaserRange3DInsertContext &lric)
Helper method fot the generic implementation of CPointsMap::loadFromRangeScan(), to be called after e...
A map of 2D/3D points with individual colours (RGB).
virtual void PLY_import_set_vertex(const size_t idx, const mrpt::math::TPoint3Df &pt, const mrpt::utils::TColorf *pt_color=NULL) MRPT_OVERRIDE
In a base class, will be called after PLY_import_set_vertex_count() once for each loaded point...
mrpt::maps::CPointsMap::TInsertionOptions insertionOpts
virtual void setPoint(size_t index, float x, float y, float z, float R, float G, float B) MRPT_OVERRIDE
Changes a given point from map.
GLsizei const GLchar ** string
double cx() const
Get the value of the principal point x-coordinate (in pixels).
Classes for 2D/3D geometry representation, both of single values and probability density distribution...
std::vector< float > fVars
Extra variables to be used as desired by the derived class.
#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...
void vector_strong_clear(VECTOR_T &v)
Like calling a std::vector<>'s clear() method, but really forcing deallocating the memory...
This is the global namespace for all Mobile Robot Programming Toolkit (MRPT) libraries.
#define MAP_DEFINITION_REGISTER(_CLASSNAME_STRINGS, _CLASSNAME_WITH_NS)
Registers one map class into TMetricMapInitializer factory.
void inverseComposePoint(const double gx, const double gy, const double gz, double &lx, double &ly, double &lz, 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) const
Computes the 3D point L such as .
A "CObservation"-derived class that represents a 2D range scan measurement (typically from a laser sc...
#define ASSERT_NOT_EQUAL_(__A, __B)
Declares a virtual base class for all metric maps storage classes.
A class used to store a 3D pose (a 3D translation + a rotation in 3D).
void resetPointsMinDist(float defValue=2000.0f)
Reset the minimum-observed-distance buffer for all the points to a predefined value.
bool hasIntensityImage
true means the field intensityImage contains valid data
void BASE_IMPEXP 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...
std::vector< uint8_t > bVars
std::vector< float > points3D_x
GLsizei GLsizei GLchar * source
A RGB color - floats in the range [0,1].
mrpt::utils::CImage image
The image captured by the camera, that is, the main piece of information of this observation.
Helper struct used for internal_loadFromRangeScan3D_prepareOneRange()
std::vector< float > m_color_R
The color data.
bool isColor() const
Returns true if the image is RGB, false if it is grayscale.
unsigned char * get_unsafe(unsigned int col, unsigned int row, unsigned int channel=0) const
Access to pixels without checking boundaries - Use normally the () operator better, which checks the coordinates.
static void internal_loadFromRangeScan2D_postPushBack(CColouredPointsMap &me, mrpt::maps::CPointsMap::TLaserRange2DInsertContext &lric)
Helper method fot the generic implementation of CPointsMap::loadFromRangeScan(), to be called after e...
mrpt::utils::CImage intensityImage
If hasIntensityImage=true, a color or gray-level intensity image of the same size than "rangeImage"...
mrpt::math::CMatrixDouble44 HM
Homog matrix of the local sensor pose within the robot.
unsigned __int32 uint32_t
void loadFromConfigFile(const mrpt::utils::CConfigFileBase &source, const std::string §ion) MRPT_OVERRIDE
This method load the options from a ".ini"-like file or memory-stored string list.
bool colourFromObservation(const mrpt::obs::CObservationImage &obs, const mrpt::poses::CPose3D &robotPose)
Colour a set of points from a CObservationImage and the global pose of the robot. ...
size_t size() const
Returns the number of stored points in the map.
GLenum const GLfloat * params
size_t getWidth() const MRPT_OVERRIDE
Returns the width of the image in pixels.
void getPointColor(size_t index, float &R, float &G, float &B) const
Retrieves a point color (colors range is [0,1])
static void internal_loadFromRangeScan3D_postOneRange(CColouredPointsMap &me, mrpt::maps::CPointsMap::TLaserRange3DInsertContext &lric)
Helper method fot the generic implementation of CPointsMap::loadFromRangeScan(), to be called once pe...
Helper struct used for internal_loadFromRangeScan2D_prepareOneRange()
static void internal_loadFromRangeScan3D_init(CColouredPointsMap &me, mrpt::maps::CPointsMap::TLaserRange3DInsertContext &lric)
Helper method fot the generic implementation of CPointsMap::loadFromRangeScan(), to be called only on...
virtual int printf(const char *fmt,...) MRPT_printf_format_check(2
Writes a string to the stream in a textual form.
Structure to hold the parameters of a pinhole camera model.
size_t getHeight() const MRPT_OVERRIDE
Returns the height of the image in pixels.
void getSensorPose(mrpt::poses::CPose3D &out_sensorPose) const MRPT_OVERRIDE
A general method to retrieve the sensor pose on the robot.
std::vector< unsigned int > uVars