Point Cloud Library (PCL)  1.7.1
sac_model_perpendicular_plane.h
1 /*
2  * Software License Agreement (BSD License)
3  *
4  * Point Cloud Library (PCL) - www.pointclouds.org
5  * Copyright (c) 2010-2011, Willow Garage, Inc.
6  * Copyright (c) 2012-, Open Perception, Inc.
7  *
8  * All rights reserved.
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions
12  * are met:
13  *
14  * * Redistributions of source code must retain the above copyright
15  * notice, this list of conditions and the following disclaimer.
16  * * Redistributions in binary form must reproduce the above
17  * copyright notice, this list of conditions and the following
18  * disclaimer in the documentation and/or other materials provided
19  * with the distribution.
20  * * Neither the name of the copyright holder(s) nor the names of its
21  * contributors may be used to endorse or promote products derived
22  * from this software without specific prior written permission.
23  *
24  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
25  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
26  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
27  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
28  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
29  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
30  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
31  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
32  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
33  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
34  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
35  * POSSIBILITY OF SUCH DAMAGE.
36  *
37  * $Id$
38  *
39  */
40 
41 #ifndef PCL_SAMPLE_CONSENSUS_MODEL_PERPENDICULARPLANE_H_
42 #define PCL_SAMPLE_CONSENSUS_MODEL_PERPENDICULARPLANE_H_
43 
44 #include <pcl/sample_consensus/sac_model_plane.h>
45 #include <pcl/common/common.h>
46 
47 namespace pcl
48 {
49  /** \brief SampleConsensusModelPerpendicularPlane defines a model for 3D plane segmentation using additional
50  * angular constraints. The plane must be perpendicular to an user-specified axis (\ref setAxis), up to an user-specified angle threshold (\ref setEpsAngle).
51  * The model coefficients are defined as:
52  * - \b a : the X coordinate of the plane's normal (normalized)
53  * - \b b : the Y coordinate of the plane's normal (normalized)
54  * - \b c : the Z coordinate of the plane's normal (normalized)
55  * - \b d : the fourth <a href="http://mathworld.wolfram.com/HessianNormalForm.html">Hessian component</a> of the plane's equation
56  *
57  *
58  * Code example for a plane model, perpendicular (within a 15 degrees tolerance) with the Z axis:
59  * \code
60  * SampleConsensusModelPerpendicularPlane<pcl::PointXYZ> model (cloud);
61  * model.setAxis (Eigen::Vector3f (0.0, 0.0, 1.0));
62  * model.setEpsAngle (pcl::deg2rad (15));
63  * \endcode
64  *
65  * \note Please remember that you need to specify an angle > 0 in order to activate the axis-angle constraint!
66  *
67  * \author Radu B. Rusu
68  * \ingroup sample_consensus
69  */
70  template <typename PointT>
72  {
73  public:
77 
78  typedef boost::shared_ptr<SampleConsensusModelPerpendicularPlane> Ptr;
79 
80  /** \brief Constructor for base SampleConsensusModelPerpendicularPlane.
81  * \param[in] cloud the input point cloud dataset
82  * \param[in] random if true set the random seed to the current time, else set to 12345 (default: false)
83  */
84  SampleConsensusModelPerpendicularPlane (const PointCloudConstPtr &cloud,
85  bool random = false)
86  : SampleConsensusModelPlane<PointT> (cloud, random)
87  , axis_ (Eigen::Vector3f::Zero ())
88  , eps_angle_ (0.0)
89  {
90  }
91 
92  /** \brief Constructor for base SampleConsensusModelPerpendicularPlane.
93  * \param[in] cloud the input point cloud dataset
94  * \param[in] indices a vector of point indices to be used from \a cloud
95  * \param[in] random if true set the random seed to the current time, else set to 12345 (default: false)
96  */
97  SampleConsensusModelPerpendicularPlane (const PointCloudConstPtr &cloud,
98  const std::vector<int> &indices,
99  bool random = false)
100  : SampleConsensusModelPlane<PointT> (cloud, indices, random)
101  , axis_ (Eigen::Vector3f::Zero ())
102  , eps_angle_ (0.0)
103  {
104  }
105 
106  /** \brief Empty destructor */
108 
109  /** \brief Set the axis along which we need to search for a plane perpendicular to.
110  * \param[in] ax the axis along which we need to search for a plane perpendicular to
111  */
112  inline void
113  setAxis (const Eigen::Vector3f &ax) { axis_ = ax; }
114 
115  /** \brief Get the axis along which we need to search for a plane perpendicular to. */
116  inline Eigen::Vector3f
117  getAxis () { return (axis_); }
118 
119  /** \brief Set the angle epsilon (delta) threshold.
120  * \param[in] ea the maximum allowed difference between the plane normal and the given axis.
121  * \note You need to specify an angle > 0 in order to activate the axis-angle constraint!
122  */
123  inline void
124  setEpsAngle (const double ea) { eps_angle_ = ea; }
125 
126  /** \brief Get the angle epsilon (delta) threshold. */
127  inline double
128  getEpsAngle () { return (eps_angle_); }
129 
130  /** \brief Select all the points which respect the given model coefficients as inliers.
131  * \param[in] model_coefficients the coefficients of a plane model that we need to compute distances to
132  * \param[in] threshold a maximum admissible distance threshold for determining the inliers from the outliers
133  * \param[out] inliers the resultant model inliers
134  */
135  void
136  selectWithinDistance (const Eigen::VectorXf &model_coefficients,
137  const double threshold,
138  std::vector<int> &inliers);
139 
140  /** \brief Count all the points which respect the given model coefficients as inliers.
141  *
142  * \param[in] model_coefficients the coefficients of a model that we need to compute distances to
143  * \param[in] threshold maximum admissible distance threshold for determining the inliers from the outliers
144  * \return the resultant number of inliers
145  */
146  virtual int
147  countWithinDistance (const Eigen::VectorXf &model_coefficients,
148  const double threshold);
149 
150  /** \brief Compute all distances from the cloud data to a given plane model.
151  * \param[in] model_coefficients the coefficients of a plane model that we need to compute distances to
152  * \param[out] distances the resultant estimated distances
153  */
154  void
155  getDistancesToModel (const Eigen::VectorXf &model_coefficients,
156  std::vector<double> &distances);
157 
158  /** \brief Return an unique id for this model (SACMODEL_PERPENDICULAR_PLANE). */
159  inline pcl::SacModel
161 
162  protected:
163  /** \brief Check whether a model is valid given the user constraints.
164  * \param[in] model_coefficients the set of model coefficients
165  */
166  bool
167  isModelValid (const Eigen::VectorXf &model_coefficients);
168 
169  /** \brief The axis along which we need to search for a plane perpendicular to. */
170  Eigen::Vector3f axis_;
171 
172  /** \brief The maximum allowed difference between the plane normal and the given axis. */
173  double eps_angle_;
174  };
175 }
176 
177 #ifdef PCL_NO_PRECOMPILE
178 #include <pcl/sample_consensus/impl/sac_model_perpendicular_plane.hpp>
179 #endif
180 
181 #endif //#ifndef PCL_SAMPLE_CONSENSUS_MODEL_PERPENDICULARPLANE_H_
pcl::SacModel getModelType() const
Return an unique id for this model (SACMODEL_PERPENDICULAR_PLANE).
boost::shared_ptr< SampleConsensusModelPerpendicularPlane > Ptr
double getEpsAngle()
Get the angle epsilon (delta) threshold.
SampleConsensusModelPlane< PointT >::PointCloudPtr PointCloudPtr
double eps_angle_
The maximum allowed difference between the plane normal and the given axis.
SampleConsensusModel< PointT >::PointCloudPtr PointCloudPtr
bool isModelValid(const Eigen::VectorXf &model_coefficients)
Check whether a model is valid given the user constraints.
void getDistancesToModel(const Eigen::VectorXf &model_coefficients, std::vector< double > &distances)
Compute all distances from the cloud data to a given plane model.
SampleConsensusModelPlane defines a model for 3D plane segmentation.
Definition: bfgs.h:10
SampleConsensusModelPerpendicularPlane(const PointCloudConstPtr &cloud, const std::vector< int > &indices, bool random=false)
Constructor for base SampleConsensusModelPerpendicularPlane.
Eigen::Vector3f axis_
The axis along which we need to search for a plane perpendicular to.
SacModel
Definition: model_types.h:48
SampleConsensusModelPlane< PointT >::PointCloudConstPtr PointCloudConstPtr
void selectWithinDistance(const Eigen::VectorXf &model_coefficients, const double threshold, std::vector< int > &inliers)
Select all the points which respect the given model coefficients as inliers.
SampleConsensusModelPerpendicularPlane(const PointCloudConstPtr &cloud, bool random=false)
Constructor for base SampleConsensusModelPerpendicularPlane.
SampleConsensusModelPerpendicularPlane defines a model for 3D plane segmentation using additional ang...
SampleConsensusModelPlane< PointT >::PointCloud PointCloud
A point structure representing Euclidean xyz coordinates, and the RGB color.
void setAxis(const Eigen::Vector3f &ax)
Set the axis along which we need to search for a plane perpendicular to.
Eigen::Vector3f getAxis()
Get the axis along which we need to search for a plane perpendicular to.
PointCloud represents the base class in PCL for storing collections of 3D points. ...
void setEpsAngle(const double ea)
Set the angle epsilon (delta) threshold.
virtual int countWithinDistance(const Eigen::VectorXf &model_coefficients, const double threshold)
Count all the points which respect the given model coefficients as inliers.
SampleConsensusModel< PointT >::PointCloudConstPtr PointCloudConstPtr