File: cylinder_segmentation.rst

package info (click to toggle)
pcl 1.7.2-7
  • links: PTS, VCS
  • area: main
  • in suites: jessie, jessie-kfreebsd
  • size: 138,052 kB
  • ctags: 39,618
  • sloc: cpp: 446,687; xml: 28,552; ansic: 13,753; python: 539; makefile: 72; sh: 25
file content (106 lines) | stat: -rw-r--r-- 4,039 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
.. _cylinder_segmentation:

Cylinder model segmentation
---------------------------

This tutorial exemplifies how to run a Sample Consensus segmentation for
cylindrical models. To make the example a bit more practical, the following
operations are applied to the input dataset (in order):

* data points further away than 1.5 meters are filtered
* surface normals at each point are estimated
* a plane model (describing the table in our demo dataset) is segmented and saved to disk
* a cylindrical model (describing the mug in our demo dataset) is segmented and saved to disk

.. raw:: html

   <iframe title="Cylinder model segmentation" width="480" height="390" src="http://www.youtube.com/embed/SjbEDEGAeTk?rel=0" frameborder="0" allowfullscreen></iframe>

.. note:: 
   The cylindrical model is not perfect due to the presence of noise in the data.

The code
--------

First, download the dataset `table_scene_mug_stereo_textured.pcd
<https://raw.github.com/PointCloudLibrary/data/master/tutorials/table_scene_mug_stereo_textured.pcd>`_
and save it somewhere to disk.

Then, create a file, let's say, ``cylinder_segmentation.cpp`` in your favorite
editor, and place the following inside it:

.. literalinclude:: sources/cylinder_segmentation/cylinder_segmentation.cpp
   :language: cpp
   :linenos:

The explanation
---------------

The only relevant lines are the lines below, as the other operations are
already described in the other tutorials.

.. literalinclude:: sources/cylinder_segmentation/cylinder_segmentation.cpp
   :language: cpp
   :lines: 83-91

   
As seen, we're using a RANSAC robust estimator to obtain the cylinder
coefficients, and we're imposing a distance threshold from each inlier point to
the model no greater than 5cm. In addition, we set the surface normals
influence to a weight of 0.1, and we limit the radius of the cylindrical model
to be smaller than 10cm.

Compiling and running the program
---------------------------------

Add the following lines to your CMakeLists.txt file:

.. literalinclude:: sources/cylinder_segmentation/CMakeLists.txt
   :language: cmake
   :linenos:

After you have made the executable, you can run it. Simply do::

  $ ./cylinder_segmentation

You will see something similar to::

  PointCloud has: 307200 data points.
  PointCloud after filtering has: 139897 data points.
  [pcl::SACSegmentationFromNormals::initSACModel] Using a model of type: SACMODEL_NORMAL_PLANE
  [pcl::SACSegmentationFromNormals::initSACModel] Setting normal distance weight to 0.100000
  [pcl::SACSegmentationFromNormals::initSAC] Using a method of type: SAC_RANSAC with a model threshold of 0.030000
  [pcl::SACSegmentationFromNormals::initSAC] Setting the maximum number of iterations to 100
  Plane coefficients: header: 
    seq: 0
    stamp: 0.000000000
    frame_id: 
  values[]
    values[0]: -0.0161854
    values[1]: 0.837724
    values[2]: 0.545855
    values[3]: -0.528787

  PointCloud representing the planar component: 117410 data points.
  [pcl::SACSegmentationFromNormals::initSACModel] Using a model of type: SACMODEL_CYLINDER
  [pcl::SACSegmentationFromNormals::initSACModel] Setting radius limits to 0.000000/0.100000
  [pcl::SACSegmentationFromNormals::initSACModel] Setting normal distance weight to 0.100000
  [pcl::SACSegmentationFromNormals::initSAC] Using a method of type: SAC_RANSAC with a model threshold of 0.050000
  [pcl::SampleConsensusModelCylinder::optimizeModelCoefficients] LM solver finished with exit code 2, having a residual norm of 0.322616. 
  Initial solution: 0.0452105 0.0924601 0.790215 0.20495 -0.721649 -0.661225 0.0422902 
  Final solution: 0.0452105 0.0924601 0.790215 0.20495 -0.721649 -0.661225 0.0396354
  Cylinder coefficients: header: 
    seq: 0
    stamp: 0.000000000
    frame_id: 
  values[]
    values[0]: 0.0452105
    values[1]: 0.0924601
    values[2]: 0.790215
    values[3]: 0.20495
    values[4]: -0.721649
    values[5]: -0.661225
    values[6]: 0.0396354

  PointCloud representing the cylindrical component: 8625 data points.