Galaxis Codebase  1.0.0
Team Galaxis software stack for the Carolo Cup 2023 - ROS2 based software
EuclideanDetector Class Reference

#include <PCLObjectDetector.hpp>

Inheritance diagram for EuclideanDetector:
Collaboration diagram for EuclideanDetector:

Public Member Functions

 EuclideanDetector ()
 
std::shared_ptr< std::vector< pcl::PointCloud< pcl::PointXYZ >::Ptr > > cluster_data (pclPtrType p_pclPtr, std::vector< Object > &p_objectsVecRef, float clusterTolerance, int minClusterSize, int maxClusterSize) const
 
- Public Member Functions inherited from PCLObjectDetector
int filter_pcl (pclPtrType p_pclPtr, pclPtrType p_cloudFiltered, float p_leafsize, float y_min, float y_max)
 
std::string get_name (void)
 

Public Attributes

float m_minSizeX = 0.1
 
float m_minSizeY = 0.2
 
float m_minSizeZ = 0.001f
 
float m_maxSizeX = 1.f
 
float m_maxSizeY = 1.f
 
float m_maxSizeZ = 1.f
 
float m_postProcessingClusterSizeMin = 200
 
float m_postProcessingClusterSizeMax = 2000
 

Additional Inherited Members

- Protected Attributes inherited from PCLObjectDetector
std::string m_name = "none"
 

Detailed Description

Definition at line 61 of file PCLObjectDetector.hpp.

Constructor & Destructor Documentation

◆ EuclideanDetector()

EuclideanDetector::EuclideanDetector ( )
inline

Definition at line 63 of file PCLObjectDetector.hpp.

63  {
64  m_name = "euclidean detector";
65  };

References PCLObjectDetector::m_name.

Member Function Documentation

◆ cluster_data()

std::shared_ptr< std::vector< pcl::PointCloud< pcl::PointXYZ >::Ptr > > EuclideanDetector::cluster_data ( pclPtrType  p_pclPtr,
std::vector< Object > &  p_objectsVecRef,
float  clusterTolerance,
int  minClusterSize,
int  maxClusterSize 
) const
virtual

Implements PCLObjectDetector.

Definition at line 7 of file PCLObjectDetector.cpp.

7  {
8 
9  auto pointCloudPtrVectorSPtr = std::make_shared<std::vector<pcl::PointCloud<pcl::PointXYZ>::Ptr>>();
10 
11  // check if filtered cloud is empty to skip unnecessary computation
12  if(p_pclPtr->size() == 0) return pointCloudPtrVectorSPtr;
13 
14  pcl::search::KdTree<pcl::PointXYZ>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZ>);
15  tree->setInputCloud(p_pclPtr);
16 
17  std::vector<pcl::PointIndices> clusterIndices;
18  pcl::EuclideanClusterExtraction<pcl::PointXYZ> ec;
19  ec.setClusterTolerance(clusterTolerance); // m
20  ec.setMinClusterSize(minClusterSize);
21  ec.setMaxClusterSize(maxClusterSize);
22  ec.setSearchMethod(tree);
23  ec.setInputCloud(p_pclPtr);
24  ec.extract(clusterIndices);
25 
26 
27  float sizeX, sizeY, sizeZ;
28  for(std::vector<pcl::PointIndices>::const_iterator it = clusterIndices.begin(); it != clusterIndices.end(); ++it) {
29  pcl::PointCloud<pcl::PointXYZ>::Ptr cloudClusterPtr(new pcl::PointCloud<pcl::PointXYZ>);
30 
31  // create a sub cloud with all the indices extracted above
32  for(std::vector<int>::const_iterator pit = it->indices.begin(); pit != it->indices.end(); ++pit) {
33  cloudClusterPtr->points.push_back(p_pclPtr->points[*pit]);
34  }
35 
36  // post processing
37  pcl::PointXYZ minDimensions;
38  pcl::PointXYZ maxDimensions;
39  pcl::getMinMax3D(*cloudClusterPtr, minDimensions, maxDimensions);
40 
41  sizeX = std::fabs(maxDimensions.x - minDimensions.x);
42  sizeY = std::fabs(maxDimensions.y - minDimensions.y);
43  sizeZ = std::fabs(maxDimensions.z - minDimensions.z);
44 
45  if(cloudClusterPtr->size() < m_postProcessingClusterSizeMin) {
46  log_debug("[RealSense] Object too small (min cluster points)");
47  continue;
48  }
49 
50  if(cloudClusterPtr->size() > m_postProcessingClusterSizeMax) {
51  log_debug("[RealSense] Object too large (max cluster points)");
52  continue;
53  }
54 
55  if(sizeX > m_maxSizeX) {
56  log_debug("[RealSense] Object too large (x)");
57  continue;
58  }
59  if (sizeY > m_maxSizeY) {
60  log_debug("[RealSense] Object too large (y)");
61  continue;
62  }
63  if(sizeZ > m_maxSizeZ) {
64  log_debug("[RealSense] Object too large (z)");
65  continue;
66  }
67 
68  if(sizeX < m_minSizeX) {
69  log_debug("[RealSense] Object too small (x)");
70  continue;
71  }
72  if (sizeY < m_minSizeY) {
73  log_debug("[RealSense] Object too small (y)");
74  continue;
75  }
76  if(sizeZ < m_minSizeZ) {
77  log_debug("[RealSense] Object too small (z)");
78  continue;
79  }
80 
81  pcl::PointXYZ centerPoint;
82  // get centerpoint and MinMax dimensions
83  int centroidReturnValue = pcl::computeCentroid(*cloudClusterPtr, centerPoint);
84 
85  // store object in return vector
86  Object foundObject;
87  foundObject.set_max_dimensions(maxDimensions);
88  foundObject.set_min_dimensions(minDimensions);
89  foundObject.set_center_point(centerPoint);
90  foundObject.size = cloudClusterPtr->size();
91  p_objectsVecRef.push_back(foundObject);
92 
93  pointCloudPtrVectorSPtr->push_back(cloudClusterPtr);
94  }
95 
96  log_debug("Objects Detected: ", p_objectsVecRef.size());
97 
98  return pointCloudPtrVectorSPtr;
99 }

