10 #ifndef CRANGESCANOPS_IMPL_H 11 #define CRANGESCANOPS_IMPL_H 19 template <
class GRAPH_T>
40 initial_pose = *initial_pose_in;
44 params.icp.Align(&m1, &m2, initial_pose, &running_time, (
void*)&info);
47 rel_edge->copyFrom(*pdf);
50 if (icp_info) *icp_info = info;
54 template <
class GRAPH_T>
65 mrpt::format(
"Laser scan doesn't contain valid range image"));
68 mrpt::format(
"Laser scan doesn't contain valid range image"));
91 params.icp.Align3D(&m1, &m2, initial_pose, &running_time, (
void*)&info);
97 if (fabs(pdf->getMeanVal().z()) < 0.1)
99 rel_edge->copyFrom(*pdf);
107 if (icp_info) *icp_info = info;
112 template <
class GRAPH_T>
119 size_t map_size = m->
size();
124 size_t conservative_keep_point_every = map_size / low_lim;
126 std::min(keep_point_every, conservative_keep_point_every);
130 std::vector<bool> deletion_mask(map_size,
true);
131 for (
size_t i = 0; i != map_size; ++i)
133 if (i % keep_point_every == 0)
135 deletion_mask[i] =
false;
146 template <
class GRAPH_T>
153 bool success =
false;
158 mrpt::make_aligned_shared<mrpt::obs::CObservation2DRangeScan>();
161 if (scan3D_in->hasRangeImage)
163 scan3D_in->convertTo2DScan(**scan2D_out,
params.conversion_params);
168 std::cout <<
"No valid rangeImage found" << std::endl;
179 template <
class GRAPH_T>
184 template <
class GRAPH_T>
189 template <
class GRAPH_T>
196 "3D=>2D LaserScan Conversion Sensor label = %s\n",
197 conversion_params.sensorLabel.c_str());
199 "3D=>2D LaserScan Conversion angle sup = %.2f deg\n",
202 "3D=>2D LaserScan Conversion angle inf = %.2f deg\n",
205 "3D=>2D LaserScan Conversion oversampling ratio = %.2f\n",
206 conversion_params.oversampling_ratio);
208 "3D=>2D LaserScan Conversion Z minimum = %.2f\n",
209 conversion_params.z_min);
211 icp.options.dumpToTextStream(out);
215 template <
class GRAPH_T>
221 conversion_params.sensorLabel =
source.read_string(
222 section,
"conversion_sensor_label",
"KINECT_TO_2D_SCAN",
false);
224 source.read_double(section,
"conversion_angle_sup", 10,
false));
226 source.read_double(section,
"conversion_angle_inf", 10,
false));
227 conversion_params.oversampling_ratio =
source.read_double(
228 section,
"conversion_oversampling_ratio", 1.1,
false);
229 conversion_params.z_min =
source.read_double(
230 section,
"conversion_z_min", 0,
false);
233 icp.options.loadFromConfigFile(
source,
"ICP");
235 has_read_config =
true;
std::string format(const char *fmt,...) MRPT_printf_format_check(1
A std::string version of C sprintf.
double DEG2RAD(const double x)
Degrees to radians.
void getICPEdge(const mrpt::obs::CObservation2DRangeScan &from, const mrpt::obs::CObservation2DRangeScan &to, constraint_t *rel_edge, const mrpt::poses::CPose2D *initial_pose=nullptr, mrpt::slam::CICP::TReturnInfo *icp_info=nullptr)
Align the 2D range scans provided and fill the potential edge that can transform the one into the oth...
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.
std::shared_ptr< CObservation3DRangeScan > Ptr
void decimatePointsMap(mrpt::maps::CPointsMap *m, size_t keep_point_every=4, size_t low_lim=0)
Reduce the size of the given CPointsMap by keeping one out of "keep_point_every" points.
A cloud of points in 2D or 3D, which can be built from a sequence of laser scans. ...
void dumpToTextStream(mrpt::utils::CStream &out) const
This method should clearly display all the contents of the structure in textual form, sending it to a CStream.
std::shared_ptr< CObservation2DRangeScan > Ptr
This class allows loading and storing values and vectors of different types from a configuration text...
void loadFromConfigFile(const mrpt::utils::CConfigFileBase &source, const std::string §ion)
This method load the options from a ".ini"-like file or memory-stored string list.
This base class is used to provide a unified interface to files,memory buffers,..Please see the deriv...
GRAPH_T::constraint_t constraint_t
Handy typedefs.
A cloud of points in 2D or 3D, which can be built from a sequence of laser scans or other sensors...
std::shared_ptr< CPosePDF > Ptr
double RAD2DEG(const double x)
Radians to degrees.
std::shared_ptr< CPose3DPDF > Ptr
bool hasRangeImage
true means the field rangeImage contains valid data
GLsizei const GLchar ** string
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...
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).
bool convert3DTo2DRangeScan(mrpt::obs::CObservation3DRangeScan::Ptr &scan3D_in, mrpt::obs::CObservation2DRangeScan::Ptr *scan2D_out=nullptr)
Wrapper around the CObservation3DRangeScan::convertTo2DScan corresponding method. ...
The ICP algorithm return information.
GLsizei GLsizei GLchar * source
size_t size() const
Returns the number of stored points in the map.
#define ASSERTMSG_(f, __ERROR_MSG)
GLenum const GLfloat * params
bool insertObservation(const mrpt::obs::CObservation *obs, const mrpt::poses::CPose3D *robotPose=NULL)
Insert the observation information into this map.
void applyDeletionMask(const std::vector< bool > &mask)
Remove from the map the points marked in a bool's array as "true".
virtual int printf(const char *fmt,...) MRPT_printf_format_check(2
Writes a string to the stream in a textual form.