text: #pragma once
  
  /**\file plane_segmentation.h
   * \brief Description...
   *
   * @version 1.0
   * @author Carlos Miguel Correia da Costa
   */
  
  // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>  <includes>   <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  // std includes
  #include <memory>
  #include <string>
  
  // ROS includes
  #include <ros/ros.h>
  
  // PCL includes
  #include <pcl/point_cloud.h>
  #include <pcl/point_types.h>
  #include <pcl/ModelCoefficients.h>
  #include <pcl/PointIndices.h>
  #include <pcl/common/centroid.h>
  #include <pcl/common/transforms.h>
  #include <pcl/filters/extract_indices.h>
  #include <pcl/filters/project_inliers.h>
  #include <pcl/segmentation/sac_segmentation.h>
  #include <pcl/segmentation/extract_polygonal_prism_data.h>
  #include <pcl/surface/concave_hull.h>
  
  // external libs includes
  #include <Eigen/Core>
  
  // project includes
  #include <dynamic_robot_localization/cloud_filters/cloud_filter.h>
  #include <dynamic_robot_localization/common/cloud_publisher.h>
  // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>   </includes>   <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  
  
  namespace dynamic_robot_localization {
  // ##########################################################################   plane_segmentation   ###########################################################################
  /**
   * \brief Description...
   */
  template <typename PointT>
  class PlaneSegmentation : public CloudFilter<PointT> {
  	// ========================================================================   <public-section>   ===========================================================================
  	public:
  		// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>   <usings>   <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  		using Ptr = std::shared_ptr< PlaneSegmentation<PointT> >;
  		using ConstPtr = std::shared_ptr< const PlaneSegmentation<PointT> >;
  		// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>   </usings>  <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  
  		// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>   <constructors-destructor>   <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  		PlaneSegmentation() : CloudFilter<PointT>("PlaneSegmentation") {}
  		virtual ~PlaneSegmentation() {}
  		// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>   </constructors-destructor>  <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  
  		// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>   <PlaneSegmentation-functions>   <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  		virtual void setupConfigurationFromParameterServer(ros::NodeHandlePtr& node_handle, ros::NodeHandlePtr& private_node_handle, const std::string& configuration_namespace);
  		virtual void filter(const typename pcl::PointCloud<PointT>::Ptr& input_cloud, typename pcl::PointCloud<PointT>::Ptr& output_cloud);
  		// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>   </PlaneSegmentation-functions>  <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  
  		// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>   <gets>   <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  		inline pcl::ModelCoefficients::Ptr getPlaneCoefficients() { return plane_coefficients_; }
  		// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>   </gets>  <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  
  		// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>   <sets>   <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  		// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>   </sets>  <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  	// ========================================================================   </public-section>  ===========================================================================
  
  	// ========================================================================   <protected-section>   ========================================================================
  	protected:
  		bool use_surface_normals_;
  		std::string sample_consensus_method_;
  		double sample_consensus_maximum_distance_of_sample_to_plane_;
  		double sample_consensus_normals_difference_weight_;
  		int sample_consensus_number_of_iterations_;
  		double sample_consensus_probability_of_sample_not_be_an_outlier_;
  		double segmentation_minimum_distance_to_plane_;
  		double segmentation_maximum_distance_to_plane_;
  		double plane_convex_hull_scaling_factor_;
  		pcl::ModelCoefficients::Ptr plane_coefficients_;
  		typename CloudPublisher<PointT>::Ptr plane_inliers_cloud_publisher_;
  		typename CloudPublisher<PointT>::Ptr plane_inliers_convex_hull_cloud_publisher_;
  	// ========================================================================   </protected-section>  ========================================================================
  };
  
  } /* namespace dynamic_robot_localization */
  
  #ifdef DRL_NO_PRECOMPILE
  #include <dynamic_robot_localization/cloud_filters/impl/plane_segmentation.hpp>
  #endif
  