22 #include <gtest/gtest.h> 41 float SCAN_RANGES_1[] = {
42 0.910f, 0.900f, 0.910f, 0.900f, 0.900f, 0.890f, 0.890f,
43 0.880f, 0.890f, 0.880f, 0.880f, 0.880f, 0.880f, 0.880f,
44 0.880f, 0.870f, 0.880f, 0.870f, 0.870f, 0.870f, 0.880f,
45 0.880f, 0.880f, 0.880f, 0.880f, 0.880f, 0.880f, 0.880f,
46 0.880f, 0.880f, 0.880f, 0.880f, 0.880f, 0.880f, 0.880f,
47 0.880f, 0.890f, 0.880f, 0.880f, 0.880f, 0.890f, 0.880f,
48 0.890f, 0.890f, 0.880f, 0.890f, 0.890f, 0.880f, 0.890f,
49 0.890f, 0.890f, 0.890f, 0.890f, 0.890f, 0.900f, 0.900f,
50 0.900f, 0.900f, 0.900f, 0.910f, 0.910f, 0.910f, 0.910f,
51 0.920f, 0.920f, 0.920f, 0.920f, 0.920f, 0.930f, 0.930f,
52 0.930f, 0.930f, 0.940f, 0.940f, 0.950f, 0.950f, 0.950f,
53 0.950f, 0.960f, 0.960f, 0.970f, 0.970f, 0.970f, 0.980f,
54 0.980f, 0.990f, 1.000f, 1.000f, 1.000f, 1.010f, 1.010f,
55 1.020f, 1.030f, 1.030f, 1.030f, 1.040f, 1.050f, 1.060f,
56 1.050f, 1.060f, 1.070f, 1.070f, 1.080f, 1.080f, 1.090f,
57 1.100f, 1.110f, 1.120f, 1.120f, 1.130f, 1.140f, 1.140f,
58 1.160f, 1.170f, 1.180f, 1.180f, 1.190f, 1.200f, 1.220f,
59 1.220f, 1.230f, 1.230f, 1.240f, 1.250f, 1.270f, 1.280f,
60 1.290f, 1.300f, 1.320f, 1.320f, 1.350f, 1.360f, 1.370f,
61 1.390f, 1.410f, 1.410f, 1.420f, 1.430f, 1.450f, 1.470f,
62 1.490f, 1.500f, 1.520f, 1.530f, 1.560f, 1.580f, 1.600f,
63 1.620f, 1.650f, 1.670f, 1.700f, 1.730f, 1.750f, 1.780f,
64 1.800f, 1.830f, 1.850f, 1.880f, 1.910f, 1.940f, 1.980f,
65 2.010f, 2.060f, 2.090f, 2.130f, 2.180f, 2.220f, 2.250f,
66 2.300f, 2.350f, 2.410f, 2.460f, 2.520f, 2.570f, 2.640f,
67 2.700f, 2.780f, 2.850f, 2.930f, 3.010f, 3.100f, 3.200f,
68 3.300f, 3.390f, 3.500f, 3.620f, 3.770f, 3.920f, 4.070f,
69 4.230f, 4.430f, 4.610f, 4.820f, 5.040f, 5.290f, 5.520f,
70 8.970f, 8.960f, 8.950f, 8.930f, 8.940f, 8.930f, 9.050f,
71 9.970f, 9.960f, 10.110f, 13.960f, 18.870f, 19.290f, 81.910f,
72 20.890f, 48.750f, 48.840f, 48.840f, 19.970f, 19.980f, 19.990f,
73 15.410f, 20.010f, 19.740f, 17.650f, 17.400f, 14.360f, 12.860f,
74 11.260f, 11.230f, 8.550f, 8.630f, 9.120f, 9.120f, 8.670f,
75 8.570f, 7.230f, 7.080f, 7.040f, 6.980f, 6.970f, 5.260f,
76 5.030f, 4.830f, 4.620f, 4.440f, 4.390f, 4.410f, 4.410f,
77 4.410f, 4.430f, 4.440f, 4.460f, 4.460f, 4.490f, 4.510f,
78 4.540f, 3.970f, 3.820f, 3.730f, 3.640f, 3.550f, 3.460f,
79 3.400f, 3.320f, 3.300f, 3.320f, 3.320f, 3.340f, 2.790f,
80 2.640f, 2.600f, 2.570f, 2.540f, 2.530f, 2.510f, 2.490f,
81 2.490f, 2.480f, 2.470f, 2.460f, 2.460f, 2.460f, 2.450f,
82 2.450f, 2.450f, 2.460f, 2.460f, 2.470f, 2.480f, 2.490f,
83 2.490f, 2.520f, 2.510f, 2.550f, 2.570f, 2.610f, 2.640f,
84 2.980f, 3.040f, 3.010f, 2.980f, 2.940f, 2.920f, 2.890f,
85 2.870f, 2.830f, 2.810f, 2.780f, 2.760f, 2.740f, 2.720f,
86 2.690f, 2.670f, 2.650f, 2.630f, 2.620f, 2.610f, 2.590f,
87 2.560f, 2.550f, 2.530f, 2.510f, 2.500f, 2.480f, 2.460f,
88 2.450f, 2.430f, 2.420f, 2.400f, 2.390f, 2.380f, 2.360f,
89 2.350f, 2.340f, 2.330f, 2.310f, 2.300f, 2.290f, 2.280f,
90 2.270f, 2.260f, 2.250f, 2.240f, 2.230f, 2.230f, 2.220f,
91 2.210f, 2.200f, 2.190f, 2.180f, 2.170f, 1.320f, 1.140f,
92 1.130f, 1.130f, 1.120f, 1.120f, 1.110f, 1.110f, 1.110f,
93 1.110f, 1.100f, 1.110f, 1.100f};
94 char SCAN_VALID_1[] = {
95 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
96 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
97 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
98 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
99 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
100 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
101 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
102 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
103 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
104 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
105 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
106 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
107 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
108 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
109 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
110 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
112 float SCAN_RANGES_2[] = {
113 0.720f, 0.720f, 0.720f, 0.720f, 0.720f, 0.720f, 0.710f,
114 0.720f, 0.710f, 0.710f, 0.710f, 0.710f, 0.710f, 0.710f,
115 0.710f, 0.710f, 0.710f, 0.710f, 0.710f, 0.710f, 0.720f,
116 0.720f, 0.720f, 0.720f, 0.730f, 0.730f, 0.730f, 0.730f,
117 0.730f, 0.730f, 0.730f, 0.740f, 0.740f, 0.740f, 0.740f,
118 0.740f, 0.740f, 0.750f, 0.750f, 0.750f, 0.750f, 0.750f,
119 0.750f, 0.750f, 0.750f, 0.760f, 0.760f, 0.760f, 0.760f,
120 0.760f, 0.760f, 0.760f, 0.760f, 0.770f, 0.770f, 0.770f,
121 0.770f, 0.780f, 0.780f, 0.780f, 0.790f, 0.790f, 0.800f,
122 0.800f, 0.800f, 0.800f, 0.800f, 0.800f, 0.810f, 0.810f,
123 0.820f, 0.820f, 0.830f, 0.830f, 0.840f, 0.840f, 0.850f,
124 0.850f, 0.860f, 0.860f, 0.860f, 0.870f, 0.870f, 0.880f,
125 0.890f, 0.890f, 0.900f, 0.900f, 0.910f, 0.920f, 0.930f,
126 0.930f, 0.940f, 0.940f, 0.940f, 0.950f, 0.960f, 0.960f,
127 0.970f, 0.980f, 0.990f, 1.000f, 1.010f, 1.020f, 1.030f,
128 1.040f, 1.050f, 1.060f, 1.070f, 1.080f, 1.080f, 1.100f,
129 1.100f, 1.120f, 1.120f, 1.140f, 1.140f, 1.170f, 1.160f,
130 1.180f, 1.190f, 1.210f, 1.220f, 1.240f, 1.250f, 1.280f,
131 1.290f, 1.300f, 1.320f, 1.340f, 1.350f, 1.380f, 1.390f,
132 1.420f, 1.440f, 1.460f, 1.470f, 1.500f, 1.520f, 1.550f,
133 1.570f, 1.600f, 1.630f, 1.670f, 1.690f, 1.730f, 1.760f,
134 1.790f, 1.820f, 1.870f, 1.900f, 1.940f, 1.970f, 2.030f,
135 2.080f, 2.130f, 2.170f, 2.230f, 2.280f, 2.340f, 2.400f,
136 2.490f, 2.550f, 2.630f, 2.700f, 2.810f, 2.880f, 3.010f,
137 3.090f, 3.240f, 3.340f, 3.500f, 3.620f, 3.810f, 3.950f,
138 4.180f, 4.340f, 4.620f, 8.170f, 8.140f, 8.150f, 8.120f,
139 8.110f, 8.100f, 8.100f, 8.300f, 9.040f, 9.130f, 9.130f,
140 13.030f, 18.050f, 19.150f, 81.910f, 20.070f, 47.980f, 48.040f,
141 48.030f, 19.140f, 19.180f, 19.180f, 19.190f, 14.550f, 19.210f,
142 16.850f, 16.840f, 7.800f, 7.770f, 7.770f, 7.750f, 7.770f,
143 7.760f, 7.780f, 7.760f, 8.320f, 8.350f, 8.350f, 8.090f,
144 7.720f, 7.730f, 6.430f, 6.360f, 6.290f, 6.260f, 6.230f,
145 6.220f, 6.160f, 5.800f, 4.510f, 4.410f, 4.240f, 4.140f,
146 4.000f, 3.910f, 3.790f, 3.680f, 3.660f, 3.680f, 3.680f,
147 3.700f, 3.710f, 3.730f, 3.730f, 3.760f, 3.770f, 3.790f,
148 3.820f, 3.850f, 3.900f, 3.940f, 3.980f, 3.250f, 3.180f,
149 3.140f, 3.070f, 3.030f, 2.970f, 2.930f, 2.880f, 2.850f,
150 2.790f, 2.760f, 2.710f, 2.680f, 2.660f, 2.670f, 2.690f,
151 2.710f, 2.720f, 2.740f, 2.760f, 2.770f, 2.780f, 2.800f,
152 2.170f, 2.120f, 2.090f, 2.060f, 2.020f, 2.010f, 1.990f,
153 1.980f, 1.970f, 1.960f, 1.950f, 1.950f, 1.940f, 1.940f,
154 1.950f, 1.940f, 1.940f, 1.950f, 1.930f, 1.940f, 1.940f,
155 1.940f, 1.940f, 1.940f, 1.950f, 1.960f, 1.960f, 1.980f,
156 1.980f, 2.000f, 2.010f, 2.030f, 2.060f, 2.090f, 2.120f,
157 2.190f, 2.560f, 2.540f, 2.530f, 2.520f, 2.500f, 2.490f,
158 2.470f, 2.460f, 2.450f, 2.440f, 2.420f, 2.410f, 2.400f,
159 2.390f, 2.380f, 2.370f, 2.360f, 2.350f, 2.340f, 2.340f,
160 2.330f, 2.320f, 2.310f, 2.300f, 2.290f, 2.290f, 2.290f,
161 2.280f, 2.270f, 2.260f, 2.260f, 2.250f, 2.240f, 2.240f,
162 2.230f, 2.230f, 2.220f, 2.220f, 2.210f, 2.210f, 2.200f,
163 2.200f, 2.190f, 2.190f, 2.190f, 2.180f, 2.180f, 2.170f,
164 2.170f, 2.170f, 2.160f, 2.160f};
165 char SCAN_VALID_2[] = {
166 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
167 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
168 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
169 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
170 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
171 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
172 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
173 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
174 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
175 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
176 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
177 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
178 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
179 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
180 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
181 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
183 #define SCANS_SIZE (sizeof(SCAN_RANGES_1) / sizeof(SCAN_RANGES_1[0])) 219 ICP.
Align(&m1, &m2, initialPose, &runningTime, (
void*)&info);
234 EXPECT_NEAR(good_pose.
distanceTo(pdf->getMeanVal()), 0, 0.02);
239 CSphere::Ptr sph = mrpt::make_aligned_shared<CSphere>(0.5);
240 sph->setLocation(0, 0, 0);
241 sph->setColor(1, 0, 0);
244 CDisk::Ptr pln = mrpt::make_aligned_shared<opengl::CDisk>();
245 pln->setDiskRadius(2);
247 pln->setColor(0.8, 0, 0);
251 CDisk::Ptr pln = mrpt::make_aligned_shared<opengl::CDisk>();
252 pln->setDiskRadius(2);
255 pln->setColor(0.9, 0, 0);
272 const size_t HOW_MANY_YAWS = 150;
273 const size_t HOW_MANY_PITCHS = 150;
276 vector<CObservation2DRangeScan> sequence_scans1, sequence_scans2;
282 CPose3D SCAN2_POSE_ERROR(0.15, -0.07, 0.10, -0.03, 0.1, 0.1);
290 mrpt::make_aligned_shared<CGridPlaneXY>(-20, 20, -20, 20, 0, 1);
291 plane1->setColor(0.3, 0.3, 0.3);
292 scene1->insert(plane1);
293 scene2->insert(plane1);
294 scene3->insert(plane1);
297 generateObjects(world);
298 scene1->insert(world);
302 mrpt::make_aligned_shared<CAngularObservationMesh>();
304 mrpt::make_aligned_shared<CAngularObservationMesh>();
306 CAngularObservationMesh::trace2DSetOfRays(
307 scene1, viewpoint1, aom1,
308 CAngularObservationMesh::TDoubleRange::CreateFromAperture(
309 M_PI, HOW_MANY_PITCHS),
310 CAngularObservationMesh::TDoubleRange::CreateFromAperture(
311 M_PI, HOW_MANY_YAWS));
312 CAngularObservationMesh::trace2DSetOfRays(
313 scene1, viewpoint2, aom2,
314 CAngularObservationMesh::TDoubleRange::CreateFromAperture(
315 M_PI, HOW_MANY_PITCHS),
316 CAngularObservationMesh::TDoubleRange::CreateFromAperture(
317 M_PI, HOW_MANY_YAWS));
322 origin1->setPose(viewpoint1);
323 origin1->setScale(0.6f);
324 scene1->insert(origin1);
325 scene2->insert(origin1);
329 origin2->setPose(viewpoint2);
330 origin2->setScale(0.6f);
331 scene1->insert(origin2);
332 scene2->insert(origin2);
338 aom1->generatePointCloud(&M1);
339 aom2->generatePointCloud(&M2);
355 scene2->insert(PTNS1);
356 scene2->insert(PTNS2);
372 &run_time, &icp_info);
383 <<
"ICP output: mean= " <<
mean << endl
384 <<
"Real displacement: " << SCAN2_POSE_ERROR << endl;
Classes for serialization, sockets, ini-file manipulation, streams, list of properties-values, timewatch, extensions to STL.
void changeCoordinatesReference(const mrpt::poses::CPose2D &b)
Replace each point by (pose compounding operator).
double distanceTo(const CPoseOrPoint< OTHERCLASS > &b) const
Returns the Euclidean distance to another pose/point:
mrpt::math::CVectorDouble getAsVectorVal() const
Return the pose or point as a 1xN vector with all the components (see derived classes for each implem...
float thresholdDist
Initial threshold distance for two points to become a correspondence.
TICPAlgorithm ICP_algorithm
The algorithm to use (default: icpClassic).
mrpt::poses::CPosePDF::Ptr Align(const mrpt::maps::CMetricMap *m1, const mrpt::maps::CMetricMap *m2, const mrpt::poses::CPose2D &grossEst, float *runningTime=nullptr, void *info=nullptr)
The method for aligning a pair of metric maps, aligning only 2D + orientation.
mrpt::poses::CPose3DPDF::Ptr Align3D(const mrpt::maps::CMetricMap *m1, const mrpt::maps::CMetricMap *m2, const mrpt::poses::CPose3D &grossEst, float *runningTime=nullptr, void *info=nullptr)
The method for aligning a pair of metric maps, aligning the full 6D pose.
Several implementations of ICP (Iterative closest point) algorithms for aligning two point maps or a ...
virtual void getAs3DObject(mrpt::opengl::CSetOfObjects::Ptr &outObj) const override
Returns a 3D object representing the map.
A cloud of points in 2D or 3D, which can be built from a sequence of laser scans. ...
TEST_F(ICPTests, AlignScans_icpClassic)
void align2scans(const TICPAlgorithm icp_method)
float ALFA
The scale factor for threshold everytime convergence is achieved.
TConfigParams options
The options employed by the ICP align.
This base provides a set of functions for maths stuff.
std::shared_ptr< CPosePDF > Ptr
unsigned int maxIterations
Maximum number of iterations to run.
std::shared_ptr< CPose3DPDF > Ptr
std::shared_ptr< CSetOfObjects > Ptr
This namespace contains representation of robot actions and observations.
bool doRANSAC
Perform a RANSAC step, mrpt::tfest::se2_l2_robust(), after the ICP convergence, to obtain a better es...
Classes for 2D/3D geometry representation, both of single values and probability density distribution...
TICPAlgorithm
The ICP algorithm selection, used in mrpt::slam::CICP::options mrpt_slam_grp.
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...
static void generateObjects(CSetOfObjects::Ptr &world)
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).
std::shared_ptr< CAngularObservationMesh > Ptr
float smallestThresholdDist
The size for threshold such that iterations will stop, since it is considered precise enough...
CSetOfObjects::Ptr CornerXYZ(float scale=1.0)
Returns three arrows representing a X,Y,Z 3D corner.
std::shared_ptr< COpenGLScene > Ptr
The ICP algorithm return information.
The namespace for 3D scene representation and rendering.
float aperture
The "aperture" or field-of-view of the range finder, in radians (typically M_PI = 180 degrees)...
A RGB color - floats in the range [0,1].
void loadFromVectors(size_t nRays, const float *scanRanges, const char *scanValidity)
std::shared_ptr< CDisk > Ptr
std::shared_ptr< CSphere > Ptr
bool insertObservation(const mrpt::obs::CObservation *obs, const mrpt::poses::CPose3D *robotPose=NULL)
Insert the observation information into this map.
EIGEN_STRONG_INLINE double mean() const
Computes the mean of the entire matrix.
std::shared_ptr< CGridPlaneXY > Ptr
bool rightToLeft
The scanning direction: true=counterclockwise; false=clockwise.