References galaxis::utils::log_debug(), Object::set_center_point(), Object::set_max_dimensions(), Object::set_min_dimensions(), and Object::size.

Referenced by RealSenseNode::object_detection().

Here is the call graph for this function:
Here is the caller graph for this function:

Member Data Documentation

◆ m_maxSizeX

float EuclideanDetector::m_maxSizeX = 1.f

Definition at line 71 of file PCLObjectDetector.hpp.

Referenced by RealSenseNode::new_parameters_callback().

◆ m_maxSizeY

float EuclideanDetector::m_maxSizeY = 1.f

Definition at line 72 of file PCLObjectDetector.hpp.

Referenced by RealSenseNode::new_parameters_callback().

◆ m_maxSizeZ

float EuclideanDetector::m_maxSizeZ = 1.f

Definition at line 73 of file PCLObjectDetector.hpp.

Referenced by RealSenseNode::new_parameters_callback().

◆ m_minSizeX

float EuclideanDetector::m_minSizeX = 0.1

Definition at line 67 of file PCLObjectDetector.hpp.

Referenced by RealSenseNode::new_parameters_callback().

◆ m_minSizeY

float EuclideanDetector::m_minSizeY = 0.2

Definition at line 68 of file PCLObjectDetector.hpp.

Referenced by RealSenseNode::new_parameters_callback().

◆ m_minSizeZ

float EuclideanDetector::m_minSizeZ = 0.001f

Definition at line 69 of file PCLObjectDetector.hpp.

Referenced by RealSenseNode::new_parameters_callback().

◆ m_postProcessingClusterSizeMax

float EuclideanDetector::m_postProcessingClusterSizeMax = 2000

Definition at line 76 of file PCLObjectDetector.hpp.

Referenced by RealSenseNode::new_parameters_callback().

◆ m_postProcessingClusterSizeMin

float EuclideanDetector::m_postProcessingClusterSizeMin = 200

Definition at line 75 of file PCLObjectDetector.hpp.

Referenced by RealSenseNode::new_parameters_callback().


The documentation for this class was generated from the following files:
EuclideanDetector::m_maxSizeZ
float m_maxSizeZ
Definition: PCLObjectDetector.hpp:73
EuclideanDetector::m_minSizeY
float m_minSizeY
Definition: PCLObjectDetector.hpp:68
EuclideanDetector::m_postProcessingClusterSizeMax
float m_postProcessingClusterSizeMax
Definition: PCLObjectDetector.hpp:76
PCLObjectDetector::m_name
std::string m_name
Definition: PCLObjectDetector.hpp:35
Object
Definition: Object.hpp:7
EuclideanDetector::m_minSizeX
float m_minSizeX
Definition: PCLObjectDetector.hpp:67
EuclideanDetector::m_postProcessingClusterSizeMin
float m_postProcessingClusterSizeMin
Definition: PCLObjectDetector.hpp:75
Object::set_min_dimensions
void set_min_dimensions(pcl::PointXYZ &p_rightmostPoint)
Definition: Object.cpp:23
Object::set_max_dimensions
void set_max_dimensions(pcl::PointXYZ &p_leftmostPoint)
Definition: Object.cpp:19
EuclideanDetector::m_maxSizeX
float m_maxSizeX
Definition: PCLObjectDetector.hpp:71
EuclideanDetector::m_maxSizeY
float m_maxSizeY
Definition: PCLObjectDetector.hpp:72
EuclideanDetector::m_minSizeZ
float m_minSizeZ
Definition: PCLObjectDetector.hpp:69
Object::set_center_point
void set_center_point(pcl::PointXYZ &p_centerPoint)
Definition: Object.cpp:15
Object::size
double size
Definition: Object.hpp:18
galaxis::utils::log_debug
void log_debug(const Args &... args)
Definition: logger.hpp:62