Package Summary
| Version | 1.10.0 |
| License | Apache License 2.0 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/autowarefoundation/autoware_core.git |
| VCS Type | git |
| VCS Version | main |
| Last Updated | 2026-10-07 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Maintainers
- Yukihiro Saito
- Dai Nguyen
Authors
autoware_euclidean_cluster_object_detector
Purpose
autoware_euclidean_cluster_object_detector is a package for clustering points into smaller parts to classify objects.
This package has two clustering methods: euclidean_cluster and voxel_grid_based_euclidean_cluster.
Inner-workings / Algorithms
euclidean_cluster
pcl::EuclideanClusterExtraction is applied to points. See official document for details.
voxel_grid_based_euclidean_cluster
- A centroid in each voxel is calculated by
pcl::VoxelGrid. - The centroids are clustered by
pcl::EuclideanClusterExtraction. - The input points are clustered based on the clustered centroids.
Inputs / Outputs
Input
| Name | Type | Description |
|---|---|---|
input |
sensor_msgs::msg::PointCloud2 |
input pointcloud |
Output
| Name | Type | Description |
|---|---|---|
output |
autoware_perception_msgs::msg::DetectedObjects |
detected objects |
debug/clusters |
sensor_msgs::msg::PointCloud2 |
colored cluster pointcloud for visualization |
Parameters
Core Parameters
euclidean_cluster
| Name | Type | Description |
|---|---|---|
use_height |
bool | use point.z for clustering |
min_cluster_size |
int | the minimum number of points that a cluster needs to contain in order to be considered valid |
max_cluster_size |
int | the maximum number of points that a cluster needs to contain in order to be considered valid |
tolerance |
float | the spatial cluster tolerance as a measure in the L2 Euclidean space |
voxel_grid_based_euclidean_cluster
| Name | Type | Description |
|---|---|---|
use_height |
bool | use point.z for clustering |
min_cluster_size |
int | the minimum number of points that a cluster needs to contain in order to be considered valid |
max_cluster_size |
int | the maximum number of points that a cluster needs to contain in order to be considered valid |
tolerance |
float | the spatial cluster tolerance as a measure in the L2 Euclidean space |
voxel_leaf_size |
float | the voxel leaf size of x and y |
min_points_number_per_voxel |
int | the minimum number of points for a voxel |
Assumptions / Known limits
Cluster size limits
The two size parameters are assumed to satisfy 1 <= min_cluster_size <= max_cluster_size. The
nodes do not check this, and the behaviour is undefined otherwise.
(Optional) Error detection and handling
(Optional) Performance characterization
(Optional) References/External links
<!– Write links you referred to when you implemented.
Example:
File truncated at 100 lines see the full file
Changelog for package autoware_euclidean_cluster_object_detector
1.10.0 (2026-09-28)
- Merge remote-tracking branch 'origin/main' into tmp/bot/bump_version_base
- test(euclidean_cluster_object_detector): fixed test euclidian cluser
(#1393)
test(autoware_euclidean_cluster_object_detector): make the
voxel-grid tests deterministic The tests drew their point
coordinates from an unseeded RNG. [testcase3]{.title-ref} failed in
CI about 20% of the time, and no failure could be reproduced,
because no seed was recorded. The input clouds are now written out
as literal points.
- [testcase1/2/3]{.title-ref} are renamed after the limit each one
exercises, and they pin [skipped_cluster_count]{.title-ref} as well.
- [ExceedMaxClusterSize]{.title-ref} is removed. It drove the same
rejection path as the max-size case and asserted less about it.
- New cases cover several objects in one scan, a count sitting on
both limits at once, a contradictory pair of limits, and skipping
decided per cluster.
- [BoundaryVoxelPointsAreNotDropped]{.title-ref} is unchanged. It
came from the regression fixed in
#1376.
- Outside the tests, the map key in
[cluster_voxel_grid()]{.title-ref} is renamed from
[voxel_1d_idx]{.title-ref} to [centroid_idx]{.title-ref}.
[getCentroidIndexAt()]{.title-ref} returns an index into the
filtered centroid cloud, not the grid cell index the old name
claimed.
- The README states the assumed range for the two size limits.
- fix(perception): declare the dependencies these packages use (#1371) Each of these packages uses a package it never declares. Either it includes a header of that package, or it names a symbol of it while the header arrives through another dependency. Both build today only because some declared dependency re-exports the owner, so a change in an unrelated repository can break them without anything here changing. The tag follows where the dependency is used: a use in an installed header or in code compiled into the library takes <depend>, one reached only from test/ takes <test_depend>. System libraries are named by the rosdep key this workspace already prefers.
- fix(autoware_euclidean_cluster_object_detector): keep boundary voxel points in their clusters (#1376) The detector recomputed the map key of each voxel from the float coordinates of its centroid. The centroid is a float mean. For points that sit exactly on a cell boundary, this mean rounds to one float step under the boundary. The recomputed key then pointed to the neighbor cell, and the detector dropped the raw points of that voxel. The oversized cluster in VoxelGridBasedEuclideanClusterTest.testcase3 then passed the max_cluster_size check, and the test failed intermittently. Key the map by the centroid index instead. This index is the same value that getCentroidIndexAt() returns for the raw points. Add a deterministic regression test for the boundary case.
- feat: [codecov/refactoring] [euclidean_cluster_object_detector]
Core logic isolation (SECOND HALF)
(#1244)
- added voxel grid cluster into core logic header, and specify a strategy gate to init once at startup
- implemented voxel_grid algorithm into the core logic module, with a nice touch of init once to address Akamine-san concern
- node unification between cluster standard and cluster nvoxel grid with a bunch of diagnostic added
- removed legacy files from old voxel grid structure, now already unified into core logics
- adjusted launch file to reflect new voxel grid locs
- purged voxel_grid relatives from cmakelist
- refactor test_euclidean_cluster_object_detection_integration.cpp test suite
- refactor test_node.cpp test suite
- heavy refactor of test_voxel_grid_based_euclidean_cluster.cpp test suite
- added the weird 2D flattening feature inside the voxel grid clustering
- removed redundant test inside tesdt voxel
- fixedspellcheck error (why Akamine-san's name does not pass the spellcheck?)
- bring back the voxel grid based euclidean cluster node header hpp
- reimplement voxel grid based euclidean cluster node source cpp
- clean up standard node, remove the voxel leaf size delcairation
- reimplemented voxel grid stuffs to CMakeLists
- fixed launch revert back to voxel node
- successfully reverted to the dual-node architecture
- fully reverted to dual nodes, all builds tests good now
- spell check and cpp ckeck diff fix
- feat: [codecov/refactoring] [euclidean_cluster_object_detector]
Core logic isolation (FIRST HALF)
(#1239)
- implemented master params struct for this node new refactoring
- implemented ros_conversions.cpp/.hpp
- implemented euclidean_cluster_object_detector.hpp as the header for core logic, now with only cluster_standard
- implemented euclidean_cluster_object_detector.cpp as the source for core logic, now with only cluster_standard
- euclidean_cluster_node core logic refine, now only with cluster_standard()
File truncated at 100 lines see the full file
Package Dependencies
System Dependencies
| Name |
|---|
| libpcl-all-dev |
Dependant Packages
| Name | Deps |
|---|---|
| autoware_core_perception |
Launch files
- launch/euclidean_cluster.launch.xml
-
- input_pointcloud [default: /sensing/lidar/top/pointcloud_raw]
- input_map [default: /map/pointcloud_map]
- output_clusters [default: clusters]
- use_low_height_cropbox [default: false]
- euclidean_param_path [default: $(find-pkg-share autoware_euclidean_cluster_object_detector)/config/euclidean_cluster.param.yaml]
- use_pointcloud_container [default: false]
- pointcloud_container_name [default: pointcloud_container]
- launch/voxel_grid_based_euclidean_cluster.launch.xml
-
- input_pointcloud [default: /sensing/lidar/top/pointcloud_raw]
- input_map [default: /map/pointcloud_map]
- output_clusters [default: clusters]
- use_low_height_cropbox [default: false]
- voxel_grid_based_euclidean_param_path [default: $(find-pkg-share autoware_euclidean_cluster_object_detector)/config/voxel_grid_based_euclidean_cluster.param.yaml]
- use_pointcloud_container [default: false]
- pointcloud_container_name [default: pointcloud_container]
Messages
Services
Plugins
Recent questions tagged autoware_euclidean_cluster_object_detector at Robotics Stack Exchange
Package Summary
| Version | 1.10.0 |
| License | Apache License 2.0 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/autowarefoundation/autoware_core.git |
| VCS Type | git |
| VCS Version | main |
| Last Updated | 2026-10-07 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Maintainers
- Yukihiro Saito
- Dai Nguyen
Authors
autoware_euclidean_cluster_object_detector
Purpose
autoware_euclidean_cluster_object_detector is a package for clustering points into smaller parts to classify objects.
This package has two clustering methods: euclidean_cluster and voxel_grid_based_euclidean_cluster.
Inner-workings / Algorithms
euclidean_cluster
pcl::EuclideanClusterExtraction is applied to points. See official document for details.
voxel_grid_based_euclidean_cluster
- A centroid in each voxel is calculated by
pcl::VoxelGrid. - The centroids are clustered by
pcl::EuclideanClusterExtraction. - The input points are clustered based on the clustered centroids.
Inputs / Outputs
Input
| Name | Type | Description |
|---|---|---|
input |
sensor_msgs::msg::PointCloud2 |
input pointcloud |
Output
| Name | Type | Description |
|---|---|---|
output |
autoware_perception_msgs::msg::DetectedObjects |
detected objects |
debug/clusters |
sensor_msgs::msg::PointCloud2 |
colored cluster pointcloud for visualization |
Parameters
Core Parameters
euclidean_cluster
| Name | Type | Description |
|---|---|---|
use_height |
bool | use point.z for clustering |
min_cluster_size |
int | the minimum number of points that a cluster needs to contain in order to be considered valid |
max_cluster_size |
int | the maximum number of points that a cluster needs to contain in order to be considered valid |
tolerance |
float | the spatial cluster tolerance as a measure in the L2 Euclidean space |
voxel_grid_based_euclidean_cluster
| Name | Type | Description |
|---|---|---|
use_height |
bool | use point.z for clustering |
min_cluster_size |
int | the minimum number of points that a cluster needs to contain in order to be considered valid |
max_cluster_size |
int | the maximum number of points that a cluster needs to contain in order to be considered valid |
tolerance |
float | the spatial cluster tolerance as a measure in the L2 Euclidean space |
voxel_leaf_size |
float | the voxel leaf size of x and y |
min_points_number_per_voxel |
int | the minimum number of points for a voxel |
Assumptions / Known limits
Cluster size limits
The two size parameters are assumed to satisfy 1 <= min_cluster_size <= max_cluster_size. The
nodes do not check this, and the behaviour is undefined otherwise.
(Optional) Error detection and handling
(Optional) Performance characterization
(Optional) References/External links
<!– Write links you referred to when you implemented.
Example:
File truncated at 100 lines see the full file
Changelog for package autoware_euclidean_cluster_object_detector
1.10.0 (2026-09-28)
- Merge remote-tracking branch 'origin/main' into tmp/bot/bump_version_base
- test(euclidean_cluster_object_detector): fixed test euclidian cluser
(#1393)
test(autoware_euclidean_cluster_object_detector): make the
voxel-grid tests deterministic The tests drew their point
coordinates from an unseeded RNG. [testcase3]{.title-ref} failed in
CI about 20% of the time, and no failure could be reproduced,
because no seed was recorded. The input clouds are now written out
as literal points.
- [testcase1/2/3]{.title-ref} are renamed after the limit each one
exercises, and they pin [skipped_cluster_count]{.title-ref} as well.
- [ExceedMaxClusterSize]{.title-ref} is removed. It drove the same
rejection path as the max-size case and asserted less about it.
- New cases cover several objects in one scan, a count sitting on
both limits at once, a contradictory pair of limits, and skipping
decided per cluster.
- [BoundaryVoxelPointsAreNotDropped]{.title-ref} is unchanged. It
came from the regression fixed in
#1376.
- Outside the tests, the map key in
[cluster_voxel_grid()]{.title-ref} is renamed from
[voxel_1d_idx]{.title-ref} to [centroid_idx]{.title-ref}.
[getCentroidIndexAt()]{.title-ref} returns an index into the
filtered centroid cloud, not the grid cell index the old name
claimed.
- The README states the assumed range for the two size limits.
- fix(perception): declare the dependencies these packages use (#1371) Each of these packages uses a package it never declares. Either it includes a header of that package, or it names a symbol of it while the header arrives through another dependency. Both build today only because some declared dependency re-exports the owner, so a change in an unrelated repository can break them without anything here changing. The tag follows where the dependency is used: a use in an installed header or in code compiled into the library takes <depend>, one reached only from test/ takes <test_depend>. System libraries are named by the rosdep key this workspace already prefers.
- fix(autoware_euclidean_cluster_object_detector): keep boundary voxel points in their clusters (#1376) The detector recomputed the map key of each voxel from the float coordinates of its centroid. The centroid is a float mean. For points that sit exactly on a cell boundary, this mean rounds to one float step under the boundary. The recomputed key then pointed to the neighbor cell, and the detector dropped the raw points of that voxel. The oversized cluster in VoxelGridBasedEuclideanClusterTest.testcase3 then passed the max_cluster_size check, and the test failed intermittently. Key the map by the centroid index instead. This index is the same value that getCentroidIndexAt() returns for the raw points. Add a deterministic regression test for the boundary case.
- feat: [codecov/refactoring] [euclidean_cluster_object_detector]
Core logic isolation (SECOND HALF)
(#1244)
- added voxel grid cluster into core logic header, and specify a strategy gate to init once at startup
- implemented voxel_grid algorithm into the core logic module, with a nice touch of init once to address Akamine-san concern
- node unification between cluster standard and cluster nvoxel grid with a bunch of diagnostic added
- removed legacy files from old voxel grid structure, now already unified into core logics
- adjusted launch file to reflect new voxel grid locs
- purged voxel_grid relatives from cmakelist
- refactor test_euclidean_cluster_object_detection_integration.cpp test suite
- refactor test_node.cpp test suite
- heavy refactor of test_voxel_grid_based_euclidean_cluster.cpp test suite
- added the weird 2D flattening feature inside the voxel grid clustering
- removed redundant test inside tesdt voxel
- fixedspellcheck error (why Akamine-san's name does not pass the spellcheck?)
- bring back the voxel grid based euclidean cluster node header hpp
- reimplement voxel grid based euclidean cluster node source cpp
- clean up standard node, remove the voxel leaf size delcairation
- reimplemented voxel grid stuffs to CMakeLists
- fixed launch revert back to voxel node
- successfully reverted to the dual-node architecture
- fully reverted to dual nodes, all builds tests good now
- spell check and cpp ckeck diff fix
- feat: [codecov/refactoring] [euclidean_cluster_object_detector]
Core logic isolation (FIRST HALF)
(#1239)
- implemented master params struct for this node new refactoring
- implemented ros_conversions.cpp/.hpp
- implemented euclidean_cluster_object_detector.hpp as the header for core logic, now with only cluster_standard
- implemented euclidean_cluster_object_detector.cpp as the source for core logic, now with only cluster_standard
- euclidean_cluster_node core logic refine, now only with cluster_standard()
File truncated at 100 lines see the full file
Package Dependencies
System Dependencies
| Name |
|---|
| libpcl-all-dev |
Dependant Packages
| Name | Deps |
|---|---|
| autoware_core_perception |
Launch files
- launch/euclidean_cluster.launch.xml
-
- input_pointcloud [default: /sensing/lidar/top/pointcloud_raw]
- input_map [default: /map/pointcloud_map]
- output_clusters [default: clusters]
- use_low_height_cropbox [default: false]
- euclidean_param_path [default: $(find-pkg-share autoware_euclidean_cluster_object_detector)/config/euclidean_cluster.param.yaml]
- use_pointcloud_container [default: false]
- pointcloud_container_name [default: pointcloud_container]
- launch/voxel_grid_based_euclidean_cluster.launch.xml
-
- input_pointcloud [default: /sensing/lidar/top/pointcloud_raw]
- input_map [default: /map/pointcloud_map]
- output_clusters [default: clusters]
- use_low_height_cropbox [default: false]
- voxel_grid_based_euclidean_param_path [default: $(find-pkg-share autoware_euclidean_cluster_object_detector)/config/voxel_grid_based_euclidean_cluster.param.yaml]
- use_pointcloud_container [default: false]
- pointcloud_container_name [default: pointcloud_container]
Messages
Services
Plugins
Recent questions tagged autoware_euclidean_cluster_object_detector at Robotics Stack Exchange
Package Summary
| Version | 1.10.0 |
| License | Apache License 2.0 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/autowarefoundation/autoware_core.git |
| VCS Type | git |
| VCS Version | main |
| Last Updated | 2026-10-07 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Maintainers
- Yukihiro Saito
- Dai Nguyen
Authors
autoware_euclidean_cluster_object_detector
Purpose
autoware_euclidean_cluster_object_detector is a package for clustering points into smaller parts to classify objects.
This package has two clustering methods: euclidean_cluster and voxel_grid_based_euclidean_cluster.
Inner-workings / Algorithms
euclidean_cluster
pcl::EuclideanClusterExtraction is applied to points. See official document for details.
voxel_grid_based_euclidean_cluster
- A centroid in each voxel is calculated by
pcl::VoxelGrid. - The centroids are clustered by
pcl::EuclideanClusterExtraction. - The input points are clustered based on the clustered centroids.
Inputs / Outputs
Input
| Name | Type | Description |
|---|---|---|
input |
sensor_msgs::msg::PointCloud2 |
input pointcloud |
Output
| Name | Type | Description |
|---|---|---|
output |
autoware_perception_msgs::msg::DetectedObjects |
detected objects |
debug/clusters |
sensor_msgs::msg::PointCloud2 |
colored cluster pointcloud for visualization |
Parameters
Core Parameters
euclidean_cluster
| Name | Type | Description |
|---|---|---|
use_height |
bool | use point.z for clustering |
min_cluster_size |
int | the minimum number of points that a cluster needs to contain in order to be considered valid |
max_cluster_size |
int | the maximum number of points that a cluster needs to contain in order to be considered valid |
tolerance |
float | the spatial cluster tolerance as a measure in the L2 Euclidean space |
voxel_grid_based_euclidean_cluster
| Name | Type | Description |
|---|---|---|
use_height |
bool | use point.z for clustering |
min_cluster_size |
int | the minimum number of points that a cluster needs to contain in order to be considered valid |
max_cluster_size |
int | the maximum number of points that a cluster needs to contain in order to be considered valid |
tolerance |
float | the spatial cluster tolerance as a measure in the L2 Euclidean space |
voxel_leaf_size |
float | the voxel leaf size of x and y |
min_points_number_per_voxel |
int | the minimum number of points for a voxel |
Assumptions / Known limits
Cluster size limits
The two size parameters are assumed to satisfy 1 <= min_cluster_size <= max_cluster_size. The
nodes do not check this, and the behaviour is undefined otherwise.
(Optional) Error detection and handling
(Optional) Performance characterization
(Optional) References/External links
<!– Write links you referred to when you implemented.
Example:
File truncated at 100 lines see the full file
Changelog for package autoware_euclidean_cluster_object_detector
1.10.0 (2026-09-28)
- Merge remote-tracking branch 'origin/main' into tmp/bot/bump_version_base
- test(euclidean_cluster_object_detector): fixed test euclidian cluser
(#1393)
test(autoware_euclidean_cluster_object_detector): make the
voxel-grid tests deterministic The tests drew their point
coordinates from an unseeded RNG. [testcase3]{.title-ref} failed in
CI about 20% of the time, and no failure could be reproduced,
because no seed was recorded. The input clouds are now written out
as literal points.
- [testcase1/2/3]{.title-ref} are renamed after the limit each one
exercises, and they pin [skipped_cluster_count]{.title-ref} as well.
- [ExceedMaxClusterSize]{.title-ref} is removed. It drove the same
rejection path as the max-size case and asserted less about it.
- New cases cover several objects in one scan, a count sitting on
both limits at once, a contradictory pair of limits, and skipping
decided per cluster.
- [BoundaryVoxelPointsAreNotDropped]{.title-ref} is unchanged. It
came from the regression fixed in
#1376.
- Outside the tests, the map key in
[cluster_voxel_grid()]{.title-ref} is renamed from
[voxel_1d_idx]{.title-ref} to [centroid_idx]{.title-ref}.
[getCentroidIndexAt()]{.title-ref} returns an index into the
filtered centroid cloud, not the grid cell index the old name
claimed.
- The README states the assumed range for the two size limits.
- fix(perception): declare the dependencies these packages use (#1371) Each of these packages uses a package it never declares. Either it includes a header of that package, or it names a symbol of it while the header arrives through another dependency. Both build today only because some declared dependency re-exports the owner, so a change in an unrelated repository can break them without anything here changing. The tag follows where the dependency is used: a use in an installed header or in code compiled into the library takes <depend>, one reached only from test/ takes <test_depend>. System libraries are named by the rosdep key this workspace already prefers.
- fix(autoware_euclidean_cluster_object_detector): keep boundary voxel points in their clusters (#1376) The detector recomputed the map key of each voxel from the float coordinates of its centroid. The centroid is a float mean. For points that sit exactly on a cell boundary, this mean rounds to one float step under the boundary. The recomputed key then pointed to the neighbor cell, and the detector dropped the raw points of that voxel. The oversized cluster in VoxelGridBasedEuclideanClusterTest.testcase3 then passed the max_cluster_size check, and the test failed intermittently. Key the map by the centroid index instead. This index is the same value that getCentroidIndexAt() returns for the raw points. Add a deterministic regression test for the boundary case.
- feat: [codecov/refactoring] [euclidean_cluster_object_detector]
Core logic isolation (SECOND HALF)
(#1244)
- added voxel grid cluster into core logic header, and specify a strategy gate to init once at startup
- implemented voxel_grid algorithm into the core logic module, with a nice touch of init once to address Akamine-san concern
- node unification between cluster standard and cluster nvoxel grid with a bunch of diagnostic added
- removed legacy files from old voxel grid structure, now already unified into core logics
- adjusted launch file to reflect new voxel grid locs
- purged voxel_grid relatives from cmakelist
- refactor test_euclidean_cluster_object_detection_integration.cpp test suite
- refactor test_node.cpp test suite
- heavy refactor of test_voxel_grid_based_euclidean_cluster.cpp test suite
- added the weird 2D flattening feature inside the voxel grid clustering
- removed redundant test inside tesdt voxel
- fixedspellcheck error (why Akamine-san's name does not pass the spellcheck?)
- bring back the voxel grid based euclidean cluster node header hpp
- reimplement voxel grid based euclidean cluster node source cpp
- clean up standard node, remove the voxel leaf size delcairation
- reimplemented voxel grid stuffs to CMakeLists
- fixed launch revert back to voxel node
- successfully reverted to the dual-node architecture
- fully reverted to dual nodes, all builds tests good now
- spell check and cpp ckeck diff fix
- feat: [codecov/refactoring] [euclidean_cluster_object_detector]
Core logic isolation (FIRST HALF)
(#1239)
- implemented master params struct for this node new refactoring
- implemented ros_conversions.cpp/.hpp
- implemented euclidean_cluster_object_detector.hpp as the header for core logic, now with only cluster_standard
- implemented euclidean_cluster_object_detector.cpp as the source for core logic, now with only cluster_standard
- euclidean_cluster_node core logic refine, now only with cluster_standard()
File truncated at 100 lines see the full file
Package Dependencies
System Dependencies
| Name |
|---|
| libpcl-all-dev |
Dependant Packages
| Name | Deps |
|---|---|
| autoware_core_perception |
Launch files
- launch/euclidean_cluster.launch.xml
-
- input_pointcloud [default: /sensing/lidar/top/pointcloud_raw]
- input_map [default: /map/pointcloud_map]
- output_clusters [default: clusters]
- use_low_height_cropbox [default: false]
- euclidean_param_path [default: $(find-pkg-share autoware_euclidean_cluster_object_detector)/config/euclidean_cluster.param.yaml]
- use_pointcloud_container [default: false]
- pointcloud_container_name [default: pointcloud_container]
- launch/voxel_grid_based_euclidean_cluster.launch.xml
-
- input_pointcloud [default: /sensing/lidar/top/pointcloud_raw]
- input_map [default: /map/pointcloud_map]
- output_clusters [default: clusters]
- use_low_height_cropbox [default: false]
- voxel_grid_based_euclidean_param_path [default: $(find-pkg-share autoware_euclidean_cluster_object_detector)/config/voxel_grid_based_euclidean_cluster.param.yaml]
- use_pointcloud_container [default: false]
- pointcloud_container_name [default: pointcloud_container]
Messages
Services
Plugins
Recent questions tagged autoware_euclidean_cluster_object_detector at Robotics Stack Exchange
Package Summary
| Version | 1.10.0 |
| License | Apache License 2.0 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/autowarefoundation/autoware_core.git |
| VCS Type | git |
| VCS Version | main |
| Last Updated | 2026-10-07 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Maintainers
- Yukihiro Saito
- Dai Nguyen
Authors
autoware_euclidean_cluster_object_detector
Purpose
autoware_euclidean_cluster_object_detector is a package for clustering points into smaller parts to classify objects.
This package has two clustering methods: euclidean_cluster and voxel_grid_based_euclidean_cluster.
Inner-workings / Algorithms
euclidean_cluster
pcl::EuclideanClusterExtraction is applied to points. See official document for details.
voxel_grid_based_euclidean_cluster
- A centroid in each voxel is calculated by
pcl::VoxelGrid. - The centroids are clustered by
pcl::EuclideanClusterExtraction. - The input points are clustered based on the clustered centroids.
Inputs / Outputs
Input
| Name | Type | Description |
|---|---|---|
input |
sensor_msgs::msg::PointCloud2 |
input pointcloud |
Output
| Name | Type | Description |
|---|---|---|
output |
autoware_perception_msgs::msg::DetectedObjects |
detected objects |
debug/clusters |
sensor_msgs::msg::PointCloud2 |
colored cluster pointcloud for visualization |
Parameters
Core Parameters
euclidean_cluster
| Name | Type | Description |
|---|---|---|
use_height |
bool | use point.z for clustering |
min_cluster_size |
int | the minimum number of points that a cluster needs to contain in order to be considered valid |
max_cluster_size |
int | the maximum number of points that a cluster needs to contain in order to be considered valid |
tolerance |
float | the spatial cluster tolerance as a measure in the L2 Euclidean space |
voxel_grid_based_euclidean_cluster
| Name | Type | Description |
|---|---|---|
use_height |
bool | use point.z for clustering |
min_cluster_size |
int | the minimum number of points that a cluster needs to contain in order to be considered valid |
max_cluster_size |
int | the maximum number of points that a cluster needs to contain in order to be considered valid |
tolerance |
float | the spatial cluster tolerance as a measure in the L2 Euclidean space |
voxel_leaf_size |
float | the voxel leaf size of x and y |
min_points_number_per_voxel |
int | the minimum number of points for a voxel |
Assumptions / Known limits
Cluster size limits
The two size parameters are assumed to satisfy 1 <= min_cluster_size <= max_cluster_size. The
nodes do not check this, and the behaviour is undefined otherwise.
(Optional) Error detection and handling
(Optional) Performance characterization
(Optional) References/External links
<!– Write links you referred to when you implemented.
Example:
File truncated at 100 lines see the full file
Changelog for package autoware_euclidean_cluster_object_detector
1.10.0 (2026-09-28)
- Merge remote-tracking branch 'origin/main' into tmp/bot/bump_version_base
- test(euclidean_cluster_object_detector): fixed test euclidian cluser
(#1393)
test(autoware_euclidean_cluster_object_detector): make the
voxel-grid tests deterministic The tests drew their point
coordinates from an unseeded RNG. [testcase3]{.title-ref} failed in
CI about 20% of the time, and no failure could be reproduced,
because no seed was recorded. The input clouds are now written out
as literal points.
- [testcase1/2/3]{.title-ref} are renamed after the limit each one
exercises, and they pin [skipped_cluster_count]{.title-ref} as well.
- [ExceedMaxClusterSize]{.title-ref} is removed. It drove the same
rejection path as the max-size case and asserted less about it.
- New cases cover several objects in one scan, a count sitting on
both limits at once, a contradictory pair of limits, and skipping
decided per cluster.
- [BoundaryVoxelPointsAreNotDropped]{.title-ref} is unchanged. It
came from the regression fixed in
#1376.
- Outside the tests, the map key in
[cluster_voxel_grid()]{.title-ref} is renamed from
[voxel_1d_idx]{.title-ref} to [centroid_idx]{.title-ref}.
[getCentroidIndexAt()]{.title-ref} returns an index into the
filtered centroid cloud, not the grid cell index the old name
claimed.
- The README states the assumed range for the two size limits.
- fix(perception): declare the dependencies these packages use (#1371) Each of these packages uses a package it never declares. Either it includes a header of that package, or it names a symbol of it while the header arrives through another dependency. Both build today only because some declared dependency re-exports the owner, so a change in an unrelated repository can break them without anything here changing. The tag follows where the dependency is used: a use in an installed header or in code compiled into the library takes <depend>, one reached only from test/ takes <test_depend>. System libraries are named by the rosdep key this workspace already prefers.
- fix(autoware_euclidean_cluster_object_detector): keep boundary voxel points in their clusters (#1376) The detector recomputed the map key of each voxel from the float coordinates of its centroid. The centroid is a float mean. For points that sit exactly on a cell boundary, this mean rounds to one float step under the boundary. The recomputed key then pointed to the neighbor cell, and the detector dropped the raw points of that voxel. The oversized cluster in VoxelGridBasedEuclideanClusterTest.testcase3 then passed the max_cluster_size check, and the test failed intermittently. Key the map by the centroid index instead. This index is the same value that getCentroidIndexAt() returns for the raw points. Add a deterministic regression test for the boundary case.
- feat: [codecov/refactoring] [euclidean_cluster_object_detector]
Core logic isolation (SECOND HALF)
(#1244)
- added voxel grid cluster into core logic header, and specify a strategy gate to init once at startup
- implemented voxel_grid algorithm into the core logic module, with a nice touch of init once to address Akamine-san concern
- node unification between cluster standard and cluster nvoxel grid with a bunch of diagnostic added
- removed legacy files from old voxel grid structure, now already unified into core logics
- adjusted launch file to reflect new voxel grid locs
- purged voxel_grid relatives from cmakelist
- refactor test_euclidean_cluster_object_detection_integration.cpp test suite
- refactor test_node.cpp test suite
- heavy refactor of test_voxel_grid_based_euclidean_cluster.cpp test suite
- added the weird 2D flattening feature inside the voxel grid clustering
- removed redundant test inside tesdt voxel
- fixedspellcheck error (why Akamine-san's name does not pass the spellcheck?)
- bring back the voxel grid based euclidean cluster node header hpp
- reimplement voxel grid based euclidean cluster node source cpp
- clean up standard node, remove the voxel leaf size delcairation
- reimplemented voxel grid stuffs to CMakeLists
- fixed launch revert back to voxel node
- successfully reverted to the dual-node architecture
- fully reverted to dual nodes, all builds tests good now
- spell check and cpp ckeck diff fix
- feat: [codecov/refactoring] [euclidean_cluster_object_detector]
Core logic isolation (FIRST HALF)
(#1239)
- implemented master params struct for this node new refactoring
- implemented ros_conversions.cpp/.hpp
- implemented euclidean_cluster_object_detector.hpp as the header for core logic, now with only cluster_standard
- implemented euclidean_cluster_object_detector.cpp as the source for core logic, now with only cluster_standard
- euclidean_cluster_node core logic refine, now only with cluster_standard()
File truncated at 100 lines see the full file
Package Dependencies
System Dependencies
| Name |
|---|
| libpcl-all-dev |
Dependant Packages
| Name | Deps |
|---|---|
| autoware_core_perception |
Launch files
- launch/euclidean_cluster.launch.xml
-
- input_pointcloud [default: /sensing/lidar/top/pointcloud_raw]
- input_map [default: /map/pointcloud_map]
- output_clusters [default: clusters]
- use_low_height_cropbox [default: false]
- euclidean_param_path [default: $(find-pkg-share autoware_euclidean_cluster_object_detector)/config/euclidean_cluster.param.yaml]
- use_pointcloud_container [default: false]
- pointcloud_container_name [default: pointcloud_container]
- launch/voxel_grid_based_euclidean_cluster.launch.xml
-
- input_pointcloud [default: /sensing/lidar/top/pointcloud_raw]
- input_map [default: /map/pointcloud_map]
- output_clusters [default: clusters]
- use_low_height_cropbox [default: false]
- voxel_grid_based_euclidean_param_path [default: $(find-pkg-share autoware_euclidean_cluster_object_detector)/config/voxel_grid_based_euclidean_cluster.param.yaml]
- use_pointcloud_container [default: false]
- pointcloud_container_name [default: pointcloud_container]
Messages
Services
Plugins
Recent questions tagged autoware_euclidean_cluster_object_detector at Robotics Stack Exchange
Package Summary
| Version | 1.10.0 |
| License | Apache License 2.0 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/autowarefoundation/autoware_core.git |
| VCS Type | git |
| VCS Version | main |
| Last Updated | 2026-10-07 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Maintainers
- Yukihiro Saito
- Dai Nguyen
Authors
autoware_euclidean_cluster_object_detector
Purpose
autoware_euclidean_cluster_object_detector is a package for clustering points into smaller parts to classify objects.
This package has two clustering methods: euclidean_cluster and voxel_grid_based_euclidean_cluster.
Inner-workings / Algorithms
euclidean_cluster
pcl::EuclideanClusterExtraction is applied to points. See official document for details.
voxel_grid_based_euclidean_cluster
- A centroid in each voxel is calculated by
pcl::VoxelGrid. - The centroids are clustered by
pcl::EuclideanClusterExtraction. - The input points are clustered based on the clustered centroids.
Inputs / Outputs
Input
| Name | Type | Description |
|---|---|---|
input |
sensor_msgs::msg::PointCloud2 |
input pointcloud |
Output
| Name | Type | Description |
|---|---|---|
output |
autoware_perception_msgs::msg::DetectedObjects |
detected objects |
debug/clusters |
sensor_msgs::msg::PointCloud2 |
colored cluster pointcloud for visualization |
Parameters
Core Parameters
euclidean_cluster
| Name | Type | Description |
|---|---|---|
use_height |
bool | use point.z for clustering |
min_cluster_size |
int | the minimum number of points that a cluster needs to contain in order to be considered valid |
max_cluster_size |
int | the maximum number of points that a cluster needs to contain in order to be considered valid |
tolerance |
float | the spatial cluster tolerance as a measure in the L2 Euclidean space |
voxel_grid_based_euclidean_cluster
| Name | Type | Description |
|---|---|---|
use_height |
bool | use point.z for clustering |
min_cluster_size |
int | the minimum number of points that a cluster needs to contain in order to be considered valid |
max_cluster_size |
int | the maximum number of points that a cluster needs to contain in order to be considered valid |
tolerance |
float | the spatial cluster tolerance as a measure in the L2 Euclidean space |
voxel_leaf_size |
float | the voxel leaf size of x and y |
min_points_number_per_voxel |
int | the minimum number of points for a voxel |
Assumptions / Known limits
Cluster size limits
The two size parameters are assumed to satisfy 1 <= min_cluster_size <= max_cluster_size. The
nodes do not check this, and the behaviour is undefined otherwise.
(Optional) Error detection and handling
(Optional) Performance characterization
(Optional) References/External links
<!– Write links you referred to when you implemented.
Example:
File truncated at 100 lines see the full file
Changelog for package autoware_euclidean_cluster_object_detector
1.10.0 (2026-09-28)
- Merge remote-tracking branch 'origin/main' into tmp/bot/bump_version_base
- test(euclidean_cluster_object_detector): fixed test euclidian cluser
(#1393)
test(autoware_euclidean_cluster_object_detector): make the
voxel-grid tests deterministic The tests drew their point
coordinates from an unseeded RNG. [testcase3]{.title-ref} failed in
CI about 20% of the time, and no failure could be reproduced,
because no seed was recorded. The input clouds are now written out
as literal points.
- [testcase1/2/3]{.title-ref} are renamed after the limit each one
exercises, and they pin [skipped_cluster_count]{.title-ref} as well.
- [ExceedMaxClusterSize]{.title-ref} is removed. It drove the same
rejection path as the max-size case and asserted less about it.
- New cases cover several objects in one scan, a count sitting on
both limits at once, a contradictory pair of limits, and skipping
decided per cluster.
- [BoundaryVoxelPointsAreNotDropped]{.title-ref} is unchanged. It
came from the regression fixed in
#1376.
- Outside the tests, the map key in
[cluster_voxel_grid()]{.title-ref} is renamed from
[voxel_1d_idx]{.title-ref} to [centroid_idx]{.title-ref}.
[getCentroidIndexAt()]{.title-ref} returns an index into the
filtered centroid cloud, not the grid cell index the old name
claimed.
- The README states the assumed range for the two size limits.
- fix(perception): declare the dependencies these packages use (#1371) Each of these packages uses a package it never declares. Either it includes a header of that package, or it names a symbol of it while the header arrives through another dependency. Both build today only because some declared dependency re-exports the owner, so a change in an unrelated repository can break them without anything here changing. The tag follows where the dependency is used: a use in an installed header or in code compiled into the library takes <depend>, one reached only from test/ takes <test_depend>. System libraries are named by the rosdep key this workspace already prefers.
- fix(autoware_euclidean_cluster_object_detector): keep boundary voxel points in their clusters (#1376) The detector recomputed the map key of each voxel from the float coordinates of its centroid. The centroid is a float mean. For points that sit exactly on a cell boundary, this mean rounds to one float step under the boundary. The recomputed key then pointed to the neighbor cell, and the detector dropped the raw points of that voxel. The oversized cluster in VoxelGridBasedEuclideanClusterTest.testcase3 then passed the max_cluster_size check, and the test failed intermittently. Key the map by the centroid index instead. This index is the same value that getCentroidIndexAt() returns for the raw points. Add a deterministic regression test for the boundary case.
- feat: [codecov/refactoring] [euclidean_cluster_object_detector]
Core logic isolation (SECOND HALF)
(#1244)
- added voxel grid cluster into core logic header, and specify a strategy gate to init once at startup
- implemented voxel_grid algorithm into the core logic module, with a nice touch of init once to address Akamine-san concern
- node unification between cluster standard and cluster nvoxel grid with a bunch of diagnostic added
- removed legacy files from old voxel grid structure, now already unified into core logics
- adjusted launch file to reflect new voxel grid locs
- purged voxel_grid relatives from cmakelist
- refactor test_euclidean_cluster_object_detection_integration.cpp test suite
- refactor test_node.cpp test suite
- heavy refactor of test_voxel_grid_based_euclidean_cluster.cpp test suite
- added the weird 2D flattening feature inside the voxel grid clustering
- removed redundant test inside tesdt voxel
- fixedspellcheck error (why Akamine-san's name does not pass the spellcheck?)
- bring back the voxel grid based euclidean cluster node header hpp
- reimplement voxel grid based euclidean cluster node source cpp
- clean up standard node, remove the voxel leaf size delcairation
- reimplemented voxel grid stuffs to CMakeLists
- fixed launch revert back to voxel node
- successfully reverted to the dual-node architecture
- fully reverted to dual nodes, all builds tests good now
- spell check and cpp ckeck diff fix
- feat: [codecov/refactoring] [euclidean_cluster_object_detector]
Core logic isolation (FIRST HALF)
(#1239)
- implemented master params struct for this node new refactoring
- implemented ros_conversions.cpp/.hpp
- implemented euclidean_cluster_object_detector.hpp as the header for core logic, now with only cluster_standard
- implemented euclidean_cluster_object_detector.cpp as the source for core logic, now with only cluster_standard
- euclidean_cluster_node core logic refine, now only with cluster_standard()
File truncated at 100 lines see the full file
Package Dependencies
System Dependencies
| Name |
|---|
| libpcl-all-dev |
Dependant Packages
| Name | Deps |
|---|---|
| autoware_core_perception |
Launch files
- launch/euclidean_cluster.launch.xml
-
- input_pointcloud [default: /sensing/lidar/top/pointcloud_raw]
- input_map [default: /map/pointcloud_map]
- output_clusters [default: clusters]
- use_low_height_cropbox [default: false]
- euclidean_param_path [default: $(find-pkg-share autoware_euclidean_cluster_object_detector)/config/euclidean_cluster.param.yaml]
- use_pointcloud_container [default: false]
- pointcloud_container_name [default: pointcloud_container]
- launch/voxel_grid_based_euclidean_cluster.launch.xml
-
- input_pointcloud [default: /sensing/lidar/top/pointcloud_raw]
- input_map [default: /map/pointcloud_map]
- output_clusters [default: clusters]
- use_low_height_cropbox [default: false]
- voxel_grid_based_euclidean_param_path [default: $(find-pkg-share autoware_euclidean_cluster_object_detector)/config/voxel_grid_based_euclidean_cluster.param.yaml]
- use_pointcloud_container [default: false]
- pointcloud_container_name [default: pointcloud_container]
Messages
Services
Plugins
Recent questions tagged autoware_euclidean_cluster_object_detector at Robotics Stack Exchange
Package Summary
| Version | 1.10.0 |
| License | Apache License 2.0 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/autowarefoundation/autoware_core.git |
| VCS Type | git |
| VCS Version | main |
| Last Updated | 2026-10-07 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Maintainers
- Yukihiro Saito
- Dai Nguyen
Authors
autoware_euclidean_cluster_object_detector
Purpose
autoware_euclidean_cluster_object_detector is a package for clustering points into smaller parts to classify objects.
This package has two clustering methods: euclidean_cluster and voxel_grid_based_euclidean_cluster.
Inner-workings / Algorithms
euclidean_cluster
pcl::EuclideanClusterExtraction is applied to points. See official document for details.
voxel_grid_based_euclidean_cluster
- A centroid in each voxel is calculated by
pcl::VoxelGrid. - The centroids are clustered by
pcl::EuclideanClusterExtraction. - The input points are clustered based on the clustered centroids.
Inputs / Outputs
Input
| Name | Type | Description |
|---|---|---|
input |
sensor_msgs::msg::PointCloud2 |
input pointcloud |
Output
| Name | Type | Description |
|---|---|---|
output |
autoware_perception_msgs::msg::DetectedObjects |
detected objects |
debug/clusters |
sensor_msgs::msg::PointCloud2 |
colored cluster pointcloud for visualization |
Parameters
Core Parameters
euclidean_cluster
| Name | Type | Description |
|---|---|---|
use_height |
bool | use point.z for clustering |
min_cluster_size |
int | the minimum number of points that a cluster needs to contain in order to be considered valid |
max_cluster_size |
int | the maximum number of points that a cluster needs to contain in order to be considered valid |
tolerance |
float | the spatial cluster tolerance as a measure in the L2 Euclidean space |
voxel_grid_based_euclidean_cluster
| Name | Type | Description |
|---|---|---|
use_height |
bool | use point.z for clustering |
min_cluster_size |
int | the minimum number of points that a cluster needs to contain in order to be considered valid |
max_cluster_size |
int | the maximum number of points that a cluster needs to contain in order to be considered valid |
tolerance |
float | the spatial cluster tolerance as a measure in the L2 Euclidean space |
voxel_leaf_size |
float | the voxel leaf size of x and y |
min_points_number_per_voxel |
int | the minimum number of points for a voxel |
Assumptions / Known limits
Cluster size limits
The two size parameters are assumed to satisfy 1 <= min_cluster_size <= max_cluster_size. The
nodes do not check this, and the behaviour is undefined otherwise.
(Optional) Error detection and handling
(Optional) Performance characterization
(Optional) References/External links
<!– Write links you referred to when you implemented.
Example:
File truncated at 100 lines see the full file
Changelog for package autoware_euclidean_cluster_object_detector
1.10.0 (2026-09-28)
- Merge remote-tracking branch 'origin/main' into tmp/bot/bump_version_base
- test(euclidean_cluster_object_detector): fixed test euclidian cluser
(#1393)
test(autoware_euclidean_cluster_object_detector): make the
voxel-grid tests deterministic The tests drew their point
coordinates from an unseeded RNG. [testcase3]{.title-ref} failed in
CI about 20% of the time, and no failure could be reproduced,
because no seed was recorded. The input clouds are now written out
as literal points.
- [testcase1/2/3]{.title-ref} are renamed after the limit each one
exercises, and they pin [skipped_cluster_count]{.title-ref} as well.
- [ExceedMaxClusterSize]{.title-ref} is removed. It drove the same
rejection path as the max-size case and asserted less about it.
- New cases cover several objects in one scan, a count sitting on
both limits at once, a contradictory pair of limits, and skipping
decided per cluster.
- [BoundaryVoxelPointsAreNotDropped]{.title-ref} is unchanged. It
came from the regression fixed in
#1376.
- Outside the tests, the map key in
[cluster_voxel_grid()]{.title-ref} is renamed from
[voxel_1d_idx]{.title-ref} to [centroid_idx]{.title-ref}.
[getCentroidIndexAt()]{.title-ref} returns an index into the
filtered centroid cloud, not the grid cell index the old name
claimed.
- The README states the assumed range for the two size limits.
- fix(perception): declare the dependencies these packages use (#1371) Each of these packages uses a package it never declares. Either it includes a header of that package, or it names a symbol of it while the header arrives through another dependency. Both build today only because some declared dependency re-exports the owner, so a change in an unrelated repository can break them without anything here changing. The tag follows where the dependency is used: a use in an installed header or in code compiled into the library takes <depend>, one reached only from test/ takes <test_depend>. System libraries are named by the rosdep key this workspace already prefers.
- fix(autoware_euclidean_cluster_object_detector): keep boundary voxel points in their clusters (#1376) The detector recomputed the map key of each voxel from the float coordinates of its centroid. The centroid is a float mean. For points that sit exactly on a cell boundary, this mean rounds to one float step under the boundary. The recomputed key then pointed to the neighbor cell, and the detector dropped the raw points of that voxel. The oversized cluster in VoxelGridBasedEuclideanClusterTest.testcase3 then passed the max_cluster_size check, and the test failed intermittently. Key the map by the centroid index instead. This index is the same value that getCentroidIndexAt() returns for the raw points. Add a deterministic regression test for the boundary case.
- feat: [codecov/refactoring] [euclidean_cluster_object_detector]
Core logic isolation (SECOND HALF)
(#1244)
- added voxel grid cluster into core logic header, and specify a strategy gate to init once at startup
- implemented voxel_grid algorithm into the core logic module, with a nice touch of init once to address Akamine-san concern
- node unification between cluster standard and cluster nvoxel grid with a bunch of diagnostic added
- removed legacy files from old voxel grid structure, now already unified into core logics
- adjusted launch file to reflect new voxel grid locs
- purged voxel_grid relatives from cmakelist
- refactor test_euclidean_cluster_object_detection_integration.cpp test suite
- refactor test_node.cpp test suite
- heavy refactor of test_voxel_grid_based_euclidean_cluster.cpp test suite
- added the weird 2D flattening feature inside the voxel grid clustering
- removed redundant test inside tesdt voxel
- fixedspellcheck error (why Akamine-san's name does not pass the spellcheck?)
- bring back the voxel grid based euclidean cluster node header hpp
- reimplement voxel grid based euclidean cluster node source cpp
- clean up standard node, remove the voxel leaf size delcairation
- reimplemented voxel grid stuffs to CMakeLists
- fixed launch revert back to voxel node
- successfully reverted to the dual-node architecture
- fully reverted to dual nodes, all builds tests good now
- spell check and cpp ckeck diff fix
- feat: [codecov/refactoring] [euclidean_cluster_object_detector]
Core logic isolation (FIRST HALF)
(#1239)
- implemented master params struct for this node new refactoring
- implemented ros_conversions.cpp/.hpp
- implemented euclidean_cluster_object_detector.hpp as the header for core logic, now with only cluster_standard
- implemented euclidean_cluster_object_detector.cpp as the source for core logic, now with only cluster_standard
- euclidean_cluster_node core logic refine, now only with cluster_standard()
File truncated at 100 lines see the full file
Package Dependencies
System Dependencies
| Name |
|---|
| libpcl-all-dev |
Dependant Packages
| Name | Deps |
|---|---|
| autoware_core_perception |
Launch files
- launch/euclidean_cluster.launch.xml
-
- input_pointcloud [default: /sensing/lidar/top/pointcloud_raw]
- input_map [default: /map/pointcloud_map]
- output_clusters [default: clusters]
- use_low_height_cropbox [default: false]
- euclidean_param_path [default: $(find-pkg-share autoware_euclidean_cluster_object_detector)/config/euclidean_cluster.param.yaml]
- use_pointcloud_container [default: false]
- pointcloud_container_name [default: pointcloud_container]
- launch/voxel_grid_based_euclidean_cluster.launch.xml
-
- input_pointcloud [default: /sensing/lidar/top/pointcloud_raw]
- input_map [default: /map/pointcloud_map]
- output_clusters [default: clusters]
- use_low_height_cropbox [default: false]
- voxel_grid_based_euclidean_param_path [default: $(find-pkg-share autoware_euclidean_cluster_object_detector)/config/voxel_grid_based_euclidean_cluster.param.yaml]
- use_pointcloud_container [default: false]
- pointcloud_container_name [default: pointcloud_container]
Messages
Services
Plugins
Recent questions tagged autoware_euclidean_cluster_object_detector at Robotics Stack Exchange
Package Summary
| Version | 1.10.0 |
| License | Apache License 2.0 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/autowarefoundation/autoware_core.git |
| VCS Type | git |
| VCS Version | main |
| Last Updated | 2026-10-07 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Maintainers
- Yukihiro Saito
- Dai Nguyen
Authors
autoware_euclidean_cluster_object_detector
Purpose
autoware_euclidean_cluster_object_detector is a package for clustering points into smaller parts to classify objects.
This package has two clustering methods: euclidean_cluster and voxel_grid_based_euclidean_cluster.
Inner-workings / Algorithms
euclidean_cluster
pcl::EuclideanClusterExtraction is applied to points. See official document for details.
voxel_grid_based_euclidean_cluster
- A centroid in each voxel is calculated by
pcl::VoxelGrid. - The centroids are clustered by
pcl::EuclideanClusterExtraction. - The input points are clustered based on the clustered centroids.
Inputs / Outputs
Input
| Name | Type | Description |
|---|---|---|
input |
sensor_msgs::msg::PointCloud2 |
input pointcloud |
Output
| Name | Type | Description |
|---|---|---|
output |
autoware_perception_msgs::msg::DetectedObjects |
detected objects |
debug/clusters |
sensor_msgs::msg::PointCloud2 |
colored cluster pointcloud for visualization |
Parameters
Core Parameters
euclidean_cluster
| Name | Type | Description |
|---|---|---|
use_height |
bool | use point.z for clustering |
min_cluster_size |
int | the minimum number of points that a cluster needs to contain in order to be considered valid |
max_cluster_size |
int | the maximum number of points that a cluster needs to contain in order to be considered valid |
tolerance |
float | the spatial cluster tolerance as a measure in the L2 Euclidean space |
voxel_grid_based_euclidean_cluster
| Name | Type | Description |
|---|---|---|
use_height |
bool | use point.z for clustering |
min_cluster_size |
int | the minimum number of points that a cluster needs to contain in order to be considered valid |
max_cluster_size |
int | the maximum number of points that a cluster needs to contain in order to be considered valid |
tolerance |
float | the spatial cluster tolerance as a measure in the L2 Euclidean space |
voxel_leaf_size |
float | the voxel leaf size of x and y |
min_points_number_per_voxel |
int | the minimum number of points for a voxel |
Assumptions / Known limits
Cluster size limits
The two size parameters are assumed to satisfy 1 <= min_cluster_size <= max_cluster_size. The
nodes do not check this, and the behaviour is undefined otherwise.
(Optional) Error detection and handling
(Optional) Performance characterization
(Optional) References/External links
<!– Write links you referred to when you implemented.
Example:
File truncated at 100 lines see the full file
Changelog for package autoware_euclidean_cluster_object_detector
1.10.0 (2026-09-28)
- Merge remote-tracking branch 'origin/main' into tmp/bot/bump_version_base
- test(euclidean_cluster_object_detector): fixed test euclidian cluser
(#1393)
test(autoware_euclidean_cluster_object_detector): make the
voxel-grid tests deterministic The tests drew their point
coordinates from an unseeded RNG. [testcase3]{.title-ref} failed in
CI about 20% of the time, and no failure could be reproduced,
because no seed was recorded. The input clouds are now written out
as literal points.
- [testcase1/2/3]{.title-ref} are renamed after the limit each one
exercises, and they pin [skipped_cluster_count]{.title-ref} as well.
- [ExceedMaxClusterSize]{.title-ref} is removed. It drove the same
rejection path as the max-size case and asserted less about it.
- New cases cover several objects in one scan, a count sitting on
both limits at once, a contradictory pair of limits, and skipping
decided per cluster.
- [BoundaryVoxelPointsAreNotDropped]{.title-ref} is unchanged. It
came from the regression fixed in
#1376.
- Outside the tests, the map key in
[cluster_voxel_grid()]{.title-ref} is renamed from
[voxel_1d_idx]{.title-ref} to [centroid_idx]{.title-ref}.
[getCentroidIndexAt()]{.title-ref} returns an index into the
filtered centroid cloud, not the grid cell index the old name
claimed.
- The README states the assumed range for the two size limits.
- fix(perception): declare the dependencies these packages use (#1371) Each of these packages uses a package it never declares. Either it includes a header of that package, or it names a symbol of it while the header arrives through another dependency. Both build today only because some declared dependency re-exports the owner, so a change in an unrelated repository can break them without anything here changing. The tag follows where the dependency is used: a use in an installed header or in code compiled into the library takes <depend>, one reached only from test/ takes <test_depend>. System libraries are named by the rosdep key this workspace already prefers.
- fix(autoware_euclidean_cluster_object_detector): keep boundary voxel points in their clusters (#1376) The detector recomputed the map key of each voxel from the float coordinates of its centroid. The centroid is a float mean. For points that sit exactly on a cell boundary, this mean rounds to one float step under the boundary. The recomputed key then pointed to the neighbor cell, and the detector dropped the raw points of that voxel. The oversized cluster in VoxelGridBasedEuclideanClusterTest.testcase3 then passed the max_cluster_size check, and the test failed intermittently. Key the map by the centroid index instead. This index is the same value that getCentroidIndexAt() returns for the raw points. Add a deterministic regression test for the boundary case.
- feat: [codecov/refactoring] [euclidean_cluster_object_detector]
Core logic isolation (SECOND HALF)
(#1244)
- added voxel grid cluster into core logic header, and specify a strategy gate to init once at startup
- implemented voxel_grid algorithm into the core logic module, with a nice touch of init once to address Akamine-san concern
- node unification between cluster standard and cluster nvoxel grid with a bunch of diagnostic added
- removed legacy files from old voxel grid structure, now already unified into core logics
- adjusted launch file to reflect new voxel grid locs
- purged voxel_grid relatives from cmakelist
- refactor test_euclidean_cluster_object_detection_integration.cpp test suite
- refactor test_node.cpp test suite
- heavy refactor of test_voxel_grid_based_euclidean_cluster.cpp test suite
- added the weird 2D flattening feature inside the voxel grid clustering
- removed redundant test inside tesdt voxel
- fixedspellcheck error (why Akamine-san's name does not pass the spellcheck?)
- bring back the voxel grid based euclidean cluster node header hpp
- reimplement voxel grid based euclidean cluster node source cpp
- clean up standard node, remove the voxel leaf size delcairation
- reimplemented voxel grid stuffs to CMakeLists
- fixed launch revert back to voxel node
- successfully reverted to the dual-node architecture
- fully reverted to dual nodes, all builds tests good now
- spell check and cpp ckeck diff fix
- feat: [codecov/refactoring] [euclidean_cluster_object_detector]
Core logic isolation (FIRST HALF)
(#1239)
- implemented master params struct for this node new refactoring
- implemented ros_conversions.cpp/.hpp
- implemented euclidean_cluster_object_detector.hpp as the header for core logic, now with only cluster_standard
- implemented euclidean_cluster_object_detector.cpp as the source for core logic, now with only cluster_standard
- euclidean_cluster_node core logic refine, now only with cluster_standard()
File truncated at 100 lines see the full file
Package Dependencies
System Dependencies
| Name |
|---|
| libpcl-all-dev |
Dependant Packages
| Name | Deps |
|---|---|
| autoware_core_perception |
Launch files
- launch/euclidean_cluster.launch.xml
-
- input_pointcloud [default: /sensing/lidar/top/pointcloud_raw]
- input_map [default: /map/pointcloud_map]
- output_clusters [default: clusters]
- use_low_height_cropbox [default: false]
- euclidean_param_path [default: $(find-pkg-share autoware_euclidean_cluster_object_detector)/config/euclidean_cluster.param.yaml]
- use_pointcloud_container [default: false]
- pointcloud_container_name [default: pointcloud_container]
- launch/voxel_grid_based_euclidean_cluster.launch.xml
-
- input_pointcloud [default: /sensing/lidar/top/pointcloud_raw]
- input_map [default: /map/pointcloud_map]
- output_clusters [default: clusters]
- use_low_height_cropbox [default: false]
- voxel_grid_based_euclidean_param_path [default: $(find-pkg-share autoware_euclidean_cluster_object_detector)/config/voxel_grid_based_euclidean_cluster.param.yaml]
- use_pointcloud_container [default: false]
- pointcloud_container_name [default: pointcloud_container]
Messages
Services
Plugins
Recent questions tagged autoware_euclidean_cluster_object_detector at Robotics Stack Exchange
Package Summary
| Version | 1.10.0 |
| License | Apache License 2.0 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/autowarefoundation/autoware_core.git |
| VCS Type | git |
| VCS Version | main |
| Last Updated | 2026-10-07 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Maintainers
- Yukihiro Saito
- Dai Nguyen
Authors
autoware_euclidean_cluster_object_detector
Purpose
autoware_euclidean_cluster_object_detector is a package for clustering points into smaller parts to classify objects.
This package has two clustering methods: euclidean_cluster and voxel_grid_based_euclidean_cluster.
Inner-workings / Algorithms
euclidean_cluster
pcl::EuclideanClusterExtraction is applied to points. See official document for details.
voxel_grid_based_euclidean_cluster
- A centroid in each voxel is calculated by
pcl::VoxelGrid. - The centroids are clustered by
pcl::EuclideanClusterExtraction. - The input points are clustered based on the clustered centroids.
Inputs / Outputs
Input
| Name | Type | Description |
|---|---|---|
input |
sensor_msgs::msg::PointCloud2 |
input pointcloud |
Output
| Name | Type | Description |
|---|---|---|
output |
autoware_perception_msgs::msg::DetectedObjects |
detected objects |
debug/clusters |
sensor_msgs::msg::PointCloud2 |
colored cluster pointcloud for visualization |
Parameters
Core Parameters
euclidean_cluster
| Name | Type | Description |
|---|---|---|
use_height |
bool | use point.z for clustering |
min_cluster_size |
int | the minimum number of points that a cluster needs to contain in order to be considered valid |
max_cluster_size |
int | the maximum number of points that a cluster needs to contain in order to be considered valid |
tolerance |
float | the spatial cluster tolerance as a measure in the L2 Euclidean space |
voxel_grid_based_euclidean_cluster
| Name | Type | Description |
|---|---|---|
use_height |
bool | use point.z for clustering |
min_cluster_size |
int | the minimum number of points that a cluster needs to contain in order to be considered valid |
max_cluster_size |
int | the maximum number of points that a cluster needs to contain in order to be considered valid |
tolerance |
float | the spatial cluster tolerance as a measure in the L2 Euclidean space |
voxel_leaf_size |
float | the voxel leaf size of x and y |
min_points_number_per_voxel |
int | the minimum number of points for a voxel |
Assumptions / Known limits
Cluster size limits
The two size parameters are assumed to satisfy 1 <= min_cluster_size <= max_cluster_size. The
nodes do not check this, and the behaviour is undefined otherwise.
(Optional) Error detection and handling
(Optional) Performance characterization
(Optional) References/External links
<!– Write links you referred to when you implemented.
Example:
File truncated at 100 lines see the full file
Changelog for package autoware_euclidean_cluster_object_detector
1.10.0 (2026-09-28)
- Merge remote-tracking branch 'origin/main' into tmp/bot/bump_version_base
- test(euclidean_cluster_object_detector): fixed test euclidian cluser
(#1393)
test(autoware_euclidean_cluster_object_detector): make the
voxel-grid tests deterministic The tests drew their point
coordinates from an unseeded RNG. [testcase3]{.title-ref} failed in
CI about 20% of the time, and no failure could be reproduced,
because no seed was recorded. The input clouds are now written out
as literal points.
- [testcase1/2/3]{.title-ref} are renamed after the limit each one
exercises, and they pin [skipped_cluster_count]{.title-ref} as well.
- [ExceedMaxClusterSize]{.title-ref} is removed. It drove the same
rejection path as the max-size case and asserted less about it.
- New cases cover several objects in one scan, a count sitting on
both limits at once, a contradictory pair of limits, and skipping
decided per cluster.
- [BoundaryVoxelPointsAreNotDropped]{.title-ref} is unchanged. It
came from the regression fixed in
#1376.
- Outside the tests, the map key in
[cluster_voxel_grid()]{.title-ref} is renamed from
[voxel_1d_idx]{.title-ref} to [centroid_idx]{.title-ref}.
[getCentroidIndexAt()]{.title-ref} returns an index into the
filtered centroid cloud, not the grid cell index the old name
claimed.
- The README states the assumed range for the two size limits.
- fix(perception): declare the dependencies these packages use (#1371) Each of these packages uses a package it never declares. Either it includes a header of that package, or it names a symbol of it while the header arrives through another dependency. Both build today only because some declared dependency re-exports the owner, so a change in an unrelated repository can break them without anything here changing. The tag follows where the dependency is used: a use in an installed header or in code compiled into the library takes <depend>, one reached only from test/ takes <test_depend>. System libraries are named by the rosdep key this workspace already prefers.
- fix(autoware_euclidean_cluster_object_detector): keep boundary voxel points in their clusters (#1376) The detector recomputed the map key of each voxel from the float coordinates of its centroid. The centroid is a float mean. For points that sit exactly on a cell boundary, this mean rounds to one float step under the boundary. The recomputed key then pointed to the neighbor cell, and the detector dropped the raw points of that voxel. The oversized cluster in VoxelGridBasedEuclideanClusterTest.testcase3 then passed the max_cluster_size check, and the test failed intermittently. Key the map by the centroid index instead. This index is the same value that getCentroidIndexAt() returns for the raw points. Add a deterministic regression test for the boundary case.
- feat: [codecov/refactoring] [euclidean_cluster_object_detector]
Core logic isolation (SECOND HALF)
(#1244)
- added voxel grid cluster into core logic header, and specify a strategy gate to init once at startup
- implemented voxel_grid algorithm into the core logic module, with a nice touch of init once to address Akamine-san concern
- node unification between cluster standard and cluster nvoxel grid with a bunch of diagnostic added
- removed legacy files from old voxel grid structure, now already unified into core logics
- adjusted launch file to reflect new voxel grid locs
- purged voxel_grid relatives from cmakelist
- refactor test_euclidean_cluster_object_detection_integration.cpp test suite
- refactor test_node.cpp test suite
- heavy refactor of test_voxel_grid_based_euclidean_cluster.cpp test suite
- added the weird 2D flattening feature inside the voxel grid clustering
- removed redundant test inside tesdt voxel
- fixedspellcheck error (why Akamine-san's name does not pass the spellcheck?)
- bring back the voxel grid based euclidean cluster node header hpp
- reimplement voxel grid based euclidean cluster node source cpp
- clean up standard node, remove the voxel leaf size delcairation
- reimplemented voxel grid stuffs to CMakeLists
- fixed launch revert back to voxel node
- successfully reverted to the dual-node architecture
- fully reverted to dual nodes, all builds tests good now
- spell check and cpp ckeck diff fix
- feat: [codecov/refactoring] [euclidean_cluster_object_detector]
Core logic isolation (FIRST HALF)
(#1239)
- implemented master params struct for this node new refactoring
- implemented ros_conversions.cpp/.hpp
- implemented euclidean_cluster_object_detector.hpp as the header for core logic, now with only cluster_standard
- implemented euclidean_cluster_object_detector.cpp as the source for core logic, now with only cluster_standard
- euclidean_cluster_node core logic refine, now only with cluster_standard()
File truncated at 100 lines see the full file
Package Dependencies
System Dependencies
| Name |
|---|
| libpcl-all-dev |
Dependant Packages
| Name | Deps |
|---|---|
| autoware_core_perception |
Launch files
- launch/euclidean_cluster.launch.xml
-
- input_pointcloud [default: /sensing/lidar/top/pointcloud_raw]
- input_map [default: /map/pointcloud_map]
- output_clusters [default: clusters]
- use_low_height_cropbox [default: false]
- euclidean_param_path [default: $(find-pkg-share autoware_euclidean_cluster_object_detector)/config/euclidean_cluster.param.yaml]
- use_pointcloud_container [default: false]
- pointcloud_container_name [default: pointcloud_container]
- launch/voxel_grid_based_euclidean_cluster.launch.xml
-
- input_pointcloud [default: /sensing/lidar/top/pointcloud_raw]
- input_map [default: /map/pointcloud_map]
- output_clusters [default: clusters]
- use_low_height_cropbox [default: false]
- voxel_grid_based_euclidean_param_path [default: $(find-pkg-share autoware_euclidean_cluster_object_detector)/config/voxel_grid_based_euclidean_cluster.param.yaml]
- use_pointcloud_container [default: false]
- pointcloud_container_name [default: pointcloud_container]
Messages
Services
Plugins
Recent questions tagged autoware_euclidean_cluster_object_detector at Robotics Stack Exchange
Package Summary
| Version | 1.10.0 |
| License | Apache License 2.0 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/autowarefoundation/autoware_core.git |
| VCS Type | git |
| VCS Version | main |
| Last Updated | 2026-10-07 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Maintainers
- Yukihiro Saito
- Dai Nguyen
Authors
autoware_euclidean_cluster_object_detector
Purpose
autoware_euclidean_cluster_object_detector is a package for clustering points into smaller parts to classify objects.
This package has two clustering methods: euclidean_cluster and voxel_grid_based_euclidean_cluster.
Inner-workings / Algorithms
euclidean_cluster
pcl::EuclideanClusterExtraction is applied to points. See official document for details.
voxel_grid_based_euclidean_cluster
- A centroid in each voxel is calculated by
pcl::VoxelGrid. - The centroids are clustered by
pcl::EuclideanClusterExtraction. - The input points are clustered based on the clustered centroids.
Inputs / Outputs
Input
| Name | Type | Description |
|---|---|---|
input |
sensor_msgs::msg::PointCloud2 |
input pointcloud |
Output
| Name | Type | Description |
|---|---|---|
output |
autoware_perception_msgs::msg::DetectedObjects |
detected objects |
debug/clusters |
sensor_msgs::msg::PointCloud2 |
colored cluster pointcloud for visualization |
Parameters
Core Parameters
euclidean_cluster
| Name | Type | Description |
|---|---|---|
use_height |
bool | use point.z for clustering |
min_cluster_size |
int | the minimum number of points that a cluster needs to contain in order to be considered valid |
max_cluster_size |
int | the maximum number of points that a cluster needs to contain in order to be considered valid |
tolerance |
float | the spatial cluster tolerance as a measure in the L2 Euclidean space |
voxel_grid_based_euclidean_cluster
| Name | Type | Description |
|---|---|---|
use_height |
bool | use point.z for clustering |
min_cluster_size |
int | the minimum number of points that a cluster needs to contain in order to be considered valid |
max_cluster_size |
int | the maximum number of points that a cluster needs to contain in order to be considered valid |
tolerance |
float | the spatial cluster tolerance as a measure in the L2 Euclidean space |
voxel_leaf_size |
float | the voxel leaf size of x and y |
min_points_number_per_voxel |
int | the minimum number of points for a voxel |
Assumptions / Known limits
Cluster size limits
The two size parameters are assumed to satisfy 1 <= min_cluster_size <= max_cluster_size. The
nodes do not check this, and the behaviour is undefined otherwise.
(Optional) Error detection and handling
(Optional) Performance characterization
(Optional) References/External links
<!– Write links you referred to when you implemented.
Example:
File truncated at 100 lines see the full file
Changelog for package autoware_euclidean_cluster_object_detector
1.10.0 (2026-09-28)
- Merge remote-tracking branch 'origin/main' into tmp/bot/bump_version_base
- test(euclidean_cluster_object_detector): fixed test euclidian cluser
(#1393)
test(autoware_euclidean_cluster_object_detector): make the
voxel-grid tests deterministic The tests drew their point
coordinates from an unseeded RNG. [testcase3]{.title-ref} failed in
CI about 20% of the time, and no failure could be reproduced,
because no seed was recorded. The input clouds are now written out
as literal points.
- [testcase1/2/3]{.title-ref} are renamed after the limit each one
exercises, and they pin [skipped_cluster_count]{.title-ref} as well.
- [ExceedMaxClusterSize]{.title-ref} is removed. It drove the same
rejection path as the max-size case and asserted less about it.
- New cases cover several objects in one scan, a count sitting on
both limits at once, a contradictory pair of limits, and skipping
decided per cluster.
- [BoundaryVoxelPointsAreNotDropped]{.title-ref} is unchanged. It
came from the regression fixed in
#1376.
- Outside the tests, the map key in
[cluster_voxel_grid()]{.title-ref} is renamed from
[voxel_1d_idx]{.title-ref} to [centroid_idx]{.title-ref}.
[getCentroidIndexAt()]{.title-ref} returns an index into the
filtered centroid cloud, not the grid cell index the old name
claimed.
- The README states the assumed range for the two size limits.
- fix(perception): declare the dependencies these packages use (#1371) Each of these packages uses a package it never declares. Either it includes a header of that package, or it names a symbol of it while the header arrives through another dependency. Both build today only because some declared dependency re-exports the owner, so a change in an unrelated repository can break them without anything here changing. The tag follows where the dependency is used: a use in an installed header or in code compiled into the library takes <depend>, one reached only from test/ takes <test_depend>. System libraries are named by the rosdep key this workspace already prefers.
- fix(autoware_euclidean_cluster_object_detector): keep boundary voxel points in their clusters (#1376) The detector recomputed the map key of each voxel from the float coordinates of its centroid. The centroid is a float mean. For points that sit exactly on a cell boundary, this mean rounds to one float step under the boundary. The recomputed key then pointed to the neighbor cell, and the detector dropped the raw points of that voxel. The oversized cluster in VoxelGridBasedEuclideanClusterTest.testcase3 then passed the max_cluster_size check, and the test failed intermittently. Key the map by the centroid index instead. This index is the same value that getCentroidIndexAt() returns for the raw points. Add a deterministic regression test for the boundary case.
- feat: [codecov/refactoring] [euclidean_cluster_object_detector]
Core logic isolation (SECOND HALF)
(#1244)
- added voxel grid cluster into core logic header, and specify a strategy gate to init once at startup
- implemented voxel_grid algorithm into the core logic module, with a nice touch of init once to address Akamine-san concern
- node unification between cluster standard and cluster nvoxel grid with a bunch of diagnostic added
- removed legacy files from old voxel grid structure, now already unified into core logics
- adjusted launch file to reflect new voxel grid locs
- purged voxel_grid relatives from cmakelist
- refactor test_euclidean_cluster_object_detection_integration.cpp test suite
- refactor test_node.cpp test suite
- heavy refactor of test_voxel_grid_based_euclidean_cluster.cpp test suite
- added the weird 2D flattening feature inside the voxel grid clustering
- removed redundant test inside tesdt voxel
- fixedspellcheck error (why Akamine-san's name does not pass the spellcheck?)
- bring back the voxel grid based euclidean cluster node header hpp
- reimplement voxel grid based euclidean cluster node source cpp
- clean up standard node, remove the voxel leaf size delcairation
- reimplemented voxel grid stuffs to CMakeLists
- fixed launch revert back to voxel node
- successfully reverted to the dual-node architecture
- fully reverted to dual nodes, all builds tests good now
- spell check and cpp ckeck diff fix
- feat: [codecov/refactoring] [euclidean_cluster_object_detector]
Core logic isolation (FIRST HALF)
(#1239)
- implemented master params struct for this node new refactoring
- implemented ros_conversions.cpp/.hpp
- implemented euclidean_cluster_object_detector.hpp as the header for core logic, now with only cluster_standard
- implemented euclidean_cluster_object_detector.cpp as the source for core logic, now with only cluster_standard
- euclidean_cluster_node core logic refine, now only with cluster_standard()
File truncated at 100 lines see the full file
Package Dependencies
System Dependencies
| Name |
|---|
| libpcl-all-dev |
Dependant Packages
| Name | Deps |
|---|---|
| autoware_core_perception |
Launch files
- launch/euclidean_cluster.launch.xml
-
- input_pointcloud [default: /sensing/lidar/top/pointcloud_raw]
- input_map [default: /map/pointcloud_map]
- output_clusters [default: clusters]
- use_low_height_cropbox [default: false]
- euclidean_param_path [default: $(find-pkg-share autoware_euclidean_cluster_object_detector)/config/euclidean_cluster.param.yaml]
- use_pointcloud_container [default: false]
- pointcloud_container_name [default: pointcloud_container]
- launch/voxel_grid_based_euclidean_cluster.launch.xml
-
- input_pointcloud [default: /sensing/lidar/top/pointcloud_raw]
- input_map [default: /map/pointcloud_map]
- output_clusters [default: clusters]
- use_low_height_cropbox [default: false]
- voxel_grid_based_euclidean_param_path [default: $(find-pkg-share autoware_euclidean_cluster_object_detector)/config/voxel_grid_based_euclidean_cluster.param.yaml]
- use_pointcloud_container [default: false]
- pointcloud_container_name [default: pointcloud_container]
Messages
Services
Plugins
Recent questions tagged autoware_euclidean_cluster_object_detector at Robotics Stack Exchange
Package Summary
| Version | 1.10.0 |
| License | Apache License 2.0 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/autowarefoundation/autoware_core.git |
| VCS Type | git |
| VCS Version | main |
| Last Updated | 2026-10-07 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Maintainers
- Yukihiro Saito
- Dai Nguyen
Authors
autoware_euclidean_cluster_object_detector
Purpose
autoware_euclidean_cluster_object_detector is a package for clustering points into smaller parts to classify objects.
This package has two clustering methods: euclidean_cluster and voxel_grid_based_euclidean_cluster.
Inner-workings / Algorithms
euclidean_cluster
pcl::EuclideanClusterExtraction is applied to points. See official document for details.
voxel_grid_based_euclidean_cluster
- A centroid in each voxel is calculated by
pcl::VoxelGrid. - The centroids are clustered by
pcl::EuclideanClusterExtraction. - The input points are clustered based on the clustered centroids.
Inputs / Outputs
Input
| Name | Type | Description |
|---|---|---|
input |
sensor_msgs::msg::PointCloud2 |
input pointcloud |
Output
| Name | Type | Description |
|---|---|---|
output |
autoware_perception_msgs::msg::DetectedObjects |
detected objects |
debug/clusters |
sensor_msgs::msg::PointCloud2 |
colored cluster pointcloud for visualization |
Parameters
Core Parameters
euclidean_cluster
| Name | Type | Description |
|---|---|---|
use_height |
bool | use point.z for clustering |
min_cluster_size |
int | the minimum number of points that a cluster needs to contain in order to be considered valid |
max_cluster_size |
int | the maximum number of points that a cluster needs to contain in order to be considered valid |
tolerance |
float | the spatial cluster tolerance as a measure in the L2 Euclidean space |
voxel_grid_based_euclidean_cluster
| Name | Type | Description |
|---|---|---|
use_height |
bool | use point.z for clustering |
min_cluster_size |
int | the minimum number of points that a cluster needs to contain in order to be considered valid |
max_cluster_size |
int | the maximum number of points that a cluster needs to contain in order to be considered valid |
tolerance |
float | the spatial cluster tolerance as a measure in the L2 Euclidean space |
voxel_leaf_size |
float | the voxel leaf size of x and y |
min_points_number_per_voxel |
int | the minimum number of points for a voxel |
Assumptions / Known limits
Cluster size limits
The two size parameters are assumed to satisfy 1 <= min_cluster_size <= max_cluster_size. The
nodes do not check this, and the behaviour is undefined otherwise.
(Optional) Error detection and handling
(Optional) Performance characterization
(Optional) References/External links
<!– Write links you referred to when you implemented.
Example:
File truncated at 100 lines see the full file
Changelog for package autoware_euclidean_cluster_object_detector
1.10.0 (2026-09-28)
- Merge remote-tracking branch 'origin/main' into tmp/bot/bump_version_base
- test(euclidean_cluster_object_detector): fixed test euclidian cluser
(#1393)
test(autoware_euclidean_cluster_object_detector): make the
voxel-grid tests deterministic The tests drew their point
coordinates from an unseeded RNG. [testcase3]{.title-ref} failed in
CI about 20% of the time, and no failure could be reproduced,
because no seed was recorded. The input clouds are now written out
as literal points.
- [testcase1/2/3]{.title-ref} are renamed after the limit each one
exercises, and they pin [skipped_cluster_count]{.title-ref} as well.
- [ExceedMaxClusterSize]{.title-ref} is removed. It drove the same
rejection path as the max-size case and asserted less about it.
- New cases cover several objects in one scan, a count sitting on
both limits at once, a contradictory pair of limits, and skipping
decided per cluster.
- [BoundaryVoxelPointsAreNotDropped]{.title-ref} is unchanged. It
came from the regression fixed in
#1376.
- Outside the tests, the map key in
[cluster_voxel_grid()]{.title-ref} is renamed from
[voxel_1d_idx]{.title-ref} to [centroid_idx]{.title-ref}.
[getCentroidIndexAt()]{.title-ref} returns an index into the
filtered centroid cloud, not the grid cell index the old name
claimed.
- The README states the assumed range for the two size limits.
- fix(perception): declare the dependencies these packages use (#1371) Each of these packages uses a package it never declares. Either it includes a header of that package, or it names a symbol of it while the header arrives through another dependency. Both build today only because some declared dependency re-exports the owner, so a change in an unrelated repository can break them without anything here changing. The tag follows where the dependency is used: a use in an installed header or in code compiled into the library takes <depend>, one reached only from test/ takes <test_depend>. System libraries are named by the rosdep key this workspace already prefers.
- fix(autoware_euclidean_cluster_object_detector): keep boundary voxel points in their clusters (#1376) The detector recomputed the map key of each voxel from the float coordinates of its centroid. The centroid is a float mean. For points that sit exactly on a cell boundary, this mean rounds to one float step under the boundary. The recomputed key then pointed to the neighbor cell, and the detector dropped the raw points of that voxel. The oversized cluster in VoxelGridBasedEuclideanClusterTest.testcase3 then passed the max_cluster_size check, and the test failed intermittently. Key the map by the centroid index instead. This index is the same value that getCentroidIndexAt() returns for the raw points. Add a deterministic regression test for the boundary case.
- feat: [codecov/refactoring] [euclidean_cluster_object_detector]
Core logic isolation (SECOND HALF)
(#1244)
- added voxel grid cluster into core logic header, and specify a strategy gate to init once at startup
- implemented voxel_grid algorithm into the core logic module, with a nice touch of init once to address Akamine-san concern
- node unification between cluster standard and cluster nvoxel grid with a bunch of diagnostic added
- removed legacy files from old voxel grid structure, now already unified into core logics
- adjusted launch file to reflect new voxel grid locs
- purged voxel_grid relatives from cmakelist
- refactor test_euclidean_cluster_object_detection_integration.cpp test suite
- refactor test_node.cpp test suite
- heavy refactor of test_voxel_grid_based_euclidean_cluster.cpp test suite
- added the weird 2D flattening feature inside the voxel grid clustering
- removed redundant test inside tesdt voxel
- fixedspellcheck error (why Akamine-san's name does not pass the spellcheck?)
- bring back the voxel grid based euclidean cluster node header hpp
- reimplement voxel grid based euclidean cluster node source cpp
- clean up standard node, remove the voxel leaf size delcairation
- reimplemented voxel grid stuffs to CMakeLists
- fixed launch revert back to voxel node
- successfully reverted to the dual-node architecture
- fully reverted to dual nodes, all builds tests good now
- spell check and cpp ckeck diff fix
- feat: [codecov/refactoring] [euclidean_cluster_object_detector]
Core logic isolation (FIRST HALF)
(#1239)
- implemented master params struct for this node new refactoring
- implemented ros_conversions.cpp/.hpp
- implemented euclidean_cluster_object_detector.hpp as the header for core logic, now with only cluster_standard
- implemented euclidean_cluster_object_detector.cpp as the source for core logic, now with only cluster_standard
- euclidean_cluster_node core logic refine, now only with cluster_standard()
File truncated at 100 lines see the full file
Package Dependencies
System Dependencies
| Name |
|---|
| libpcl-all-dev |
Dependant Packages
| Name | Deps |
|---|---|
| autoware_core_perception |
Launch files
- launch/euclidean_cluster.launch.xml
-
- input_pointcloud [default: /sensing/lidar/top/pointcloud_raw]
- input_map [default: /map/pointcloud_map]
- output_clusters [default: clusters]
- use_low_height_cropbox [default: false]
- euclidean_param_path [default: $(find-pkg-share autoware_euclidean_cluster_object_detector)/config/euclidean_cluster.param.yaml]
- use_pointcloud_container [default: false]
- pointcloud_container_name [default: pointcloud_container]
- launch/voxel_grid_based_euclidean_cluster.launch.xml
-
- input_pointcloud [default: /sensing/lidar/top/pointcloud_raw]
- input_map [default: /map/pointcloud_map]
- output_clusters [default: clusters]
- use_low_height_cropbox [default: false]
- voxel_grid_based_euclidean_param_path [default: $(find-pkg-share autoware_euclidean_cluster_object_detector)/config/voxel_grid_based_euclidean_cluster.param.yaml]
- use_pointcloud_container [default: false]
- pointcloud_container_name [default: pointcloud_container]
Messages
Services
Plugins
Recent questions tagged autoware_euclidean_cluster_object_detector at Robotics Stack Exchange
Package Summary
| Version | 1.10.0 |
| License | Apache License 2.0 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/autowarefoundation/autoware_core.git |
| VCS Type | git |
| VCS Version | main |
| Last Updated | 2026-10-07 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Maintainers
- Yukihiro Saito
- Dai Nguyen
Authors
autoware_euclidean_cluster_object_detector
Purpose
autoware_euclidean_cluster_object_detector is a package for clustering points into smaller parts to classify objects.
This package has two clustering methods: euclidean_cluster and voxel_grid_based_euclidean_cluster.
Inner-workings / Algorithms
euclidean_cluster
pcl::EuclideanClusterExtraction is applied to points. See official document for details.
voxel_grid_based_euclidean_cluster
- A centroid in each voxel is calculated by
pcl::VoxelGrid. - The centroids are clustered by
pcl::EuclideanClusterExtraction. - The input points are clustered based on the clustered centroids.
Inputs / Outputs
Input
| Name | Type | Description |
|---|---|---|
input |
sensor_msgs::msg::PointCloud2 |
input pointcloud |
Output
| Name | Type | Description |
|---|---|---|
output |
autoware_perception_msgs::msg::DetectedObjects |
detected objects |
debug/clusters |
sensor_msgs::msg::PointCloud2 |
colored cluster pointcloud for visualization |
Parameters
Core Parameters
euclidean_cluster
| Name | Type | Description |
|---|---|---|
use_height |
bool | use point.z for clustering |
min_cluster_size |
int | the minimum number of points that a cluster needs to contain in order to be considered valid |
max_cluster_size |
int | the maximum number of points that a cluster needs to contain in order to be considered valid |
tolerance |
float | the spatial cluster tolerance as a measure in the L2 Euclidean space |
voxel_grid_based_euclidean_cluster
| Name | Type | Description |
|---|---|---|
use_height |
bool | use point.z for clustering |
min_cluster_size |
int | the minimum number of points that a cluster needs to contain in order to be considered valid |
max_cluster_size |
int | the maximum number of points that a cluster needs to contain in order to be considered valid |
tolerance |
float | the spatial cluster tolerance as a measure in the L2 Euclidean space |
voxel_leaf_size |
float | the voxel leaf size of x and y |
min_points_number_per_voxel |
int | the minimum number of points for a voxel |
Assumptions / Known limits
Cluster size limits
The two size parameters are assumed to satisfy 1 <= min_cluster_size <= max_cluster_size. The
nodes do not check this, and the behaviour is undefined otherwise.
(Optional) Error detection and handling
(Optional) Performance characterization
(Optional) References/External links
<!– Write links you referred to when you implemented.
Example:
File truncated at 100 lines see the full file
Changelog for package autoware_euclidean_cluster_object_detector
1.10.0 (2026-09-28)
- Merge remote-tracking branch 'origin/main' into tmp/bot/bump_version_base
- test(euclidean_cluster_object_detector): fixed test euclidian cluser
(#1393)
test(autoware_euclidean_cluster_object_detector): make the
voxel-grid tests deterministic The tests drew their point
coordinates from an unseeded RNG. [testcase3]{.title-ref} failed in
CI about 20% of the time, and no failure could be reproduced,
because no seed was recorded. The input clouds are now written out
as literal points.
- [testcase1/2/3]{.title-ref} are renamed after the limit each one
exercises, and they pin [skipped_cluster_count]{.title-ref} as well.
- [ExceedMaxClusterSize]{.title-ref} is removed. It drove the same
rejection path as the max-size case and asserted less about it.
- New cases cover several objects in one scan, a count sitting on
both limits at once, a contradictory pair of limits, and skipping
decided per cluster.
- [BoundaryVoxelPointsAreNotDropped]{.title-ref} is unchanged. It
came from the regression fixed in
#1376.
- Outside the tests, the map key in
[cluster_voxel_grid()]{.title-ref} is renamed from
[voxel_1d_idx]{.title-ref} to [centroid_idx]{.title-ref}.
[getCentroidIndexAt()]{.title-ref} returns an index into the
filtered centroid cloud, not the grid cell index the old name
claimed.
- The README states the assumed range for the two size limits.
- fix(perception): declare the dependencies these packages use (#1371) Each of these packages uses a package it never declares. Either it includes a header of that package, or it names a symbol of it while the header arrives through another dependency. Both build today only because some declared dependency re-exports the owner, so a change in an unrelated repository can break them without anything here changing. The tag follows where the dependency is used: a use in an installed header or in code compiled into the library takes <depend>, one reached only from test/ takes <test_depend>. System libraries are named by the rosdep key this workspace already prefers.
- fix(autoware_euclidean_cluster_object_detector): keep boundary voxel points in their clusters (#1376) The detector recomputed the map key of each voxel from the float coordinates of its centroid. The centroid is a float mean. For points that sit exactly on a cell boundary, this mean rounds to one float step under the boundary. The recomputed key then pointed to the neighbor cell, and the detector dropped the raw points of that voxel. The oversized cluster in VoxelGridBasedEuclideanClusterTest.testcase3 then passed the max_cluster_size check, and the test failed intermittently. Key the map by the centroid index instead. This index is the same value that getCentroidIndexAt() returns for the raw points. Add a deterministic regression test for the boundary case.
- feat: [codecov/refactoring] [euclidean_cluster_object_detector]
Core logic isolation (SECOND HALF)
(#1244)
- added voxel grid cluster into core logic header, and specify a strategy gate to init once at startup
- implemented voxel_grid algorithm into the core logic module, with a nice touch of init once to address Akamine-san concern
- node unification between cluster standard and cluster nvoxel grid with a bunch of diagnostic added
- removed legacy files from old voxel grid structure, now already unified into core logics
- adjusted launch file to reflect new voxel grid locs
- purged voxel_grid relatives from cmakelist
- refactor test_euclidean_cluster_object_detection_integration.cpp test suite
- refactor test_node.cpp test suite
- heavy refactor of test_voxel_grid_based_euclidean_cluster.cpp test suite
- added the weird 2D flattening feature inside the voxel grid clustering
- removed redundant test inside tesdt voxel
- fixedspellcheck error (why Akamine-san's name does not pass the spellcheck?)
- bring back the voxel grid based euclidean cluster node header hpp
- reimplement voxel grid based euclidean cluster node source cpp
- clean up standard node, remove the voxel leaf size delcairation
- reimplemented voxel grid stuffs to CMakeLists
- fixed launch revert back to voxel node
- successfully reverted to the dual-node architecture
- fully reverted to dual nodes, all builds tests good now
- spell check and cpp ckeck diff fix
- feat: [codecov/refactoring] [euclidean_cluster_object_detector]
Core logic isolation (FIRST HALF)
(#1239)
- implemented master params struct for this node new refactoring
- implemented ros_conversions.cpp/.hpp
- implemented euclidean_cluster_object_detector.hpp as the header for core logic, now with only cluster_standard
- implemented euclidean_cluster_object_detector.cpp as the source for core logic, now with only cluster_standard
- euclidean_cluster_node core logic refine, now only with cluster_standard()
File truncated at 100 lines see the full file
Package Dependencies
System Dependencies
| Name |
|---|
| libpcl-all-dev |
Dependant Packages
| Name | Deps |
|---|---|
| autoware_core_perception |
Launch files
- launch/euclidean_cluster.launch.xml
-
- input_pointcloud [default: /sensing/lidar/top/pointcloud_raw]
- input_map [default: /map/pointcloud_map]
- output_clusters [default: clusters]
- use_low_height_cropbox [default: false]
- euclidean_param_path [default: $(find-pkg-share autoware_euclidean_cluster_object_detector)/config/euclidean_cluster.param.yaml]
- use_pointcloud_container [default: false]
- pointcloud_container_name [default: pointcloud_container]
- launch/voxel_grid_based_euclidean_cluster.launch.xml
-
- input_pointcloud [default: /sensing/lidar/top/pointcloud_raw]
- input_map [default: /map/pointcloud_map]
- output_clusters [default: clusters]
- use_low_height_cropbox [default: false]
- voxel_grid_based_euclidean_param_path [default: $(find-pkg-share autoware_euclidean_cluster_object_detector)/config/voxel_grid_based_euclidean_cluster.param.yaml]
- use_pointcloud_container [default: false]
- pointcloud_container_name [default: pointcloud_container]
Messages
Services
Plugins
Recent questions tagged autoware_euclidean_cluster_object_detector at Robotics Stack Exchange
Package Summary
| Version | 1.10.0 |
| License | Apache License 2.0 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/autowarefoundation/autoware_core.git |
| VCS Type | git |
| VCS Version | main |
| Last Updated | 2026-10-07 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Maintainers
- Yukihiro Saito
- Dai Nguyen
Authors
autoware_euclidean_cluster_object_detector
Purpose
autoware_euclidean_cluster_object_detector is a package for clustering points into smaller parts to classify objects.
This package has two clustering methods: euclidean_cluster and voxel_grid_based_euclidean_cluster.
Inner-workings / Algorithms
euclidean_cluster
pcl::EuclideanClusterExtraction is applied to points. See official document for details.
voxel_grid_based_euclidean_cluster
- A centroid in each voxel is calculated by
pcl::VoxelGrid. - The centroids are clustered by
pcl::EuclideanClusterExtraction. - The input points are clustered based on the clustered centroids.
Inputs / Outputs
Input
| Name | Type | Description |
|---|---|---|
input |
sensor_msgs::msg::PointCloud2 |
input pointcloud |
Output
| Name | Type | Description |
|---|---|---|
output |
autoware_perception_msgs::msg::DetectedObjects |
detected objects |
debug/clusters |
sensor_msgs::msg::PointCloud2 |
colored cluster pointcloud for visualization |
Parameters
Core Parameters
euclidean_cluster
| Name | Type | Description |
|---|---|---|
use_height |
bool | use point.z for clustering |
min_cluster_size |
int | the minimum number of points that a cluster needs to contain in order to be considered valid |
max_cluster_size |
int | the maximum number of points that a cluster needs to contain in order to be considered valid |
tolerance |
float | the spatial cluster tolerance as a measure in the L2 Euclidean space |
voxel_grid_based_euclidean_cluster
| Name | Type | Description |
|---|---|---|
use_height |
bool | use point.z for clustering |
min_cluster_size |
int | the minimum number of points that a cluster needs to contain in order to be considered valid |
max_cluster_size |
int | the maximum number of points that a cluster needs to contain in order to be considered valid |
tolerance |
float | the spatial cluster tolerance as a measure in the L2 Euclidean space |
voxel_leaf_size |
float | the voxel leaf size of x and y |
min_points_number_per_voxel |
int | the minimum number of points for a voxel |
Assumptions / Known limits
Cluster size limits
The two size parameters are assumed to satisfy 1 <= min_cluster_size <= max_cluster_size. The
nodes do not check this, and the behaviour is undefined otherwise.
(Optional) Error detection and handling
(Optional) Performance characterization
(Optional) References/External links
<!– Write links you referred to when you implemented.
Example:
File truncated at 100 lines see the full file
Changelog for package autoware_euclidean_cluster_object_detector
1.10.0 (2026-09-28)
- Merge remote-tracking branch 'origin/main' into tmp/bot/bump_version_base
- test(euclidean_cluster_object_detector): fixed test euclidian cluser
(#1393)
test(autoware_euclidean_cluster_object_detector): make the
voxel-grid tests deterministic The tests drew their point
coordinates from an unseeded RNG. [testcase3]{.title-ref} failed in
CI about 20% of the time, and no failure could be reproduced,
because no seed was recorded. The input clouds are now written out
as literal points.
- [testcase1/2/3]{.title-ref} are renamed after the limit each one
exercises, and they pin [skipped_cluster_count]{.title-ref} as well.
- [ExceedMaxClusterSize]{.title-ref} is removed. It drove the same
rejection path as the max-size case and asserted less about it.
- New cases cover several objects in one scan, a count sitting on
both limits at once, a contradictory pair of limits, and skipping
decided per cluster.
- [BoundaryVoxelPointsAreNotDropped]{.title-ref} is unchanged. It
came from the regression fixed in
#1376.
- Outside the tests, the map key in
[cluster_voxel_grid()]{.title-ref} is renamed from
[voxel_1d_idx]{.title-ref} to [centroid_idx]{.title-ref}.
[getCentroidIndexAt()]{.title-ref} returns an index into the
filtered centroid cloud, not the grid cell index the old name
claimed.
- The README states the assumed range for the two size limits.
- fix(perception): declare the dependencies these packages use (#1371) Each of these packages uses a package it never declares. Either it includes a header of that package, or it names a symbol of it while the header arrives through another dependency. Both build today only because some declared dependency re-exports the owner, so a change in an unrelated repository can break them without anything here changing. The tag follows where the dependency is used: a use in an installed header or in code compiled into the library takes <depend>, one reached only from test/ takes <test_depend>. System libraries are named by the rosdep key this workspace already prefers.
- fix(autoware_euclidean_cluster_object_detector): keep boundary voxel points in their clusters (#1376) The detector recomputed the map key of each voxel from the float coordinates of its centroid. The centroid is a float mean. For points that sit exactly on a cell boundary, this mean rounds to one float step under the boundary. The recomputed key then pointed to the neighbor cell, and the detector dropped the raw points of that voxel. The oversized cluster in VoxelGridBasedEuclideanClusterTest.testcase3 then passed the max_cluster_size check, and the test failed intermittently. Key the map by the centroid index instead. This index is the same value that getCentroidIndexAt() returns for the raw points. Add a deterministic regression test for the boundary case.
- feat: [codecov/refactoring] [euclidean_cluster_object_detector]
Core logic isolation (SECOND HALF)
(#1244)
- added voxel grid cluster into core logic header, and specify a strategy gate to init once at startup
- implemented voxel_grid algorithm into the core logic module, with a nice touch of init once to address Akamine-san concern
- node unification between cluster standard and cluster nvoxel grid with a bunch of diagnostic added
- removed legacy files from old voxel grid structure, now already unified into core logics
- adjusted launch file to reflect new voxel grid locs
- purged voxel_grid relatives from cmakelist
- refactor test_euclidean_cluster_object_detection_integration.cpp test suite
- refactor test_node.cpp test suite
- heavy refactor of test_voxel_grid_based_euclidean_cluster.cpp test suite
- added the weird 2D flattening feature inside the voxel grid clustering
- removed redundant test inside tesdt voxel
- fixedspellcheck error (why Akamine-san's name does not pass the spellcheck?)
- bring back the voxel grid based euclidean cluster node header hpp
- reimplement voxel grid based euclidean cluster node source cpp
- clean up standard node, remove the voxel leaf size delcairation
- reimplemented voxel grid stuffs to CMakeLists
- fixed launch revert back to voxel node
- successfully reverted to the dual-node architecture
- fully reverted to dual nodes, all builds tests good now
- spell check and cpp ckeck diff fix
- feat: [codecov/refactoring] [euclidean_cluster_object_detector]
Core logic isolation (FIRST HALF)
(#1239)
- implemented master params struct for this node new refactoring
- implemented ros_conversions.cpp/.hpp
- implemented euclidean_cluster_object_detector.hpp as the header for core logic, now with only cluster_standard
- implemented euclidean_cluster_object_detector.cpp as the source for core logic, now with only cluster_standard
- euclidean_cluster_node core logic refine, now only with cluster_standard()
File truncated at 100 lines see the full file
Package Dependencies
System Dependencies
| Name |
|---|
| libpcl-all-dev |
Dependant Packages
| Name | Deps |
|---|---|
| autoware_core_perception |
Launch files
- launch/euclidean_cluster.launch.xml
-
- input_pointcloud [default: /sensing/lidar/top/pointcloud_raw]
- input_map [default: /map/pointcloud_map]
- output_clusters [default: clusters]
- use_low_height_cropbox [default: false]
- euclidean_param_path [default: $(find-pkg-share autoware_euclidean_cluster_object_detector)/config/euclidean_cluster.param.yaml]
- use_pointcloud_container [default: false]
- pointcloud_container_name [default: pointcloud_container]
- launch/voxel_grid_based_euclidean_cluster.launch.xml
-
- input_pointcloud [default: /sensing/lidar/top/pointcloud_raw]
- input_map [default: /map/pointcloud_map]
- output_clusters [default: clusters]
- use_low_height_cropbox [default: false]
- voxel_grid_based_euclidean_param_path [default: $(find-pkg-share autoware_euclidean_cluster_object_detector)/config/voxel_grid_based_euclidean_cluster.param.yaml]
- use_pointcloud_container [default: false]
- pointcloud_container_name [default: pointcloud_container]
Messages
Services
Plugins
Recent questions tagged autoware_euclidean_cluster_object_detector at Robotics Stack Exchange
Package Summary
| Version | 1.10.0 |
| License | Apache License 2.0 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/autowarefoundation/autoware_core.git |
| VCS Type | git |
| VCS Version | main |
| Last Updated | 2026-10-07 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Maintainers
- Yukihiro Saito
- Dai Nguyen
Authors
autoware_euclidean_cluster_object_detector
Purpose
autoware_euclidean_cluster_object_detector is a package for clustering points into smaller parts to classify objects.
This package has two clustering methods: euclidean_cluster and voxel_grid_based_euclidean_cluster.
Inner-workings / Algorithms
euclidean_cluster
pcl::EuclideanClusterExtraction is applied to points. See official document for details.
voxel_grid_based_euclidean_cluster
- A centroid in each voxel is calculated by
pcl::VoxelGrid. - The centroids are clustered by
pcl::EuclideanClusterExtraction. - The input points are clustered based on the clustered centroids.
Inputs / Outputs
Input
| Name | Type | Description |
|---|---|---|
input |
sensor_msgs::msg::PointCloud2 |
input pointcloud |
Output
| Name | Type | Description |
|---|---|---|
output |
autoware_perception_msgs::msg::DetectedObjects |
detected objects |
debug/clusters |
sensor_msgs::msg::PointCloud2 |
colored cluster pointcloud for visualization |
Parameters
Core Parameters
euclidean_cluster
| Name | Type | Description |
|---|---|---|
use_height |
bool | use point.z for clustering |
min_cluster_size |
int | the minimum number of points that a cluster needs to contain in order to be considered valid |
max_cluster_size |
int | the maximum number of points that a cluster needs to contain in order to be considered valid |
tolerance |
float | the spatial cluster tolerance as a measure in the L2 Euclidean space |
voxel_grid_based_euclidean_cluster
| Name | Type | Description |
|---|---|---|
use_height |
bool | use point.z for clustering |
min_cluster_size |
int | the minimum number of points that a cluster needs to contain in order to be considered valid |
max_cluster_size |
int | the maximum number of points that a cluster needs to contain in order to be considered valid |
tolerance |
float | the spatial cluster tolerance as a measure in the L2 Euclidean space |
voxel_leaf_size |
float | the voxel leaf size of x and y |
min_points_number_per_voxel |
int | the minimum number of points for a voxel |
Assumptions / Known limits
Cluster size limits
The two size parameters are assumed to satisfy 1 <= min_cluster_size <= max_cluster_size. The
nodes do not check this, and the behaviour is undefined otherwise.
(Optional) Error detection and handling
(Optional) Performance characterization
(Optional) References/External links
<!– Write links you referred to when you implemented.
Example:
File truncated at 100 lines see the full file
Changelog for package autoware_euclidean_cluster_object_detector
1.10.0 (2026-09-28)
- Merge remote-tracking branch 'origin/main' into tmp/bot/bump_version_base
- test(euclidean_cluster_object_detector): fixed test euclidian cluser
(#1393)
test(autoware_euclidean_cluster_object_detector): make the
voxel-grid tests deterministic The tests drew their point
coordinates from an unseeded RNG. [testcase3]{.title-ref} failed in
CI about 20% of the time, and no failure could be reproduced,
because no seed was recorded. The input clouds are now written out
as literal points.
- [testcase1/2/3]{.title-ref} are renamed after the limit each one
exercises, and they pin [skipped_cluster_count]{.title-ref} as well.
- [ExceedMaxClusterSize]{.title-ref} is removed. It drove the same
rejection path as the max-size case and asserted less about it.
- New cases cover several objects in one scan, a count sitting on
both limits at once, a contradictory pair of limits, and skipping
decided per cluster.
- [BoundaryVoxelPointsAreNotDropped]{.title-ref} is unchanged. It
came from the regression fixed in
#1376.
- Outside the tests, the map key in
[cluster_voxel_grid()]{.title-ref} is renamed from
[voxel_1d_idx]{.title-ref} to [centroid_idx]{.title-ref}.
[getCentroidIndexAt()]{.title-ref} returns an index into the
filtered centroid cloud, not the grid cell index the old name
claimed.
- The README states the assumed range for the two size limits.
- fix(perception): declare the dependencies these packages use (#1371) Each of these packages uses a package it never declares. Either it includes a header of that package, or it names a symbol of it while the header arrives through another dependency. Both build today only because some declared dependency re-exports the owner, so a change in an unrelated repository can break them without anything here changing. The tag follows where the dependency is used: a use in an installed header or in code compiled into the library takes <depend>, one reached only from test/ takes <test_depend>. System libraries are named by the rosdep key this workspace already prefers.
- fix(autoware_euclidean_cluster_object_detector): keep boundary voxel points in their clusters (#1376) The detector recomputed the map key of each voxel from the float coordinates of its centroid. The centroid is a float mean. For points that sit exactly on a cell boundary, this mean rounds to one float step under the boundary. The recomputed key then pointed to the neighbor cell, and the detector dropped the raw points of that voxel. The oversized cluster in VoxelGridBasedEuclideanClusterTest.testcase3 then passed the max_cluster_size check, and the test failed intermittently. Key the map by the centroid index instead. This index is the same value that getCentroidIndexAt() returns for the raw points. Add a deterministic regression test for the boundary case.
- feat: [codecov/refactoring] [euclidean_cluster_object_detector]
Core logic isolation (SECOND HALF)
(#1244)
- added voxel grid cluster into core logic header, and specify a strategy gate to init once at startup
- implemented voxel_grid algorithm into the core logic module, with a nice touch of init once to address Akamine-san concern
- node unification between cluster standard and cluster nvoxel grid with a bunch of diagnostic added
- removed legacy files from old voxel grid structure, now already unified into core logics
- adjusted launch file to reflect new voxel grid locs
- purged voxel_grid relatives from cmakelist
- refactor test_euclidean_cluster_object_detection_integration.cpp test suite
- refactor test_node.cpp test suite
- heavy refactor of test_voxel_grid_based_euclidean_cluster.cpp test suite
- added the weird 2D flattening feature inside the voxel grid clustering
- removed redundant test inside tesdt voxel
- fixedspellcheck error (why Akamine-san's name does not pass the spellcheck?)
- bring back the voxel grid based euclidean cluster node header hpp
- reimplement voxel grid based euclidean cluster node source cpp
- clean up standard node, remove the voxel leaf size delcairation
- reimplemented voxel grid stuffs to CMakeLists
- fixed launch revert back to voxel node
- successfully reverted to the dual-node architecture
- fully reverted to dual nodes, all builds tests good now
- spell check and cpp ckeck diff fix
- feat: [codecov/refactoring] [euclidean_cluster_object_detector]
Core logic isolation (FIRST HALF)
(#1239)
- implemented master params struct for this node new refactoring
- implemented ros_conversions.cpp/.hpp
- implemented euclidean_cluster_object_detector.hpp as the header for core logic, now with only cluster_standard
- implemented euclidean_cluster_object_detector.cpp as the source for core logic, now with only cluster_standard
- euclidean_cluster_node core logic refine, now only with cluster_standard()
File truncated at 100 lines see the full file
Package Dependencies
System Dependencies
| Name |
|---|
| libpcl-all-dev |
Dependant Packages
| Name | Deps |
|---|---|
| autoware_core_perception |
Launch files
- launch/euclidean_cluster.launch.xml
-
- input_pointcloud [default: /sensing/lidar/top/pointcloud_raw]
- input_map [default: /map/pointcloud_map]
- output_clusters [default: clusters]
- use_low_height_cropbox [default: false]
- euclidean_param_path [default: $(find-pkg-share autoware_euclidean_cluster_object_detector)/config/euclidean_cluster.param.yaml]
- use_pointcloud_container [default: false]
- pointcloud_container_name [default: pointcloud_container]
- launch/voxel_grid_based_euclidean_cluster.launch.xml
-
- input_pointcloud [default: /sensing/lidar/top/pointcloud_raw]
- input_map [default: /map/pointcloud_map]
- output_clusters [default: clusters]
- use_low_height_cropbox [default: false]
- voxel_grid_based_euclidean_param_path [default: $(find-pkg-share autoware_euclidean_cluster_object_detector)/config/voxel_grid_based_euclidean_cluster.param.yaml]
- use_pointcloud_container [default: false]
- pointcloud_container_name [default: pointcloud_container]
Messages
Services
Plugins
Recent questions tagged autoware_euclidean_cluster_object_detector at Robotics Stack Exchange
Package Summary
| Version | 1.10.0 |
| License | Apache License 2.0 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/autowarefoundation/autoware_core.git |
| VCS Type | git |
| VCS Version | main |
| Last Updated | 2026-10-07 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Maintainers
- Yukihiro Saito
- Dai Nguyen
Authors
autoware_euclidean_cluster_object_detector
Purpose
autoware_euclidean_cluster_object_detector is a package for clustering points into smaller parts to classify objects.
This package has two clustering methods: euclidean_cluster and voxel_grid_based_euclidean_cluster.
Inner-workings / Algorithms
euclidean_cluster
pcl::EuclideanClusterExtraction is applied to points. See official document for details.
voxel_grid_based_euclidean_cluster
- A centroid in each voxel is calculated by
pcl::VoxelGrid. - The centroids are clustered by
pcl::EuclideanClusterExtraction. - The input points are clustered based on the clustered centroids.
Inputs / Outputs
Input
| Name | Type | Description |
|---|---|---|
input |
sensor_msgs::msg::PointCloud2 |
input pointcloud |
Output
| Name | Type | Description |
|---|---|---|
output |
autoware_perception_msgs::msg::DetectedObjects |
detected objects |
debug/clusters |
sensor_msgs::msg::PointCloud2 |
colored cluster pointcloud for visualization |
Parameters
Core Parameters
euclidean_cluster
| Name | Type | Description |
|---|---|---|
use_height |
bool | use point.z for clustering |
min_cluster_size |
int | the minimum number of points that a cluster needs to contain in order to be considered valid |
max_cluster_size |
int | the maximum number of points that a cluster needs to contain in order to be considered valid |
tolerance |
float | the spatial cluster tolerance as a measure in the L2 Euclidean space |
voxel_grid_based_euclidean_cluster
| Name | Type | Description |
|---|---|---|
use_height |
bool | use point.z for clustering |
min_cluster_size |
int | the minimum number of points that a cluster needs to contain in order to be considered valid |
max_cluster_size |
int | the maximum number of points that a cluster needs to contain in order to be considered valid |
tolerance |
float | the spatial cluster tolerance as a measure in the L2 Euclidean space |
voxel_leaf_size |
float | the voxel leaf size of x and y |
min_points_number_per_voxel |
int | the minimum number of points for a voxel |
Assumptions / Known limits
Cluster size limits
The two size parameters are assumed to satisfy 1 <= min_cluster_size <= max_cluster_size. The
nodes do not check this, and the behaviour is undefined otherwise.
(Optional) Error detection and handling
(Optional) Performance characterization
(Optional) References/External links
<!– Write links you referred to when you implemented.
Example:
File truncated at 100 lines see the full file
Changelog for package autoware_euclidean_cluster_object_detector
1.10.0 (2026-09-28)
- Merge remote-tracking branch 'origin/main' into tmp/bot/bump_version_base
- test(euclidean_cluster_object_detector): fixed test euclidian cluser
(#1393)
test(autoware_euclidean_cluster_object_detector): make the
voxel-grid tests deterministic The tests drew their point
coordinates from an unseeded RNG. [testcase3]{.title-ref} failed in
CI about 20% of the time, and no failure could be reproduced,
because no seed was recorded. The input clouds are now written out
as literal points.
- [testcase1/2/3]{.title-ref} are renamed after the limit each one
exercises, and they pin [skipped_cluster_count]{.title-ref} as well.
- [ExceedMaxClusterSize]{.title-ref} is removed. It drove the same
rejection path as the max-size case and asserted less about it.
- New cases cover several objects in one scan, a count sitting on
both limits at once, a contradictory pair of limits, and skipping
decided per cluster.
- [BoundaryVoxelPointsAreNotDropped]{.title-ref} is unchanged. It
came from the regression fixed in
#1376.
- Outside the tests, the map key in
[cluster_voxel_grid()]{.title-ref} is renamed from
[voxel_1d_idx]{.title-ref} to [centroid_idx]{.title-ref}.
[getCentroidIndexAt()]{.title-ref} returns an index into the
filtered centroid cloud, not the grid cell index the old name
claimed.
- The README states the assumed range for the two size limits.
- fix(perception): declare the dependencies these packages use (#1371) Each of these packages uses a package it never declares. Either it includes a header of that package, or it names a symbol of it while the header arrives through another dependency. Both build today only because some declared dependency re-exports the owner, so a change in an unrelated repository can break them without anything here changing. The tag follows where the dependency is used: a use in an installed header or in code compiled into the library takes <depend>, one reached only from test/ takes <test_depend>. System libraries are named by the rosdep key this workspace already prefers.
- fix(autoware_euclidean_cluster_object_detector): keep boundary voxel points in their clusters (#1376) The detector recomputed the map key of each voxel from the float coordinates of its centroid. The centroid is a float mean. For points that sit exactly on a cell boundary, this mean rounds to one float step under the boundary. The recomputed key then pointed to the neighbor cell, and the detector dropped the raw points of that voxel. The oversized cluster in VoxelGridBasedEuclideanClusterTest.testcase3 then passed the max_cluster_size check, and the test failed intermittently. Key the map by the centroid index instead. This index is the same value that getCentroidIndexAt() returns for the raw points. Add a deterministic regression test for the boundary case.
- feat: [codecov/refactoring] [euclidean_cluster_object_detector]
Core logic isolation (SECOND HALF)
(#1244)
- added voxel grid cluster into core logic header, and specify a strategy gate to init once at startup
- implemented voxel_grid algorithm into the core logic module, with a nice touch of init once to address Akamine-san concern
- node unification between cluster standard and cluster nvoxel grid with a bunch of diagnostic added
- removed legacy files from old voxel grid structure, now already unified into core logics
- adjusted launch file to reflect new voxel grid locs
- purged voxel_grid relatives from cmakelist
- refactor test_euclidean_cluster_object_detection_integration.cpp test suite
- refactor test_node.cpp test suite
- heavy refactor of test_voxel_grid_based_euclidean_cluster.cpp test suite
- added the weird 2D flattening feature inside the voxel grid clustering
- removed redundant test inside tesdt voxel
- fixedspellcheck error (why Akamine-san's name does not pass the spellcheck?)
- bring back the voxel grid based euclidean cluster node header hpp
- reimplement voxel grid based euclidean cluster node source cpp
- clean up standard node, remove the voxel leaf size delcairation
- reimplemented voxel grid stuffs to CMakeLists
- fixed launch revert back to voxel node
- successfully reverted to the dual-node architecture
- fully reverted to dual nodes, all builds tests good now
- spell check and cpp ckeck diff fix
- feat: [codecov/refactoring] [euclidean_cluster_object_detector]
Core logic isolation (FIRST HALF)
(#1239)
- implemented master params struct for this node new refactoring
- implemented ros_conversions.cpp/.hpp
- implemented euclidean_cluster_object_detector.hpp as the header for core logic, now with only cluster_standard
- implemented euclidean_cluster_object_detector.cpp as the source for core logic, now with only cluster_standard
- euclidean_cluster_node core logic refine, now only with cluster_standard()
File truncated at 100 lines see the full file
Package Dependencies
System Dependencies
| Name |
|---|
| libpcl-all-dev |
Dependant Packages
| Name | Deps |
|---|---|
| autoware_core_perception |
Launch files
- launch/euclidean_cluster.launch.xml
-
- input_pointcloud [default: /sensing/lidar/top/pointcloud_raw]
- input_map [default: /map/pointcloud_map]
- output_clusters [default: clusters]
- use_low_height_cropbox [default: false]
- euclidean_param_path [default: $(find-pkg-share autoware_euclidean_cluster_object_detector)/config/euclidean_cluster.param.yaml]
- use_pointcloud_container [default: false]
- pointcloud_container_name [default: pointcloud_container]
- launch/voxel_grid_based_euclidean_cluster.launch.xml
-
- input_pointcloud [default: /sensing/lidar/top/pointcloud_raw]
- input_map [default: /map/pointcloud_map]
- output_clusters [default: clusters]
- use_low_height_cropbox [default: false]
- voxel_grid_based_euclidean_param_path [default: $(find-pkg-share autoware_euclidean_cluster_object_detector)/config/voxel_grid_based_euclidean_cluster.param.yaml]
- use_pointcloud_container [default: false]
- pointcloud_container_name [default: pointcloud_container]
Messages
Services
Plugins
Recent questions tagged autoware_euclidean_cluster_object_detector at Robotics Stack Exchange
Package Summary
| Version | 1.10.0 |
| License | Apache License 2.0 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/autowarefoundation/autoware_core.git |
| VCS Type | git |
| VCS Version | main |
| Last Updated | 2026-10-07 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Maintainers
- Yukihiro Saito
- Dai Nguyen
Authors
autoware_euclidean_cluster_object_detector
Purpose
autoware_euclidean_cluster_object_detector is a package for clustering points into smaller parts to classify objects.
This package has two clustering methods: euclidean_cluster and voxel_grid_based_euclidean_cluster.
Inner-workings / Algorithms
euclidean_cluster
pcl::EuclideanClusterExtraction is applied to points. See official document for details.
voxel_grid_based_euclidean_cluster
- A centroid in each voxel is calculated by
pcl::VoxelGrid. - The centroids are clustered by
pcl::EuclideanClusterExtraction. - The input points are clustered based on the clustered centroids.
Inputs / Outputs
Input
| Name | Type | Description |
|---|---|---|
input |
sensor_msgs::msg::PointCloud2 |
input pointcloud |
Output
| Name | Type | Description |
|---|---|---|
output |
autoware_perception_msgs::msg::DetectedObjects |
detected objects |
debug/clusters |
sensor_msgs::msg::PointCloud2 |
colored cluster pointcloud for visualization |
Parameters
Core Parameters
euclidean_cluster
| Name | Type | Description |
|---|---|---|
use_height |
bool | use point.z for clustering |
min_cluster_size |
int | the minimum number of points that a cluster needs to contain in order to be considered valid |
max_cluster_size |
int | the maximum number of points that a cluster needs to contain in order to be considered valid |
tolerance |
float | the spatial cluster tolerance as a measure in the L2 Euclidean space |
voxel_grid_based_euclidean_cluster
| Name | Type | Description |
|---|---|---|
use_height |
bool | use point.z for clustering |
min_cluster_size |
int | the minimum number of points that a cluster needs to contain in order to be considered valid |
max_cluster_size |
int | the maximum number of points that a cluster needs to contain in order to be considered valid |
tolerance |
float | the spatial cluster tolerance as a measure in the L2 Euclidean space |
voxel_leaf_size |
float | the voxel leaf size of x and y |
min_points_number_per_voxel |
int | the minimum number of points for a voxel |
Assumptions / Known limits
Cluster size limits
The two size parameters are assumed to satisfy 1 <= min_cluster_size <= max_cluster_size. The
nodes do not check this, and the behaviour is undefined otherwise.
(Optional) Error detection and handling
(Optional) Performance characterization
(Optional) References/External links
<!– Write links you referred to when you implemented.
Example:
File truncated at 100 lines see the full file
Changelog for package autoware_euclidean_cluster_object_detector
1.10.0 (2026-09-28)
- Merge remote-tracking branch 'origin/main' into tmp/bot/bump_version_base
- test(euclidean_cluster_object_detector): fixed test euclidian cluser
(#1393)
test(autoware_euclidean_cluster_object_detector): make the
voxel-grid tests deterministic The tests drew their point
coordinates from an unseeded RNG. [testcase3]{.title-ref} failed in
CI about 20% of the time, and no failure could be reproduced,
because no seed was recorded. The input clouds are now written out
as literal points.
- [testcase1/2/3]{.title-ref} are renamed after the limit each one
exercises, and they pin [skipped_cluster_count]{.title-ref} as well.
- [ExceedMaxClusterSize]{.title-ref} is removed. It drove the same
rejection path as the max-size case and asserted less about it.
- New cases cover several objects in one scan, a count sitting on
both limits at once, a contradictory pair of limits, and skipping
decided per cluster.
- [BoundaryVoxelPointsAreNotDropped]{.title-ref} is unchanged. It
came from the regression fixed in
#1376.
- Outside the tests, the map key in
[cluster_voxel_grid()]{.title-ref} is renamed from
[voxel_1d_idx]{.title-ref} to [centroid_idx]{.title-ref}.
[getCentroidIndexAt()]{.title-ref} returns an index into the
filtered centroid cloud, not the grid cell index the old name
claimed.
- The README states the assumed range for the two size limits.
- fix(perception): declare the dependencies these packages use (#1371) Each of these packages uses a package it never declares. Either it includes a header of that package, or it names a symbol of it while the header arrives through another dependency. Both build today only because some declared dependency re-exports the owner, so a change in an unrelated repository can break them without anything here changing. The tag follows where the dependency is used: a use in an installed header or in code compiled into the library takes <depend>, one reached only from test/ takes <test_depend>. System libraries are named by the rosdep key this workspace already prefers.
- fix(autoware_euclidean_cluster_object_detector): keep boundary voxel points in their clusters (#1376) The detector recomputed the map key of each voxel from the float coordinates of its centroid. The centroid is a float mean. For points that sit exactly on a cell boundary, this mean rounds to one float step under the boundary. The recomputed key then pointed to the neighbor cell, and the detector dropped the raw points of that voxel. The oversized cluster in VoxelGridBasedEuclideanClusterTest.testcase3 then passed the max_cluster_size check, and the test failed intermittently. Key the map by the centroid index instead. This index is the same value that getCentroidIndexAt() returns for the raw points. Add a deterministic regression test for the boundary case.
- feat: [codecov/refactoring] [euclidean_cluster_object_detector]
Core logic isolation (SECOND HALF)
(#1244)
- added voxel grid cluster into core logic header, and specify a strategy gate to init once at startup
- implemented voxel_grid algorithm into the core logic module, with a nice touch of init once to address Akamine-san concern
- node unification between cluster standard and cluster nvoxel grid with a bunch of diagnostic added
- removed legacy files from old voxel grid structure, now already unified into core logics
- adjusted launch file to reflect new voxel grid locs
- purged voxel_grid relatives from cmakelist
- refactor test_euclidean_cluster_object_detection_integration.cpp test suite
- refactor test_node.cpp test suite
- heavy refactor of test_voxel_grid_based_euclidean_cluster.cpp test suite
- added the weird 2D flattening feature inside the voxel grid clustering
- removed redundant test inside tesdt voxel
- fixedspellcheck error (why Akamine-san's name does not pass the spellcheck?)
- bring back the voxel grid based euclidean cluster node header hpp
- reimplement voxel grid based euclidean cluster node source cpp
- clean up standard node, remove the voxel leaf size delcairation
- reimplemented voxel grid stuffs to CMakeLists
- fixed launch revert back to voxel node
- successfully reverted to the dual-node architecture
- fully reverted to dual nodes, all builds tests good now
- spell check and cpp ckeck diff fix
- feat: [codecov/refactoring] [euclidean_cluster_object_detector]
Core logic isolation (FIRST HALF)
(#1239)
- implemented master params struct for this node new refactoring
- implemented ros_conversions.cpp/.hpp
- implemented euclidean_cluster_object_detector.hpp as the header for core logic, now with only cluster_standard
- implemented euclidean_cluster_object_detector.cpp as the source for core logic, now with only cluster_standard
- euclidean_cluster_node core logic refine, now only with cluster_standard()
File truncated at 100 lines see the full file
Package Dependencies
System Dependencies
| Name |
|---|
| libpcl-all-dev |
Dependant Packages
| Name | Deps |
|---|---|
| autoware_core_perception |
Launch files
- launch/euclidean_cluster.launch.xml
-
- input_pointcloud [default: /sensing/lidar/top/pointcloud_raw]
- input_map [default: /map/pointcloud_map]
- output_clusters [default: clusters]
- use_low_height_cropbox [default: false]
- euclidean_param_path [default: $(find-pkg-share autoware_euclidean_cluster_object_detector)/config/euclidean_cluster.param.yaml]
- use_pointcloud_container [default: false]
- pointcloud_container_name [default: pointcloud_container]
- launch/voxel_grid_based_euclidean_cluster.launch.xml
-
- input_pointcloud [default: /sensing/lidar/top/pointcloud_raw]
- input_map [default: /map/pointcloud_map]
- output_clusters [default: clusters]
- use_low_height_cropbox [default: false]
- voxel_grid_based_euclidean_param_path [default: $(find-pkg-share autoware_euclidean_cluster_object_detector)/config/voxel_grid_based_euclidean_cluster.param.yaml]
- use_pointcloud_container [default: false]
- pointcloud_container_name [default: pointcloud_container]
Messages
Services
Plugins
Recent questions tagged autoware_euclidean_cluster_object_detector at Robotics Stack Exchange
Package Summary
| Version | 1.10.0 |
| License | Apache License 2.0 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/autowarefoundation/autoware_core.git |
| VCS Type | git |
| VCS Version | main |
| Last Updated | 2026-10-07 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Maintainers
- Yukihiro Saito
- Dai Nguyen
Authors
autoware_euclidean_cluster_object_detector
Purpose
autoware_euclidean_cluster_object_detector is a package for clustering points into smaller parts to classify objects.
This package has two clustering methods: euclidean_cluster and voxel_grid_based_euclidean_cluster.
Inner-workings / Algorithms
euclidean_cluster
pcl::EuclideanClusterExtraction is applied to points. See official document for details.
voxel_grid_based_euclidean_cluster
- A centroid in each voxel is calculated by
pcl::VoxelGrid. - The centroids are clustered by
pcl::EuclideanClusterExtraction. - The input points are clustered based on the clustered centroids.
Inputs / Outputs
Input
| Name | Type | Description |
|---|---|---|
input |
sensor_msgs::msg::PointCloud2 |
input pointcloud |
Output
| Name | Type | Description |
|---|---|---|
output |
autoware_perception_msgs::msg::DetectedObjects |
detected objects |
debug/clusters |
sensor_msgs::msg::PointCloud2 |
colored cluster pointcloud for visualization |
Parameters
Core Parameters
euclidean_cluster
| Name | Type | Description |
|---|---|---|
use_height |
bool | use point.z for clustering |
min_cluster_size |
int | the minimum number of points that a cluster needs to contain in order to be considered valid |
max_cluster_size |
int | the maximum number of points that a cluster needs to contain in order to be considered valid |
tolerance |
float | the spatial cluster tolerance as a measure in the L2 Euclidean space |
voxel_grid_based_euclidean_cluster
| Name | Type | Description |
|---|---|---|
use_height |
bool | use point.z for clustering |
min_cluster_size |
int | the minimum number of points that a cluster needs to contain in order to be considered valid |
max_cluster_size |
int | the maximum number of points that a cluster needs to contain in order to be considered valid |
tolerance |
float | the spatial cluster tolerance as a measure in the L2 Euclidean space |
voxel_leaf_size |
float | the voxel leaf size of x and y |
min_points_number_per_voxel |
int | the minimum number of points for a voxel |
Assumptions / Known limits
Cluster size limits
The two size parameters are assumed to satisfy 1 <= min_cluster_size <= max_cluster_size. The
nodes do not check this, and the behaviour is undefined otherwise.
(Optional) Error detection and handling
(Optional) Performance characterization
(Optional) References/External links
<!– Write links you referred to when you implemented.
Example:
File truncated at 100 lines see the full file
Changelog for package autoware_euclidean_cluster_object_detector
1.10.0 (2026-09-28)
- Merge remote-tracking branch 'origin/main' into tmp/bot/bump_version_base
- test(euclidean_cluster_object_detector): fixed test euclidian cluser
(#1393)
test(autoware_euclidean_cluster_object_detector): make the
voxel-grid tests deterministic The tests drew their point
coordinates from an unseeded RNG. [testcase3]{.title-ref} failed in
CI about 20% of the time, and no failure could be reproduced,
because no seed was recorded. The input clouds are now written out
as literal points.
- [testcase1/2/3]{.title-ref} are renamed after the limit each one
exercises, and they pin [skipped_cluster_count]{.title-ref} as well.
- [ExceedMaxClusterSize]{.title-ref} is removed. It drove the same
rejection path as the max-size case and asserted less about it.
- New cases cover several objects in one scan, a count sitting on
both limits at once, a contradictory pair of limits, and skipping
decided per cluster.
- [BoundaryVoxelPointsAreNotDropped]{.title-ref} is unchanged. It
came from the regression fixed in
#1376.
- Outside the tests, the map key in
[cluster_voxel_grid()]{.title-ref} is renamed from
[voxel_1d_idx]{.title-ref} to [centroid_idx]{.title-ref}.
[getCentroidIndexAt()]{.title-ref} returns an index into the
filtered centroid cloud, not the grid cell index the old name
claimed.
- The README states the assumed range for the two size limits.
- fix(perception): declare the dependencies these packages use (#1371) Each of these packages uses a package it never declares. Either it includes a header of that package, or it names a symbol of it while the header arrives through another dependency. Both build today only because some declared dependency re-exports the owner, so a change in an unrelated repository can break them without anything here changing. The tag follows where the dependency is used: a use in an installed header or in code compiled into the library takes <depend>, one reached only from test/ takes <test_depend>. System libraries are named by the rosdep key this workspace already prefers.
- fix(autoware_euclidean_cluster_object_detector): keep boundary voxel points in their clusters (#1376) The detector recomputed the map key of each voxel from the float coordinates of its centroid. The centroid is a float mean. For points that sit exactly on a cell boundary, this mean rounds to one float step under the boundary. The recomputed key then pointed to the neighbor cell, and the detector dropped the raw points of that voxel. The oversized cluster in VoxelGridBasedEuclideanClusterTest.testcase3 then passed the max_cluster_size check, and the test failed intermittently. Key the map by the centroid index instead. This index is the same value that getCentroidIndexAt() returns for the raw points. Add a deterministic regression test for the boundary case.
- feat: [codecov/refactoring] [euclidean_cluster_object_detector]
Core logic isolation (SECOND HALF)
(#1244)
- added voxel grid cluster into core logic header, and specify a strategy gate to init once at startup
- implemented voxel_grid algorithm into the core logic module, with a nice touch of init once to address Akamine-san concern
- node unification between cluster standard and cluster nvoxel grid with a bunch of diagnostic added
- removed legacy files from old voxel grid structure, now already unified into core logics
- adjusted launch file to reflect new voxel grid locs
- purged voxel_grid relatives from cmakelist
- refactor test_euclidean_cluster_object_detection_integration.cpp test suite
- refactor test_node.cpp test suite
- heavy refactor of test_voxel_grid_based_euclidean_cluster.cpp test suite
- added the weird 2D flattening feature inside the voxel grid clustering
- removed redundant test inside tesdt voxel
- fixedspellcheck error (why Akamine-san's name does not pass the spellcheck?)
- bring back the voxel grid based euclidean cluster node header hpp
- reimplement voxel grid based euclidean cluster node source cpp
- clean up standard node, remove the voxel leaf size delcairation
- reimplemented voxel grid stuffs to CMakeLists
- fixed launch revert back to voxel node
- successfully reverted to the dual-node architecture
- fully reverted to dual nodes, all builds tests good now
- spell check and cpp ckeck diff fix
- feat: [codecov/refactoring] [euclidean_cluster_object_detector]
Core logic isolation (FIRST HALF)
(#1239)
- implemented master params struct for this node new refactoring
- implemented ros_conversions.cpp/.hpp
- implemented euclidean_cluster_object_detector.hpp as the header for core logic, now with only cluster_standard
- implemented euclidean_cluster_object_detector.cpp as the source for core logic, now with only cluster_standard
- euclidean_cluster_node core logic refine, now only with cluster_standard()
File truncated at 100 lines see the full file
Package Dependencies
System Dependencies
| Name |
|---|
| libpcl-all-dev |
Dependant Packages
| Name | Deps |
|---|---|
| autoware_core_perception |
Launch files
- launch/euclidean_cluster.launch.xml
-
- input_pointcloud [default: /sensing/lidar/top/pointcloud_raw]
- input_map [default: /map/pointcloud_map]
- output_clusters [default: clusters]
- use_low_height_cropbox [default: false]
- euclidean_param_path [default: $(find-pkg-share autoware_euclidean_cluster_object_detector)/config/euclidean_cluster.param.yaml]
- use_pointcloud_container [default: false]
- pointcloud_container_name [default: pointcloud_container]
- launch/voxel_grid_based_euclidean_cluster.launch.xml
-
- input_pointcloud [default: /sensing/lidar/top/pointcloud_raw]
- input_map [default: /map/pointcloud_map]
- output_clusters [default: clusters]
- use_low_height_cropbox [default: false]
- voxel_grid_based_euclidean_param_path [default: $(find-pkg-share autoware_euclidean_cluster_object_detector)/config/voxel_grid_based_euclidean_cluster.param.yaml]
- use_pointcloud_container [default: false]
- pointcloud_container_name [default: pointcloud_container]
Messages
Services
Plugins
Recent questions tagged autoware_euclidean_cluster_object_detector at Robotics Stack Exchange
Package Summary
| Version | 1.10.0 |
| License | Apache License 2.0 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/autowarefoundation/autoware_core.git |
| VCS Type | git |
| VCS Version | main |
| Last Updated | 2026-10-07 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Maintainers
- Yukihiro Saito
- Dai Nguyen
Authors
autoware_euclidean_cluster_object_detector
Purpose
autoware_euclidean_cluster_object_detector is a package for clustering points into smaller parts to classify objects.
This package has two clustering methods: euclidean_cluster and voxel_grid_based_euclidean_cluster.
Inner-workings / Algorithms
euclidean_cluster
pcl::EuclideanClusterExtraction is applied to points. See official document for details.
voxel_grid_based_euclidean_cluster
- A centroid in each voxel is calculated by
pcl::VoxelGrid. - The centroids are clustered by
pcl::EuclideanClusterExtraction. - The input points are clustered based on the clustered centroids.
Inputs / Outputs
Input
| Name | Type | Description |
|---|---|---|
input |
sensor_msgs::msg::PointCloud2 |
input pointcloud |
Output
| Name | Type | Description |
|---|---|---|
output |
autoware_perception_msgs::msg::DetectedObjects |
detected objects |
debug/clusters |
sensor_msgs::msg::PointCloud2 |
colored cluster pointcloud for visualization |
Parameters
Core Parameters
euclidean_cluster
| Name | Type | Description |
|---|---|---|
use_height |
bool | use point.z for clustering |
min_cluster_size |
int | the minimum number of points that a cluster needs to contain in order to be considered valid |
max_cluster_size |
int | the maximum number of points that a cluster needs to contain in order to be considered valid |
tolerance |
float | the spatial cluster tolerance as a measure in the L2 Euclidean space |
voxel_grid_based_euclidean_cluster
| Name | Type | Description |
|---|---|---|
use_height |
bool | use point.z for clustering |
min_cluster_size |
int | the minimum number of points that a cluster needs to contain in order to be considered valid |
max_cluster_size |
int | the maximum number of points that a cluster needs to contain in order to be considered valid |
tolerance |
float | the spatial cluster tolerance as a measure in the L2 Euclidean space |
voxel_leaf_size |
float | the voxel leaf size of x and y |
min_points_number_per_voxel |
int | the minimum number of points for a voxel |
Assumptions / Known limits
Cluster size limits
The two size parameters are assumed to satisfy 1 <= min_cluster_size <= max_cluster_size. The
nodes do not check this, and the behaviour is undefined otherwise.
(Optional) Error detection and handling
(Optional) Performance characterization
(Optional) References/External links
<!– Write links you referred to when you implemented.
Example:
File truncated at 100 lines see the full file
Changelog for package autoware_euclidean_cluster_object_detector
1.10.0 (2026-09-28)
- Merge remote-tracking branch 'origin/main' into tmp/bot/bump_version_base
- test(euclidean_cluster_object_detector): fixed test euclidian cluser
(#1393)
test(autoware_euclidean_cluster_object_detector): make the
voxel-grid tests deterministic The tests drew their point
coordinates from an unseeded RNG. [testcase3]{.title-ref} failed in
CI about 20% of the time, and no failure could be reproduced,
because no seed was recorded. The input clouds are now written out
as literal points.
- [testcase1/2/3]{.title-ref} are renamed after the limit each one
exercises, and they pin [skipped_cluster_count]{.title-ref} as well.
- [ExceedMaxClusterSize]{.title-ref} is removed. It drove the same
rejection path as the max-size case and asserted less about it.
- New cases cover several objects in one scan, a count sitting on
both limits at once, a contradictory pair of limits, and skipping
decided per cluster.
- [BoundaryVoxelPointsAreNotDropped]{.title-ref} is unchanged. It
came from the regression fixed in
#1376.
- Outside the tests, the map key in
[cluster_voxel_grid()]{.title-ref} is renamed from
[voxel_1d_idx]{.title-ref} to [centroid_idx]{.title-ref}.
[getCentroidIndexAt()]{.title-ref} returns an index into the
filtered centroid cloud, not the grid cell index the old name
claimed.
- The README states the assumed range for the two size limits.
- fix(perception): declare the dependencies these packages use (#1371) Each of these packages uses a package it never declares. Either it includes a header of that package, or it names a symbol of it while the header arrives through another dependency. Both build today only because some declared dependency re-exports the owner, so a change in an unrelated repository can break them without anything here changing. The tag follows where the dependency is used: a use in an installed header or in code compiled into the library takes <depend>, one reached only from test/ takes <test_depend>. System libraries are named by the rosdep key this workspace already prefers.
- fix(autoware_euclidean_cluster_object_detector): keep boundary voxel points in their clusters (#1376) The detector recomputed the map key of each voxel from the float coordinates of its centroid. The centroid is a float mean. For points that sit exactly on a cell boundary, this mean rounds to one float step under the boundary. The recomputed key then pointed to the neighbor cell, and the detector dropped the raw points of that voxel. The oversized cluster in VoxelGridBasedEuclideanClusterTest.testcase3 then passed the max_cluster_size check, and the test failed intermittently. Key the map by the centroid index instead. This index is the same value that getCentroidIndexAt() returns for the raw points. Add a deterministic regression test for the boundary case.
- feat: [codecov/refactoring] [euclidean_cluster_object_detector]
Core logic isolation (SECOND HALF)
(#1244)
- added voxel grid cluster into core logic header, and specify a strategy gate to init once at startup
- implemented voxel_grid algorithm into the core logic module, with a nice touch of init once to address Akamine-san concern
- node unification between cluster standard and cluster nvoxel grid with a bunch of diagnostic added
- removed legacy files from old voxel grid structure, now already unified into core logics
- adjusted launch file to reflect new voxel grid locs
- purged voxel_grid relatives from cmakelist
- refactor test_euclidean_cluster_object_detection_integration.cpp test suite
- refactor test_node.cpp test suite
- heavy refactor of test_voxel_grid_based_euclidean_cluster.cpp test suite
- added the weird 2D flattening feature inside the voxel grid clustering
- removed redundant test inside tesdt voxel
- fixedspellcheck error (why Akamine-san's name does not pass the spellcheck?)
- bring back the voxel grid based euclidean cluster node header hpp
- reimplement voxel grid based euclidean cluster node source cpp
- clean up standard node, remove the voxel leaf size delcairation
- reimplemented voxel grid stuffs to CMakeLists
- fixed launch revert back to voxel node
- successfully reverted to the dual-node architecture
- fully reverted to dual nodes, all builds tests good now
- spell check and cpp ckeck diff fix
- feat: [codecov/refactoring] [euclidean_cluster_object_detector]
Core logic isolation (FIRST HALF)
(#1239)
- implemented master params struct for this node new refactoring
- implemented ros_conversions.cpp/.hpp
- implemented euclidean_cluster_object_detector.hpp as the header for core logic, now with only cluster_standard
- implemented euclidean_cluster_object_detector.cpp as the source for core logic, now with only cluster_standard
- euclidean_cluster_node core logic refine, now only with cluster_standard()
File truncated at 100 lines see the full file
Package Dependencies
System Dependencies
| Name |
|---|
| libpcl-all-dev |
Dependant Packages
| Name | Deps |
|---|---|
| autoware_core_perception |
Launch files
- launch/euclidean_cluster.launch.xml
-
- input_pointcloud [default: /sensing/lidar/top/pointcloud_raw]
- input_map [default: /map/pointcloud_map]
- output_clusters [default: clusters]
- use_low_height_cropbox [default: false]
- euclidean_param_path [default: $(find-pkg-share autoware_euclidean_cluster_object_detector)/config/euclidean_cluster.param.yaml]
- use_pointcloud_container [default: false]
- pointcloud_container_name [default: pointcloud_container]
- launch/voxel_grid_based_euclidean_cluster.launch.xml
-
- input_pointcloud [default: /sensing/lidar/top/pointcloud_raw]
- input_map [default: /map/pointcloud_map]
- output_clusters [default: clusters]
- use_low_height_cropbox [default: false]
- voxel_grid_based_euclidean_param_path [default: $(find-pkg-share autoware_euclidean_cluster_object_detector)/config/voxel_grid_based_euclidean_cluster.param.yaml]
- use_pointcloud_container [default: false]
- pointcloud_container_name [default: pointcloud_container]
Messages
Services
Plugins
Recent questions tagged autoware_euclidean_cluster_object_detector at Robotics Stack Exchange
Package Summary
| Version | 1.10.0 |
| License | Apache License 2.0 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/autowarefoundation/autoware_core.git |
| VCS Type | git |
| VCS Version | main |
| Last Updated | 2026-10-07 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Maintainers
- Yukihiro Saito
- Dai Nguyen
Authors
autoware_euclidean_cluster_object_detector
Purpose
autoware_euclidean_cluster_object_detector is a package for clustering points into smaller parts to classify objects.
This package has two clustering methods: euclidean_cluster and voxel_grid_based_euclidean_cluster.
Inner-workings / Algorithms
euclidean_cluster
pcl::EuclideanClusterExtraction is applied to points. See official document for details.
voxel_grid_based_euclidean_cluster
- A centroid in each voxel is calculated by
pcl::VoxelGrid. - The centroids are clustered by
pcl::EuclideanClusterExtraction. - The input points are clustered based on the clustered centroids.
Inputs / Outputs
Input
| Name | Type | Description |
|---|---|---|
input |
sensor_msgs::msg::PointCloud2 |
input pointcloud |
Output
| Name | Type | Description |
|---|---|---|
output |
autoware_perception_msgs::msg::DetectedObjects |
detected objects |
debug/clusters |
sensor_msgs::msg::PointCloud2 |
colored cluster pointcloud for visualization |
Parameters
Core Parameters
euclidean_cluster
| Name | Type | Description |
|---|---|---|
use_height |
bool | use point.z for clustering |
min_cluster_size |
int | the minimum number of points that a cluster needs to contain in order to be considered valid |
max_cluster_size |
int | the maximum number of points that a cluster needs to contain in order to be considered valid |
tolerance |
float | the spatial cluster tolerance as a measure in the L2 Euclidean space |
voxel_grid_based_euclidean_cluster
| Name | Type | Description |
|---|---|---|
use_height |
bool | use point.z for clustering |
min_cluster_size |
int | the minimum number of points that a cluster needs to contain in order to be considered valid |
max_cluster_size |
int | the maximum number of points that a cluster needs to contain in order to be considered valid |
tolerance |
float | the spatial cluster tolerance as a measure in the L2 Euclidean space |
voxel_leaf_size |
float | the voxel leaf size of x and y |
min_points_number_per_voxel |
int | the minimum number of points for a voxel |
Assumptions / Known limits
Cluster size limits
The two size parameters are assumed to satisfy 1 <= min_cluster_size <= max_cluster_size. The
nodes do not check this, and the behaviour is undefined otherwise.
(Optional) Error detection and handling
(Optional) Performance characterization
(Optional) References/External links
<!– Write links you referred to when you implemented.
Example:
File truncated at 100 lines see the full file
Changelog for package autoware_euclidean_cluster_object_detector
1.10.0 (2026-09-28)
- Merge remote-tracking branch 'origin/main' into tmp/bot/bump_version_base
- test(euclidean_cluster_object_detector): fixed test euclidian cluser
(#1393)
test(autoware_euclidean_cluster_object_detector): make the
voxel-grid tests deterministic The tests drew their point
coordinates from an unseeded RNG. [testcase3]{.title-ref} failed in
CI about 20% of the time, and no failure could be reproduced,
because no seed was recorded. The input clouds are now written out
as literal points.
- [testcase1/2/3]{.title-ref} are renamed after the limit each one
exercises, and they pin [skipped_cluster_count]{.title-ref} as well.
- [ExceedMaxClusterSize]{.title-ref} is removed. It drove the same
rejection path as the max-size case and asserted less about it.
- New cases cover several objects in one scan, a count sitting on
both limits at once, a contradictory pair of limits, and skipping
decided per cluster.
- [BoundaryVoxelPointsAreNotDropped]{.title-ref} is unchanged. It
came from the regression fixed in
#1376.
- Outside the tests, the map key in
[cluster_voxel_grid()]{.title-ref} is renamed from
[voxel_1d_idx]{.title-ref} to [centroid_idx]{.title-ref}.
[getCentroidIndexAt()]{.title-ref} returns an index into the
filtered centroid cloud, not the grid cell index the old name
claimed.
- The README states the assumed range for the two size limits.
- fix(perception): declare the dependencies these packages use (#1371) Each of these packages uses a package it never declares. Either it includes a header of that package, or it names a symbol of it while the header arrives through another dependency. Both build today only because some declared dependency re-exports the owner, so a change in an unrelated repository can break them without anything here changing. The tag follows where the dependency is used: a use in an installed header or in code compiled into the library takes <depend>, one reached only from test/ takes <test_depend>. System libraries are named by the rosdep key this workspace already prefers.
- fix(autoware_euclidean_cluster_object_detector): keep boundary voxel points in their clusters (#1376) The detector recomputed the map key of each voxel from the float coordinates of its centroid. The centroid is a float mean. For points that sit exactly on a cell boundary, this mean rounds to one float step under the boundary. The recomputed key then pointed to the neighbor cell, and the detector dropped the raw points of that voxel. The oversized cluster in VoxelGridBasedEuclideanClusterTest.testcase3 then passed the max_cluster_size check, and the test failed intermittently. Key the map by the centroid index instead. This index is the same value that getCentroidIndexAt() returns for the raw points. Add a deterministic regression test for the boundary case.
- feat: [codecov/refactoring] [euclidean_cluster_object_detector]
Core logic isolation (SECOND HALF)
(#1244)
- added voxel grid cluster into core logic header, and specify a strategy gate to init once at startup
- implemented voxel_grid algorithm into the core logic module, with a nice touch of init once to address Akamine-san concern
- node unification between cluster standard and cluster nvoxel grid with a bunch of diagnostic added
- removed legacy files from old voxel grid structure, now already unified into core logics
- adjusted launch file to reflect new voxel grid locs
- purged voxel_grid relatives from cmakelist
- refactor test_euclidean_cluster_object_detection_integration.cpp test suite
- refactor test_node.cpp test suite
- heavy refactor of test_voxel_grid_based_euclidean_cluster.cpp test suite
- added the weird 2D flattening feature inside the voxel grid clustering
- removed redundant test inside tesdt voxel
- fixedspellcheck error (why Akamine-san's name does not pass the spellcheck?)
- bring back the voxel grid based euclidean cluster node header hpp
- reimplement voxel grid based euclidean cluster node source cpp
- clean up standard node, remove the voxel leaf size delcairation
- reimplemented voxel grid stuffs to CMakeLists
- fixed launch revert back to voxel node
- successfully reverted to the dual-node architecture
- fully reverted to dual nodes, all builds tests good now
- spell check and cpp ckeck diff fix
- feat: [codecov/refactoring] [euclidean_cluster_object_detector]
Core logic isolation (FIRST HALF)
(#1239)
- implemented master params struct for this node new refactoring
- implemented ros_conversions.cpp/.hpp
- implemented euclidean_cluster_object_detector.hpp as the header for core logic, now with only cluster_standard
- implemented euclidean_cluster_object_detector.cpp as the source for core logic, now with only cluster_standard
- euclidean_cluster_node core logic refine, now only with cluster_standard()
File truncated at 100 lines see the full file
Package Dependencies
System Dependencies
| Name |
|---|
| libpcl-all-dev |
Dependant Packages
| Name | Deps |
|---|---|
| autoware_core_perception |
Launch files
- launch/euclidean_cluster.launch.xml
-
- input_pointcloud [default: /sensing/lidar/top/pointcloud_raw]
- input_map [default: /map/pointcloud_map]
- output_clusters [default: clusters]
- use_low_height_cropbox [default: false]
- euclidean_param_path [default: $(find-pkg-share autoware_euclidean_cluster_object_detector)/config/euclidean_cluster.param.yaml]
- use_pointcloud_container [default: false]
- pointcloud_container_name [default: pointcloud_container]
- launch/voxel_grid_based_euclidean_cluster.launch.xml
-
- input_pointcloud [default: /sensing/lidar/top/pointcloud_raw]
- input_map [default: /map/pointcloud_map]
- output_clusters [default: clusters]
- use_low_height_cropbox [default: false]
- voxel_grid_based_euclidean_param_path [default: $(find-pkg-share autoware_euclidean_cluster_object_detector)/config/voxel_grid_based_euclidean_cluster.param.yaml]
- use_pointcloud_container [default: false]
- pointcloud_container_name [default: pointcloud_container]
Messages
Services
Plugins
Recent questions tagged autoware_euclidean_cluster_object_detector at Robotics Stack Exchange
Package Summary
| Version | 1.10.0 |
| License | Apache License 2.0 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/autowarefoundation/autoware_core.git |
| VCS Type | git |
| VCS Version | main |
| Last Updated | 2026-10-07 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Maintainers
- Yukihiro Saito
- Dai Nguyen
Authors
autoware_euclidean_cluster_object_detector
Purpose
autoware_euclidean_cluster_object_detector is a package for clustering points into smaller parts to classify objects.
This package has two clustering methods: euclidean_cluster and voxel_grid_based_euclidean_cluster.
Inner-workings / Algorithms
euclidean_cluster
pcl::EuclideanClusterExtraction is applied to points. See official document for details.
voxel_grid_based_euclidean_cluster
- A centroid in each voxel is calculated by
pcl::VoxelGrid. - The centroids are clustered by
pcl::EuclideanClusterExtraction. - The input points are clustered based on the clustered centroids.
Inputs / Outputs
Input
| Name | Type | Description |
|---|---|---|
input |
sensor_msgs::msg::PointCloud2 |
input pointcloud |
Output
| Name | Type | Description |
|---|---|---|
output |
autoware_perception_msgs::msg::DetectedObjects |
detected objects |
debug/clusters |
sensor_msgs::msg::PointCloud2 |
colored cluster pointcloud for visualization |
Parameters
Core Parameters
euclidean_cluster
| Name | Type | Description |
|---|---|---|
use_height |
bool | use point.z for clustering |
min_cluster_size |
int | the minimum number of points that a cluster needs to contain in order to be considered valid |
max_cluster_size |
int | the maximum number of points that a cluster needs to contain in order to be considered valid |
tolerance |
float | the spatial cluster tolerance as a measure in the L2 Euclidean space |
voxel_grid_based_euclidean_cluster
| Name | Type | Description |
|---|---|---|
use_height |
bool | use point.z for clustering |
min_cluster_size |
int | the minimum number of points that a cluster needs to contain in order to be considered valid |
max_cluster_size |
int | the maximum number of points that a cluster needs to contain in order to be considered valid |
tolerance |
float | the spatial cluster tolerance as a measure in the L2 Euclidean space |
voxel_leaf_size |
float | the voxel leaf size of x and y |
min_points_number_per_voxel |
int | the minimum number of points for a voxel |
Assumptions / Known limits
Cluster size limits
The two size parameters are assumed to satisfy 1 <= min_cluster_size <= max_cluster_size. The
nodes do not check this, and the behaviour is undefined otherwise.
(Optional) Error detection and handling
(Optional) Performance characterization
(Optional) References/External links
<!– Write links you referred to when you implemented.
Example:
File truncated at 100 lines see the full file
Changelog for package autoware_euclidean_cluster_object_detector
1.10.0 (2026-09-28)
- Merge remote-tracking branch 'origin/main' into tmp/bot/bump_version_base
- test(euclidean_cluster_object_detector): fixed test euclidian cluser
(#1393)
test(autoware_euclidean_cluster_object_detector): make the
voxel-grid tests deterministic The tests drew their point
coordinates from an unseeded RNG. [testcase3]{.title-ref} failed in
CI about 20% of the time, and no failure could be reproduced,
because no seed was recorded. The input clouds are now written out
as literal points.
- [testcase1/2/3]{.title-ref} are renamed after the limit each one
exercises, and they pin [skipped_cluster_count]{.title-ref} as well.
- [ExceedMaxClusterSize]{.title-ref} is removed. It drove the same
rejection path as the max-size case and asserted less about it.
- New cases cover several objects in one scan, a count sitting on
both limits at once, a contradictory pair of limits, and skipping
decided per cluster.
- [BoundaryVoxelPointsAreNotDropped]{.title-ref} is unchanged. It
came from the regression fixed in
#1376.
- Outside the tests, the map key in
[cluster_voxel_grid()]{.title-ref} is renamed from
[voxel_1d_idx]{.title-ref} to [centroid_idx]{.title-ref}.
[getCentroidIndexAt()]{.title-ref} returns an index into the
filtered centroid cloud, not the grid cell index the old name
claimed.
- The README states the assumed range for the two size limits.
- fix(perception): declare the dependencies these packages use (#1371) Each of these packages uses a package it never declares. Either it includes a header of that package, or it names a symbol of it while the header arrives through another dependency. Both build today only because some declared dependency re-exports the owner, so a change in an unrelated repository can break them without anything here changing. The tag follows where the dependency is used: a use in an installed header or in code compiled into the library takes <depend>, one reached only from test/ takes <test_depend>. System libraries are named by the rosdep key this workspace already prefers.
- fix(autoware_euclidean_cluster_object_detector): keep boundary voxel points in their clusters (#1376) The detector recomputed the map key of each voxel from the float coordinates of its centroid. The centroid is a float mean. For points that sit exactly on a cell boundary, this mean rounds to one float step under the boundary. The recomputed key then pointed to the neighbor cell, and the detector dropped the raw points of that voxel. The oversized cluster in VoxelGridBasedEuclideanClusterTest.testcase3 then passed the max_cluster_size check, and the test failed intermittently. Key the map by the centroid index instead. This index is the same value that getCentroidIndexAt() returns for the raw points. Add a deterministic regression test for the boundary case.
- feat: [codecov/refactoring] [euclidean_cluster_object_detector]
Core logic isolation (SECOND HALF)
(#1244)
- added voxel grid cluster into core logic header, and specify a strategy gate to init once at startup
- implemented voxel_grid algorithm into the core logic module, with a nice touch of init once to address Akamine-san concern
- node unification between cluster standard and cluster nvoxel grid with a bunch of diagnostic added
- removed legacy files from old voxel grid structure, now already unified into core logics
- adjusted launch file to reflect new voxel grid locs
- purged voxel_grid relatives from cmakelist
- refactor test_euclidean_cluster_object_detection_integration.cpp test suite
- refactor test_node.cpp test suite
- heavy refactor of test_voxel_grid_based_euclidean_cluster.cpp test suite
- added the weird 2D flattening feature inside the voxel grid clustering
- removed redundant test inside tesdt voxel
- fixedspellcheck error (why Akamine-san's name does not pass the spellcheck?)
- bring back the voxel grid based euclidean cluster node header hpp
- reimplement voxel grid based euclidean cluster node source cpp
- clean up standard node, remove the voxel leaf size delcairation
- reimplemented voxel grid stuffs to CMakeLists
- fixed launch revert back to voxel node
- successfully reverted to the dual-node architecture
- fully reverted to dual nodes, all builds tests good now
- spell check and cpp ckeck diff fix
- feat: [codecov/refactoring] [euclidean_cluster_object_detector]
Core logic isolation (FIRST HALF)
(#1239)
- implemented master params struct for this node new refactoring
- implemented ros_conversions.cpp/.hpp
- implemented euclidean_cluster_object_detector.hpp as the header for core logic, now with only cluster_standard
- implemented euclidean_cluster_object_detector.cpp as the source for core logic, now with only cluster_standard
- euclidean_cluster_node core logic refine, now only with cluster_standard()
File truncated at 100 lines see the full file
Package Dependencies
System Dependencies
| Name |
|---|
| libpcl-all-dev |
Dependant Packages
| Name | Deps |
|---|---|
| autoware_core_perception |
Launch files
- launch/euclidean_cluster.launch.xml
-
- input_pointcloud [default: /sensing/lidar/top/pointcloud_raw]
- input_map [default: /map/pointcloud_map]
- output_clusters [default: clusters]
- use_low_height_cropbox [default: false]
- euclidean_param_path [default: $(find-pkg-share autoware_euclidean_cluster_object_detector)/config/euclidean_cluster.param.yaml]
- use_pointcloud_container [default: false]
- pointcloud_container_name [default: pointcloud_container]
- launch/voxel_grid_based_euclidean_cluster.launch.xml
-
- input_pointcloud [default: /sensing/lidar/top/pointcloud_raw]
- input_map [default: /map/pointcloud_map]
- output_clusters [default: clusters]
- use_low_height_cropbox [default: false]
- voxel_grid_based_euclidean_param_path [default: $(find-pkg-share autoware_euclidean_cluster_object_detector)/config/voxel_grid_based_euclidean_cluster.param.yaml]
- use_pointcloud_container [default: false]
- pointcloud_container_name [default: pointcloud_container]
Messages
Services
Plugins
Recent questions tagged autoware_euclidean_cluster_object_detector at Robotics Stack Exchange
Package Summary
| Version | 1.10.0 |
| License | Apache License 2.0 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/autowarefoundation/autoware_core.git |
| VCS Type | git |
| VCS Version | main |
| Last Updated | 2026-10-07 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Maintainers
- Yukihiro Saito
- Dai Nguyen
Authors
autoware_euclidean_cluster_object_detector
Purpose
autoware_euclidean_cluster_object_detector is a package for clustering points into smaller parts to classify objects.
This package has two clustering methods: euclidean_cluster and voxel_grid_based_euclidean_cluster.
Inner-workings / Algorithms
euclidean_cluster
pcl::EuclideanClusterExtraction is applied to points. See official document for details.
voxel_grid_based_euclidean_cluster
- A centroid in each voxel is calculated by
pcl::VoxelGrid. - The centroids are clustered by
pcl::EuclideanClusterExtraction. - The input points are clustered based on the clustered centroids.
Inputs / Outputs
Input
| Name | Type | Description |
|---|---|---|
input |
sensor_msgs::msg::PointCloud2 |
input pointcloud |
Output
| Name | Type | Description |
|---|---|---|
output |
autoware_perception_msgs::msg::DetectedObjects |
detected objects |
debug/clusters |
sensor_msgs::msg::PointCloud2 |
colored cluster pointcloud for visualization |
Parameters
Core Parameters
euclidean_cluster
| Name | Type | Description |
|---|---|---|
use_height |
bool | use point.z for clustering |
min_cluster_size |
int | the minimum number of points that a cluster needs to contain in order to be considered valid |
max_cluster_size |
int | the maximum number of points that a cluster needs to contain in order to be considered valid |
tolerance |
float | the spatial cluster tolerance as a measure in the L2 Euclidean space |
voxel_grid_based_euclidean_cluster
| Name | Type | Description |
|---|---|---|
use_height |
bool | use point.z for clustering |
min_cluster_size |
int | the minimum number of points that a cluster needs to contain in order to be considered valid |
max_cluster_size |
int | the maximum number of points that a cluster needs to contain in order to be considered valid |
tolerance |
float | the spatial cluster tolerance as a measure in the L2 Euclidean space |
voxel_leaf_size |
float | the voxel leaf size of x and y |
min_points_number_per_voxel |
int | the minimum number of points for a voxel |
Assumptions / Known limits
Cluster size limits
The two size parameters are assumed to satisfy 1 <= min_cluster_size <= max_cluster_size. The
nodes do not check this, and the behaviour is undefined otherwise.
(Optional) Error detection and handling
(Optional) Performance characterization
(Optional) References/External links
<!– Write links you referred to when you implemented.
Example:
File truncated at 100 lines see the full file
Changelog for package autoware_euclidean_cluster_object_detector
1.10.0 (2026-09-28)
- Merge remote-tracking branch 'origin/main' into tmp/bot/bump_version_base
- test(euclidean_cluster_object_detector): fixed test euclidian cluser
(#1393)
test(autoware_euclidean_cluster_object_detector): make the
voxel-grid tests deterministic The tests drew their point
coordinates from an unseeded RNG. [testcase3]{.title-ref} failed in
CI about 20% of the time, and no failure could be reproduced,
because no seed was recorded. The input clouds are now written out
as literal points.
- [testcase1/2/3]{.title-ref} are renamed after the limit each one
exercises, and they pin [skipped_cluster_count]{.title-ref} as well.
- [ExceedMaxClusterSize]{.title-ref} is removed. It drove the same
rejection path as the max-size case and asserted less about it.
- New cases cover several objects in one scan, a count sitting on
both limits at once, a contradictory pair of limits, and skipping
decided per cluster.
- [BoundaryVoxelPointsAreNotDropped]{.title-ref} is unchanged. It
came from the regression fixed in
#1376.
- Outside the tests, the map key in
[cluster_voxel_grid()]{.title-ref} is renamed from
[voxel_1d_idx]{.title-ref} to [centroid_idx]{.title-ref}.
[getCentroidIndexAt()]{.title-ref} returns an index into the
filtered centroid cloud, not the grid cell index the old name
claimed.
- The README states the assumed range for the two size limits.
- fix(perception): declare the dependencies these packages use (#1371) Each of these packages uses a package it never declares. Either it includes a header of that package, or it names a symbol of it while the header arrives through another dependency. Both build today only because some declared dependency re-exports the owner, so a change in an unrelated repository can break them without anything here changing. The tag follows where the dependency is used: a use in an installed header or in code compiled into the library takes <depend>, one reached only from test/ takes <test_depend>. System libraries are named by the rosdep key this workspace already prefers.
- fix(autoware_euclidean_cluster_object_detector): keep boundary voxel points in their clusters (#1376) The detector recomputed the map key of each voxel from the float coordinates of its centroid. The centroid is a float mean. For points that sit exactly on a cell boundary, this mean rounds to one float step under the boundary. The recomputed key then pointed to the neighbor cell, and the detector dropped the raw points of that voxel. The oversized cluster in VoxelGridBasedEuclideanClusterTest.testcase3 then passed the max_cluster_size check, and the test failed intermittently. Key the map by the centroid index instead. This index is the same value that getCentroidIndexAt() returns for the raw points. Add a deterministic regression test for the boundary case.
- feat: [codecov/refactoring] [euclidean_cluster_object_detector]
Core logic isolation (SECOND HALF)
(#1244)
- added voxel grid cluster into core logic header, and specify a strategy gate to init once at startup
- implemented voxel_grid algorithm into the core logic module, with a nice touch of init once to address Akamine-san concern
- node unification between cluster standard and cluster nvoxel grid with a bunch of diagnostic added
- removed legacy files from old voxel grid structure, now already unified into core logics
- adjusted launch file to reflect new voxel grid locs
- purged voxel_grid relatives from cmakelist
- refactor test_euclidean_cluster_object_detection_integration.cpp test suite
- refactor test_node.cpp test suite
- heavy refactor of test_voxel_grid_based_euclidean_cluster.cpp test suite
- added the weird 2D flattening feature inside the voxel grid clustering
- removed redundant test inside tesdt voxel
- fixedspellcheck error (why Akamine-san's name does not pass the spellcheck?)
- bring back the voxel grid based euclidean cluster node header hpp
- reimplement voxel grid based euclidean cluster node source cpp
- clean up standard node, remove the voxel leaf size delcairation
- reimplemented voxel grid stuffs to CMakeLists
- fixed launch revert back to voxel node
- successfully reverted to the dual-node architecture
- fully reverted to dual nodes, all builds tests good now
- spell check and cpp ckeck diff fix
- feat: [codecov/refactoring] [euclidean_cluster_object_detector]
Core logic isolation (FIRST HALF)
(#1239)
- implemented master params struct for this node new refactoring
- implemented ros_conversions.cpp/.hpp
- implemented euclidean_cluster_object_detector.hpp as the header for core logic, now with only cluster_standard
- implemented euclidean_cluster_object_detector.cpp as the source for core logic, now with only cluster_standard
- euclidean_cluster_node core logic refine, now only with cluster_standard()
File truncated at 100 lines see the full file
Package Dependencies
System Dependencies
| Name |
|---|
| libpcl-all-dev |
Dependant Packages
| Name | Deps |
|---|---|
| autoware_core_perception |
Launch files
- launch/euclidean_cluster.launch.xml
-
- input_pointcloud [default: /sensing/lidar/top/pointcloud_raw]
- input_map [default: /map/pointcloud_map]
- output_clusters [default: clusters]
- use_low_height_cropbox [default: false]
- euclidean_param_path [default: $(find-pkg-share autoware_euclidean_cluster_object_detector)/config/euclidean_cluster.param.yaml]
- use_pointcloud_container [default: false]
- pointcloud_container_name [default: pointcloud_container]
- launch/voxel_grid_based_euclidean_cluster.launch.xml
-
- input_pointcloud [default: /sensing/lidar/top/pointcloud_raw]
- input_map [default: /map/pointcloud_map]
- output_clusters [default: clusters]
- use_low_height_cropbox [default: false]
- voxel_grid_based_euclidean_param_path [default: $(find-pkg-share autoware_euclidean_cluster_object_detector)/config/voxel_grid_based_euclidean_cluster.param.yaml]
- use_pointcloud_container [default: false]
- pointcloud_container_name [default: pointcloud_container]