10
10
from numpy .testing import assert_array_almost_equal , assert_array_equal
11
11
12
12
13
- _data = [(i ,2 * i ,3 * i + 0.2 ) for i in range (5 )]
14
- _DATA = \
15
- """0.0, 0.0, 0.2;
16
- 1.0, 2.0, 3.2;
17
- 2.0, 4.0, 6.2;
18
- 3.0, 6.0, 9.2;
19
- 4.0, 8.0, 12.2"""
13
+ _data = [(i , 2 * i , 3 * i + 0.2 ) for i in range (5 )]
14
+ _DATA = """0.0, 0.0, 0.2;
15
+ 1.0, 2.0, 3.2;
16
+ 2.0, 4.0, 6.2;
17
+ 3.0, 6.0, 9.2;
18
+ 4.0, 8.0, 12.2"""
20
19
21
- class TestListIO (unittest .TestCase ):
22
20
21
+ class TestListIO (unittest .TestCase ):
23
22
def setUp (self ):
24
23
self .p = pcl .PointCloud (_data )
25
24
26
25
def testFromList (self ):
27
- for i ,d in enumerate (_data ):
26
+ for i , d in enumerate (_data ):
28
27
pt = self .p [i ]
29
28
assert np .allclose (pt , _data [i ])
30
29
31
30
def testToList (self ):
32
31
l = self .p .to_list ()
33
32
assert np .allclose (l , _data )
34
33
35
- class TestNumpyIO (unittest .TestCase ):
36
34
35
+ class TestNumpyIO (unittest .TestCase ):
37
36
def setUp (self ):
38
37
self .a = np .array (np .mat (_DATA , dtype = np .float32 ))
39
38
self .p = pcl .PointCloud (self .a )
40
39
41
40
def testFromNumpy (self ):
42
- for i ,d in enumerate (_data ):
41
+ for i , d in enumerate (_data ):
43
42
pt = self .p [i ]
44
43
assert np .allclose (pt , _data [i ])
45
44
@@ -49,7 +48,7 @@ def testToNumpy(self):
49
48
50
49
def test_asarray (self ):
51
50
p = pcl .PointCloud (self .p ) # copy
52
- old0 = p [0 ]
51
+ # old0 = p[0]
53
52
a = np .asarray (p ) # view
54
53
a [:] += 6
55
54
assert_array_almost_equal (p [0 ], a [0 ])
@@ -61,43 +60,41 @@ def test_pickle(self):
61
60
p = pickle .loads (s )
62
61
self .assertTrue (np .all (self .a == p .to_array ()))
63
62
64
- #copy the output of seg
65
- SEGDATA = \
66
- """0.352222 -0.151883 2;
67
- -0.106395 -0.397406 1;
68
- -0.473106 0.292602 1;
69
- -0.731898 0.667105 -2;
70
- 0.441304 -0.734766 1;
71
- 0.854581 -0.0361733 1;
72
- -0.4607 -0.277468 4;
73
- -0.916762 0.183749 1;
74
- 0.968809 0.512055 1;
75
- -0.998983 -0.463871 1;
76
- 0.691785 0.716053 1;
77
- 0.525135 -0.523004 1;
78
- 0.439387 0.56706 1;
79
- 0.905417 -0.579787 1;
80
- 0.898706 -0.504929 1"""
81
-
82
- SEGINLIERS = \
83
- """-0.106395 -0.397406 1;
84
- -0.473106 0.292602 1;
85
- 0.441304 -0.734766 1;
86
- 0.854581 -0.0361733 1;
87
- -0.916762 0.183749 1;
88
- 0.968809 0.512055 1;
89
- -0.998983 -0.463871 1;
90
- 0.691785 0.716053 1;
91
- 0.525135 -0.523004 1;
92
- 0.439387 0.56706 1;
93
- 0.905417 -0.579787 1;
94
- 0.898706 -0.504929 1"""
63
+ # copy the output of seg
64
+ SEGDATA = """ 0.352222 -0.151883 2;
65
+ -0.106395 -0.397406 1;
66
+ -0.473106 0.292602 1;
67
+ -0.731898 0.667105 -2;
68
+ 0.441304 -0.734766 1;
69
+ 0.854581 -0.0361733 1;
70
+ -0.4607 -0.277468 4;
71
+ -0.916762 0.183749 1;
72
+ 0.968809 0.512055 1;
73
+ -0.998983 -0.463871 1;
74
+ 0.691785 0.716053 1;
75
+ 0.525135 -0.523004 1;
76
+ 0.439387 0.56706 1;
77
+ 0.905417 -0.579787 1;
78
+ 0.898706 -0.504929 1"""
79
+
80
+ SEGINLIERS = """-0.106395 -0.397406 1;
81
+ -0.473106 0.292602 1;
82
+ 0.441304 -0.734766 1;
83
+ 0.854581 -0.0361733 1;
84
+ -0.916762 0.183749 1;
85
+ 0.968809 0.512055 1;
86
+ -0.998983 -0.463871 1;
87
+ 0.691785 0.716053 1;
88
+ 0.525135 -0.523004 1;
89
+ 0.439387 0.56706 1;
90
+ 0.905417 -0.579787 1;
91
+ 0.898706 -0.504929 1"""
95
92
SEGINLIERSIDX = [1 , 2 , 4 , 5 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 ]
96
93
97
94
SEGCOEFF = [0.0 , 0.0 , 1.0 , - 1.0 ]
98
95
99
- class TestSegmentPlane (unittest .TestCase ):
100
96
97
+ class TestSegmentPlane (unittest .TestCase ):
101
98
def setUp (self ):
102
99
self .a = np .array (np .mat (SEGDATA , dtype = np .float32 ))
103
100
self .p = pcl .PointCloud ()
@@ -111,15 +108,16 @@ def testLoad(self):
111
108
112
109
def testSegmentPlaneObject (self ):
113
110
seg = self .p .make_segmenter ()
114
- seg .set_optimize_coefficients (True )
111
+ seg .set_optimize_coefficients (True )
115
112
seg .set_model_type (pcl .SACMODEL_PLANE )
116
113
seg .set_method_type (pcl .SAC_RANSAC )
117
- seg .set_distance_threshold (0.01 )
114
+ seg .set_distance_threshold (0.01 )
118
115
119
116
indices , model = seg .segment ()
120
117
self .assertListEqual (indices , SEGINLIERSIDX )
121
118
self .assertListEqual (model , SEGCOEFF )
122
119
120
+
123
121
def test_pcd_read ():
124
122
TMPL = """
125
123
# .PCD v.7 - Point Cloud Data file format
@@ -137,15 +135,15 @@ def test_pcd_read():
137
135
138
136
a = np .array (np .mat (SEGDATA , dtype = np .float32 ))
139
137
npts = a .shape [0 ]
140
- with open ("/tmp/test.pcd" ,"w" ) as f :
141
- f .write (TMPL % {"npts" :npts ,"data" :SEGDATA .replace (";" ,"" )})
138
+ with open ("/tmp/test.pcd" , "w" ) as f :
139
+ f .write (TMPL % {"npts" : npts , "data" : SEGDATA .replace (";" , "" )})
142
140
143
141
p = pcl .load ("/tmp/test.pcd" )
144
142
145
143
assert p .width == npts
146
144
assert p .height == 1
147
145
148
- for i ,row in enumerate (a ):
146
+ for i , row in enumerate (a ):
149
147
pt = np .array (p [i ])
150
148
ssd = sum ((row - pt ) ** 2 )
151
149
assert ssd < 1e-6
@@ -163,32 +161,35 @@ def test_copy():
163
161
assert_array_equal (p2 .to_array (), a )
164
162
165
163
166
- SEGCYLMOD = [0.0552167 , 0.0547035 , 0.757707 , - 0.0270852 , - 4.41026 , - 2.88995 , 0.0387603 ]
164
+ SEGCYLMOD = [0.0552167 , 0.0547035 , 0.757707 ,
165
+ - 0.0270852 , - 4.41026 , - 2.88995 , 0.0387603 ]
167
166
SEGCYLIN = 11462
168
167
168
+
169
169
class TestSegmentCylinder (unittest .TestCase ):
170
170
171
171
def setUp (self ):
172
172
self .p = pcl .load ("tests/table_scene_mug_stereo_textured_noplane.pcd" )
173
173
174
174
def testSegment (self ):
175
175
seg = self .p .make_segmenter_normals (50 )
176
- seg .set_optimize_coefficients (True );
177
- seg .set_model_type (pcl .SACMODEL_CYLINDER )
178
- seg .set_method_type (pcl .SAC_RANSAC )
179
- seg .set_normal_distance_weight (0.1 )
180
- seg .set_max_iterations (10000 )
181
- seg .set_distance_threshold (0.05 )
182
- seg .set_radius_limits (0 , 0.1 )
176
+ seg .set_optimize_coefficients (True )
177
+ seg .set_model_type (pcl .SACMODEL_CYLINDER )
178
+ seg .set_method_type (pcl .SAC_RANSAC )
179
+ seg .set_normal_distance_weight (0.1 )
180
+ seg .set_max_iterations (10000 )
181
+ seg .set_distance_threshold (0.05 )
182
+ seg .set_radius_limits (0 , 0.1 )
183
183
184
184
indices , model = seg .segment ()
185
185
186
186
self .assertEqual (len (indices ), SEGCYLIN )
187
187
188
- npexp = np .array (SEGCYLMOD )
189
- npmod = np .array (model )
190
- ssd = sum ((npexp - npmod ) ** 2 )
191
- #self.assertLess(ssd, 1e-6)
188
+ # npexp = np.array(SEGCYLMOD)
189
+ # npmod = np.array(model)
190
+ # ssd = sum((npexp - npmod) ** 2)
191
+ # self.assertLess(ssd, 1e-6)
192
+
192
193
193
194
class TestSave (unittest .TestCase ):
194
195
@@ -206,6 +207,7 @@ def testSave(self):
206
207
p = pcl .load (d )
207
208
self .assertEqual (self .p .size , p .size )
208
209
210
+
209
211
class TestFilter (unittest .TestCase ):
210
212
211
213
def setUp (self ):
@@ -217,28 +219,31 @@ def testFilter(self):
217
219
mls .set_polynomial_order (2 )
218
220
mls .set_polynomial_fit (True )
219
221
f = mls .process ()
220
- #new instance is returned
222
+ # new instance is returned
221
223
self .assertNotEqual (self .p , f )
222
- #mls filter retains the same number of points
224
+ # mls filter retains the same number of points
223
225
self .assertEqual (self .p .size , f .size )
224
226
227
+
225
228
class TestExtract (unittest .TestCase ):
226
229
227
230
def setUp (self ):
228
231
self .p = pcl .load ("tests/flydracyl.pcd" )
229
232
230
233
def testExtractPos (self ):
231
- p2 = self .p .extract ([1 ,2 , 3 ],False )
232
- #new instance is returned
234
+ p2 = self .p .extract ([1 , 2 , 3 ], False )
235
+ # new instance is returned
233
236
self .assertNotEqual (self .p , p2 )
234
237
self .assertEqual (p2 .size , 3 )
235
238
236
239
def testExtractNeg (self ):
237
- p2 = self .p .extract ([1 ,2 , 3 ],True )
240
+ p2 = self .p .extract ([1 , 2 , 3 ], True )
238
241
self .assertNotEqual (self .p , p2 )
239
242
self .assertEqual (p2 .size , self .p .size - 3 )
240
243
244
+
241
245
class TestExceptions (unittest .TestCase ):
246
+
242
247
def setUp (self ):
243
248
self .p = pcl .PointCloud (np .arange (9 , dtype = np .float32 ).reshape (3 , 3 ))
244
249
@@ -252,6 +257,7 @@ def testResize(self):
252
257
# better exceptions.
253
258
self .assertRaises (MemoryError , self .p .resize , - 1 )
254
259
260
+
255
261
class TestSegmenterNormal (unittest .TestCase ):
256
262
257
263
def setUp (self ):
@@ -271,17 +277,17 @@ def _tneg(self, c):
271
277
272
278
def testFilterPos (self ):
273
279
fil = self .p .make_statistical_outlier_filter ()
274
- fil .set_mean_k (50 )
280
+ fil .set_mean_k (50 )
275
281
self .assertEqual (fil .k , 50 )
276
- fil .set_std_dev_mul_thresh (1.0 )
282
+ fil .set_std_dev_mul_thresh (1.0 )
277
283
self .assertEqual (fil .stddev_mul_thresh , 1.0 )
278
284
c = fil .filter ()
279
285
self ._tpos (c )
280
286
281
287
def testFilterNeg (self ):
282
288
fil = self .p .make_statistical_outlier_filter ()
283
- fil .set_mean_k (50 )
284
- fil .set_std_dev_mul_thresh (1.0 )
289
+ fil .set_mean_k (50 )
290
+ fil .set_std_dev_mul_thresh (1.0 )
285
291
self .assertEqual (fil .negative , False )
286
292
fil .set_negative (True )
287
293
self .assertEqual (fil .negative , True )
@@ -290,53 +296,58 @@ def testFilterNeg(self):
290
296
291
297
def testFilterPosNeg (self ):
292
298
fil = self .p .make_statistical_outlier_filter ()
293
- fil .set_mean_k (50 )
294
- fil .set_std_dev_mul_thresh (1.0 )
299
+ fil .set_mean_k (50 )
300
+ fil .set_std_dev_mul_thresh (1.0 )
295
301
c = fil .filter ()
296
302
self ._tpos (c )
297
303
fil .set_negative (True )
298
304
c = fil .filter ()
299
305
self ._tneg (c )
300
306
307
+
301
308
class TestVoxelGridFilter (unittest .TestCase ):
302
309
303
310
def setUp (self ):
304
311
self .p = pcl .load ("tests/table_scene_mug_stereo_textured_noplane.pcd" )
305
312
306
313
def testFilter (self ):
307
314
fil = self .p .make_voxel_grid_filter ()
308
- fil .set_leaf_size (0.01 ,0.01 ,0.01 )
315
+ fil .set_leaf_size (0.01 , 0.01 , 0.01 )
309
316
c = fil .filter ()
310
317
self .assertTrue (c .size < self .p .size )
311
318
self .assertEqual (c .size , 719 )
312
319
320
+
313
321
class TestPassthroughFilter (unittest .TestCase ):
322
+
314
323
def setUp (self ):
315
324
self .p = pcl .load ("tests/table_scene_mug_stereo_textured_noplane.pcd" )
316
325
317
326
def testFilter (self ):
318
327
fil = self .p .make_passthrough_filter ()
319
- fil .set_filter_field_name ("z" )
320
- fil .set_filter_limits (0 , 0.75 )
328
+ fil .set_filter_field_name ("z" )
329
+ fil .set_filter_limits (0 , 0.75 )
321
330
c = fil .filter ()
322
331
self .assertTrue (c .size < self .p .size )
323
332
self .assertEqual (c .size , 7751 )
324
333
325
334
def testFilterBoth (self ):
326
335
total = self .p .size
327
336
fil = self .p .make_passthrough_filter ()
328
- fil .set_filter_field_name ("z" )
329
- fil .set_filter_limits (0 , 0.75 )
337
+ fil .set_filter_field_name ("z" )
338
+ fil .set_filter_limits (0 , 0.75 )
330
339
front = fil .filter ().size
331
- fil .set_filter_limits (0.75 , 100 )
340
+ fil .set_filter_limits (0.75 , 100 )
332
341
back = fil .filter ().size
333
- self .assertEqual (total ,front + back )
342
+ self .assertEqual (total , front + back )
343
+
334
344
335
345
class TestKdTree (unittest .TestCase ):
346
+
336
347
def setUp (self ):
337
348
rng = np .random .RandomState (42 )
338
349
# Define two dense sets of points of sizes 30 and 170, resp.
339
- a = np . random .randn (100 , 3 ).astype (np .float32 )
350
+ a = rng .randn (100 , 3 ).astype (np .float32 )
340
351
a [:30 ] -= 42
341
352
342
353
self .pc = pcl .PointCloud (a )
@@ -363,7 +374,9 @@ def testKNN(self):
363
374
for d in sqdist :
364
375
self .assertGreaterEqual (d , 0 )
365
376
377
+
366
378
class TestOctreePointCloud (unittest .TestCase ):
379
+
367
380
def setUp (self ):
368
381
self .t = pcl .OctreePointCloud (0.1 )
369
382
@@ -376,14 +389,17 @@ def testLoad(self):
376
389
rs = self .t .is_voxel_occupied_at_point (good_point )
377
390
self .assertTrue (rs )
378
391
bad_point = (0.5 , 0.5 , 0.5 )
379
- rs = self .t .is_voxel_occupied_at_point (bad_point )
392
+ rs = self .t .is_voxel_occupied_at_point (bad_point )
380
393
self .assertFalse (rs )
381
394
voxels_len = 44
382
395
self .assertEqual (len (self .t .get_occupied_voxel_centers ()), voxels_len )
383
396
self .t .delete_voxel_at_point (good_point )
384
- self .assertEqual (len (self .t .get_occupied_voxel_centers ()), voxels_len - 1 )
385
-
397
+ self .assertEqual (
398
+ len (self .t .get_occupied_voxel_centers ()), voxels_len - 1 )
399
+
400
+
386
401
class TestOctreePointCloudSearch (unittest .TestCase ):
402
+
387
403
def setUp (self ):
388
404
self .t = pcl .OctreePointCloudSearch (0.1 )
389
405
pc = pcl .load ("tests/table_scene_mug_stereo_textured_noplane.pcd" )
0 commit comments