Go to the documentation of this file.
49 void CObservation3DRangeScan::EXTERNALS_AS_TEXT(
bool value)
53 bool CObservation3DRangeScan::EXTERNALS_AS_TEXT()
59 #define COBS3DRANGE_USE_MEMPOOL
65 #ifdef COBS3DRANGE_USE_MEMPOOL
82 std::vector<float> pts_x, pts_y,
pts_z;
84 std::vector<uint16_t> idxs_x,
idxs_y;
98 return H == req.
H && W == req.
W;
168 CObservation3DRangeScan::CObservation3DRangeScan()
169 : m_points3D_external_stored(false),
170 m_rangeImage_external_stored(false),
172 hasRangeImage(false),
173 range_is_depth(true),
174 hasIntensityImage(false),
175 intensityImageChannel(CH_VISIBLE),
176 hasConfidenceImage(false),
179 cameraParamsIntensity(),
180 relativePoseIntensityWRTDepth(
190 #ifdef COBS3DRANGE_USE_MEMPOOL
292 vector<char> validRange(N);
294 &validRange[0],
sizeof(validRange[0]) * N);
313 #ifdef COBS3DRANGE_USE_MEMPOOL
387 in >> do_have_labels;
446 M.loadFromTextFile(fil);
449 M.extractRow(0,
const_cast<std::vector<float>&
>(
points3D_x));
450 M.extractRow(1,
const_cast<std::vector<float>&
>(
points3D_y));
451 M.extractRow(2,
const_cast<std::vector<float>&
>(
points3D_z));
457 f >>
const_cast<std::vector<float>&
>(
points3D_x) >>
458 const_cast<std::vector<float>&
>(
points3D_y) >>
507 out_path = CImage::getImagesPathBase();
508 size_t N = CImage::getImagesPathBase().size() - 1;
509 if (CImage::getImagesPathBase()[N] !=
'/' &&
510 CImage::getImagesPathBase()[N] !=
'\\')
527 out_path = CImage::getImagesPathBase();
528 size_t N = CImage::getImagesPathBase().size() - 1;
529 if (CImage::getImagesPathBase()[N] !=
'/' &&
530 CImage::getImagesPathBase()[N] !=
'\\')
553 const string savedDir = CImage::getImagesPathBase();
554 CImage::setImagesPathBase(use_this_base_dir);
555 const string real_absolute_file_path =
557 CImage::setImagesPathBase(savedDir);
599 const string savedDir = CImage::getImagesPathBase();
600 CImage::setImagesPathBase(use_this_base_dir);
601 const string real_absolute_file_path =
603 CImage::setImagesPathBase(savedDir);
623 #define CALIB_DECIMAT 15
636 : obs(obs_), z_offset(z_offset_)
643 if (
x.size() < 4 + 4)
x.resize(4 + 4);
650 for (
size_t i = 0; i < 4; i++)
x[4 + i] = camPar.
dist[i];
659 for (
size_t i = 0; i < 4; i++) camPar.
dist[i] =
x[4 + i];
678 const size_t idx = nC *
r +
c;
689 const double x = P.
x / P.
z;
690 const double y = P.
y / P.
z;
694 const double r4 =
square(r2);
711 err.push_back(
c - pixel.
x);
712 err.push_back(
r - pixel.
y);
729 const double camera_offset)
740 TMyLevMar::TResultInfo info;
758 increments_x.assign(1e-4);
768 1e-3, 1e-9, 1e-9,
false);
770 const double avr_px_err =
773 out_camParams.
ncols = nC;
774 out_camParams.
nrows = nR;
785 const unsigned int& r2,
const unsigned int& c1,
const unsigned int& c2)
790 ASSERT_((r1 < r2) && (c1 < c2));
791 ASSERT_((r2 < rows) && (c2 < cols));
827 for (
unsigned int i = r1; i < r2; i++)
828 for (
unsigned int j = c1; j < c2; j++)
847 #ifdef COBS3DRANGE_USE_MEMPOOL
910 #ifdef COBS3DRANGE_USE_MEMPOOL
939 static const double EPSILON = 1e-7;
992 const double real_FOV_left = atan2(cx, fx);
993 const double real_FOV_right = atan2(nCols - 1 - cx, fx);
996 const float FOV_equiv = 2. * std::max(real_FOV_left, real_FOV_right);
1003 const size_t nLaserRays =
1021 const float tan_min = -tan(std::abs(sp.
angle_inf));
1022 const float tan_max = tan(std::abs(sp.
angle_sup));
1026 std::vector<float> vert_ang_tan(nRows);
1027 for (
size_t r = 0;
r < nRows;
r++)
1028 vert_ang_tan[
r] =
static_cast<float>((cy -
r) / fy);
1038 double ang = -FOV_equiv * 0.5;
1039 const double A_ang = FOV_equiv / (nLaserRays - 1);
1048 for (
size_t i = 0; i < nLaserRays; i++, ang += A_ang)
1051 const double tan_ang = tan(ang);
1054 static_cast<size_t>(std::max(0.0, cx + fx * tan_ang)),
1057 bool any_valid =
false;
1058 float closest_range = out_scan2d.
maxRange;
1060 for (
size_t r = 0;
r < nRows;
r++)
1066 const float this_point_tan = vert_ang_tan[
r] * D;
1067 if (this_point_tan > tan_min && this_point_tan < tan_max)
1079 i, closest_range * std::sqrt(1.0 + tan_ang * tan_ang));
1094 mrpt::make_aligned_shared<mrpt::opengl::CPointCloud>();
1097 const std::vector<float>&xs = pc->getArrayX(), &ys = pc->getArrayY(),
1098 &zs = pc->getArrayZ();
1099 const size_t N = xs.size();
1101 const double A_ang = FOV_equiv / (nLaserRays - 1);
1102 const double ang0 = -FOV_equiv * 0.5;
1104 for (
size_t i = 0; i < N; i++)
1106 if (zs[i] < sp.
z_min || zs[i] > sp.
z_max)
continue;
1108 const double phi_wrt_origin = atan2(ys[i], xs[i]);
1110 int i_range = (phi_wrt_origin - ang0) / A_ang;
1111 if (i_range < 0 || i_range >=
int(nLaserRays))
continue;
1113 const float r_wrt_origin = ::hypotf(xs[i], ys[i]);
1114 if (out_scan2d.
scan[i_range] > r_wrt_origin)
1128 o <<
"Homogeneous matrix for the sensor's 3D pose, relative to robot "
1133 o <<
"maxRange = " <<
maxRange <<
" m" << endl;
1135 o <<
"Has 3D point cloud? ";
1138 o <<
"YES: " <<
points3D_x.size() <<
" points";
1143 o <<
" (embedded)." << endl;
1148 o <<
"Has raw range data? " << (
hasRangeImage ?
"YES" :
"NO");
1155 o <<
" (embedded)." << endl;
1165 o <<
" (embedded).\n";
1167 o <<
"Source channel: "
1181 o <<
" (embedded)." << endl;
1184 o << endl <<
"Has pixel labels? " << (
hasPixelLabels() ?
"YES" :
"NO");
1187 o <<
" Human readable labels:" << endl;
1191 o <<
" label[" << it->first <<
"]: '" << it->second <<
"'" << endl;
1195 o <<
"Depth camera calibration parameters:" << endl;
1201 o << endl <<
"Intensity camera calibration parameters:" << endl;
1209 <<
"Pose of the intensity cam. wrt the depth cam:\n"
1223 out << BITFIELD_BYTES;
1225 this->internal_writeToStream(out);
1228 template <
unsigned int BYTES_REQUIRED_>
1235 pixelLabels.resize(nR, nC);
1239 in >> pixelLabelNames;
1241 template <
unsigned int BYTES_REQUIRED_>
1250 for (
uint32_t r = 0;
r < nR;
r++) out << pixelLabels.coeff(
r,
c);
1252 out << pixelLabelNames;
1268 in >> bitfield_bytes;
1273 switch (bitfield_bytes)
1292 throw std::runtime_error(
1293 "Unknown type of pixelLabel inner class while "
1312 z_min(-std::numeric_limits<double>::max()),
1313 z_max(std::numeric_limits<double>::max()),
1314 oversampling_ratio(1.2),
1315 use_origin_sensor_pose(false)
mrpt::config::CConfigFileMemory CConfigFileMemory
void keep_min(T &var, const K test_val)
If the second argument is below the first one, set the first argument to this lower value.
A pair (x,y) of pixel coordinates (subpixel resolution).
TIntensityChannelID
Enum type for intensityImageChannel.
const mrpt::math::CMatrix * rangeMask_max
std::string sensorLabel
An arbitrary label that can be used to identify the sensor.
POOLABLE_DATA * request_memory(const DATA_PARAMS ¶ms)
Request a block of data which fulfils the size requirements stated in params.
std::vector< float > pts_x
mrpt::math::CMatrixDouble33 intrinsicParams
Matrix of intrinsic parameters (containing the focal length and principal point coordinates)
Mainly for internal use within CObservation3DRangeScan::project3DPointsFromDepthImageInto()
void setScanRange(const size_t i, const float val)
#define ASSERT_ABOVE_(__A, __B)
virtual void load() const override
Makes sure all images and other fields which may be externally stored are loaded in memory.
std::string getExternalStorageFile() const noexcept
Only if isExternallyStored() returns true.
std::vector< float > pts_y
bool range_is_depth
true: Kinect-like ranges: entries of rangeImage are distances along the +X axis; false: Ranges in ran...
const Scalar * const_iterator
float maxRange
The maximum range allowed by the device, in meters (e.g.
bool rightToLeft
The scanning direction: true=counterclockwise; false=clockwise.
bool hasPoints3D
true means the field points3D contains valid data.
void dump_to_pool(const DATA_PARAMS ¶ms, POOLABLE_DATA *block)
Saves the passed data block (characterized by params) to the pool.
std::string points3D_getExternalStorageFile() const
static TPixelLabelInfoBase * readAndBuildFromStream(mrpt::serialization::CArchive &in)
Used in CObservation3DRangeScan::project3DPointsFromDepthImageInto()
#define ASSERT_EQUAL_(__A, __B)
Assert comparing two values, reporting their actual values upon failure.
T3DPointsTo2DScanParams()
double fx() const
Get the value of the focal length x-value (in pixels).
mrpt::img::TCamera cameraParamsIntensity
Projection parameters of the intensity (graylevel or RGB) camera.
bool do_range_filter(size_t r, size_t c, const float D) const
Returns true if the point (r,c) with depth D passes all filters.
A "CObservation"-derived class that represents a 2D range scan measurement (typically from a laser sc...
Column vector, like Eigen::MatrixX*, but automatically initialized to zeros since construction.
void vector_strong_clear(VECTOR_T &v)
Like calling a std::vector<>'s clear() method, but really forcing deallocating the memory.
static double recoverCameraCalibrationParameters(const CObservation3DRangeScan &in_obs, mrpt::img::TCamera &out_camParams, const double camera_offset=0.01)
A Levenberg-Marquart-based optimizer to recover the calibration parameters of a 3D camera given a ran...
void convertTo2DScan(mrpt::obs::CObservation2DRangeScan &out_scan2d, const T3DPointsTo2DScanParams &scanParams, const TRangeImageFilterParams &filterParams=TRangeImageFilterParams())
Convert this 3D observation into an "equivalent 2D fake laser scan", with a configurable vertical FOV...
void internal_writeToStream(mrpt::serialization::CArchive &out) const override
std::string points3D_getExternalStorageFileAbsolutePath() const
bool m_points3D_external_stored
If set to true, m_points3D_external_file is valid.
std::vector< float > points3D_z
std::string rangeImage_getExternalStorageFileAbsolutePath() const
@ MATRIX_FORMAT_FIXED
fixed floating point 'f'
Virtual interface to all pixel-label information structs.
uint32_t ncols
Camera resolution.
size_t WH
Width*Height, that is, the number of 3D points.
void points3D_convertToExternalStorage(const std::string &fileName, const std::string &use_this_base_dir)
Users won't normally want to call this, it's only used from internal MRPT programs.
static CObservation3DRangeScan::TCached3DProjTables lut_3dproj
std::vector< float > pts_z
double angle_sup
(Default=5 degrees) [Only if use_origin_sensor_pose=false] The upper & lower half-FOV angle (in radia...
A generic system for versatile memory pooling.
bool isSuitable(const CObservation3DRangeScan_Ranges_MemPoolParams &req) const
void getRotationMatrix(mrpt::math::CMatrixDouble33 &ROT) const
Get the 3x3 rotation matrix.
This is the global namespace for all Mobile Robot Programming Toolkit (MRPT) libraries.
void resizeScan(const size_t len)
Resizes all data vectors to allocate a given number of scan rays.
bool hasPixelLabels() const
Returns true if the field CObservation3DRangeScan::pixelLabels contains a non-NULL smart pointer.
bool rangeImage_isExternallyStored() const
#define ASSERT_(f)
Defines an assertion mechanism.
void setScanRangeValidity(const size_t i, const bool val)
T square(const T x)
Inline function for the square of a number.
Classes for 2D/3D geometry representation, both of single values and probability density distribution...
std::vector< float > points3D_y
Used in CObservation3DRangeScan::convertTo2DScan()
void rangeImage_setSize(const int HEIGHT, const int WIDTH)
Similar to calling "rangeImage.setSize(H,W)" but this method provides memory pooling to speed-up the ...
double cy() const
Get the value of the principal point y-coordinate (in pixels).
std::shared_ptr< CPointCloud > Ptr
This namespace contains representation of robot actions and observations.
dynamic_vector< double > CVectorDouble
Column vector, like Eigen::MatrixXd, but automatically initialized to zeros since construction.
double focalLengthMeters
The focal length of the camera, in meters (can be used among 'intrinsicParams' to determine the pixel...
mrpt::system::TTimeStamp timestamp
The associated UTC time-stamp.
void resizePoints3DVectors(const size_t nPoints)
Use this method instead of resizing all three points3D_x, points3D_y & points3D_z to allow the usage ...
Virtual base class for "archives": classes abstracting I/O streams.
mrpt::img::TCamera cameraParams
Projection parameters of the depth camera.
A matrix of dynamic size.
void getDescriptionAsText(std::ostream &o) const override
Build a detailed, multi-line textual description of the observation contents and dump it to the outpu...
double fy() const
Get the value of the focal length y-value (in pixels).
void cost_func(const CVectorDouble &par, const TLevMarData &d, CVectorDouble &err)
void mempool_donate_xyz_buffers(CObservation3DRangeScan &obs)
TPixelLabelInfoBase::Ptr pixelLabels
All information about pixel labeling is stored in this (smart pointer to) structure; refer to TPixelL...
mrpt::poses::CPose3D relativePoseIntensityWRTDepth
Relative pose of the intensity camera wrt the depth camera (which is the coordinates origin for this ...
std::string fileNameChangeExtension(const std::string &filename, const std::string &newExtension)
Replace the filename extension by another one.
GLdouble GLdouble GLdouble r
size_t getScanSize() const
Get the size of the scan pointcloud.
const mrpt::math::CMatrix * rangeMask_min
(Default: nullptr) If provided, each data range will be tested to be greater-than (rangeMask_min) or ...
virtual ~CObservation3DRangeScan()
Destructor.
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.
mrpt::img::CImage intensityImage
If hasIntensityImage=true, a color or gray-level intensity image of the same size than "rangeImage".
mrpt::poses::CPose3D sensorPose
The 6D pose of the sensor on the robot.
void serializeFrom(mrpt::serialization::CArchive &in, uint8_t serial_version) override
Pure virtual method for reading (deserializing) from an abstract archive.
This class is a "CSerializable" wrapper for "CMatrixFloat".
Declares a class derived from "CObservation" that encapsules a 3D range scan measurement,...
float aperture
The "aperture" or field-of-view of the range finder, in radians (typically M_PI = 180 degrees).
void swap(CImage &o)
Very efficient swap of two images (just swap the internal pointers)
double cx() const
Get the value of the principal point x-coordinate (in pixels).
virtual void getDescriptionAsText(std::ostream &o) const
Build a detailed, multi-line textual description of the observation contents and dump it to the outpu...
bool isSuitable(const CObservation3DRangeScan_Points_MemPoolParams &req) const
TIntensityChannelID intensityImageChannel
The source of the intensityImage; typically the visible channel.
Saves data to a file and transparently compress the data using the given compression level.
static bool EXTERNALS_AS_TEXT_value
A class used to store a 3D pose (a 3D translation + a rotation in 3D).
double x
X,Y,Z coordinates.
bool hasIntensityImage
true means the field intensityImage contains valid data
std::string m_rangeImage_external_file
rangeImage is in CImage::getImagesPathBase()+<this_file_name>
std::vector< float > points3D_x
If hasPoints3D=true, the (X,Y,Z) coordinates of the 3D point cloud detected by the camera.
bool hasRangeImage
true means the field rangeImage contains valid data
float stdError
The "sigma" error of the device in meters, used while inserting the scan in an occupancy grid.
void mempool_donate_range_matrix(CObservation3DRangeScan &obs)
An implementation of the Levenberg-Marquardt algorithm for least-square minimization.
double z_min
(Default:-inf, +inf) [Only if use_origin_sensor_pose=true] Only obstacle points with Z coordinates wi...
std::vector< uint16_t > points3D_idxs_y
Structure to hold the parameters of a pinhole camera model.
void saveToConfigFile(const std::string §ion, mrpt::config::CConfigFileBase &cfg) const
Save as a config block:
mrpt::img::CImage confidenceImage
If hasConfidenceImage=true, an image with the "confidence" value [range 0-255] as estimated by the ca...
void getContent(std::string &str) const
Return the current contents of the virtual "config file".
std::vector< uint16_t > points3D_idxs_x
If hasPoints3D=true, the (x,y) pixel coordinates for each (X,Y,Z) point in points3D_x,...
MATRIX44 getHomogeneousMatrixVal() const
Returns the corresponding 4x4 homogeneous transformation matrix for the point(translation) or pose (t...
#define IMPLEMENTS_SERIALIZABLE(class_name, base, NameSpace)
This must be inserted in all CSerializable classes implementation files.
std::string extractFileExtension(const std::string &filePath, bool ignore_gz=false)
Extract the extension of a filename.
A numeric matrix of compile-time fixed size.
void serializeTo(mrpt::serialization::CArchive &out) const override
Pure virtual method for writing (serializing) to an abstract archive.
std::string rangeImage_getExternalStorageFile() const
float maxRange
The maximum range allowed by the device, in meters (e.g.
bool hasConfidenceImage
true means the field confidenceImage contains valid data
CArchiveStreamBase< STREAM > archiveFrom(STREAM &s)
Helper function to create a templatized wrapper CArchive object for a: MRPT's CStream,...
std::string m_points3D_external_file
3D points are in CImage::getImagesPathBase()+<this_file_name>
mrpt::containers::ContainerReadOnlyProxyAccessor< mrpt::aligned_std_vector< float > > scan
The range values of the scan, in meters.
void unload() const noexcept
For external storage image objects only, this method unloads the image from memory (or does nothing i...
std::array< double, 5 > dist
[k1 k2 t1 t2 k3] -> k_i: parameters of radial distortion, t_i: parameters of tangential distortion (d...
mrpt::math::CMatrix rangeImage
If hasRangeImage=true, a matrix of floats with the range data as captured by the camera (in meters)
bool doDepthAndIntensityCamerasCoincide() const
Return true if relativePoseIntensityWRTDepth equals the pure rotation (0,0,0,-90deg,...
GLsizei const GLfloat * value
uint8_t serializeGetVersion() const override
Must return the current versioning number of the object.
std::vector< uint16_t > idxs_x
for each point, the corresponding (x,y) pixel coordinates
@ CH_VISIBLE
Grayscale or RGB visible channel of the camera sensor.
void getZoneAsObs(CObservation3DRangeScan &obs, const unsigned int &r1, const unsigned int &r2, const unsigned int &c1, const unsigned int &c2)
Extract a ROI of the 3D observation as a new one.
void rangeImage_convertToExternalStorage(const std::string &fileName, const std::string &use_this_base_dir)
Users won't normally want to call this, it's only used from internal MRPT programs.
Declares a class that represents any robot's observation.
void swap(CObservation &o)
Swap with another observation, ONLY the data defined here in the base class CObservation.
This base provides a set of functions for maths stuff.
void project3DPointsFromDepthImageInto(POINTMAP &dest_pointcloud, const T3DPointsProjectionParams &projectParams, const TRangeImageFilterParams &filterParams=TRangeImageFilterParams())
Project the RGB+D images into a 3D point cloud (with color if the target map supports it) and optiona...
void loadFromTextFile(const std::string &file)
Load matrix from a text file, compatible with MATLAB text format.
void cam2vec(const TCamera &camPar, CVectorDouble &x)
bool points3D_isExternallyStored() const
GLsizei const GLchar ** string
virtual void unload() override
Unload all images, for the case they being delayed-load images stored in external files (othewise,...
This class implements a config file-like interface over a memory-stored string list.
virtual void internal_readFromStream(mrpt::serialization::CArchive &in)=0
bool use_origin_sensor_pose
(Default:false) If false, the conversion will be such that the 2D observation pose on the robot coinc...
mrpt::math::CMatrix rangeImage
double oversampling_ratio
(Default=1.2=120%) How many more laser scans rays to create (read docs for CObservation3DRangeScan::c...
static CGenericMemoryPool< DATA_PARAMS, POOLABLE_DATA > * getInstance(const size_t max_pool_entries=5)
Construct-on-first-use (~singleton) pattern: Return the unique instance of this class for a given tem...
#define MRPT_THROW_UNKNOWN_SERIALIZATION_VERSION(__V)
For use in CSerializable implementations.
bool takeIntoAccountSensorPoseOnRobot
(Default: false) If false, local (sensor-centric) coordinates of points are generated.
mrpt::poses::CPose3D sensorPose
The 6D pose of the sensor on the robot at the moment of starting the scan.
void swap(CObservation3DRangeScan &o)
Very efficient method to swap the contents of two observations.
void WriteBufferFixEndianness(const T *ptr, size_t ElementCount)
Writes a sequence of elemental datatypes, taking care of reordering their bytes from the running arch...
TLevMarData(const CObservation3DRangeScan &obs_, const double z_offset_)
bool strCmpI(const std::string &s1, const std::string &s2)
Return true if the two strings are equal (case insensitive)
void extract_patch(CImage &patch, const unsigned int col=0, const unsigned int row=0, const unsigned int width=1, const unsigned int height=1) const
Extract a patch from this image, saveing it into "patch" (its previous contents will be overwritten).
std::vector< uint16_t > idxs_y
void vec2cam(const CVectorDouble &x, TCamera &camPar)
Used in CObservation3DRangeScan::project3DPointsFromDepthImageInto()
unsigned __int32 uint32_t
GLenum const GLfloat * params
bool isExternallyStored() const noexcept
See setExternalStorage().
bool m_rangeImage_external_stored
If set to true, m_rangeImage_external_file is valid.
const CObservation3DRangeScan & obs
void writeToStream(mrpt::serialization::CArchive &out) const
mrpt::math::CArrayDouble< 3 > m_coords
The translation vector [x,y,z] access directly or with x(), y(), z() setter/getter methods.
double DEG2RAD(const double x)
Degrees to radians.
Page generated by Doxygen 1.8.17 for MRPT 1.9.9 Git: ad3a9d8ae Tue May 1 23:10:22 2018 -0700 at mié 12 jul 2023 10:03:34 CEST | |