cuCONERUSH is a GPU-first ROS 2 package for real-time LiDAR cones detection.
The runtime package name is cuda_cone_rush.
The processing pipeline stays on CUDA buffers across stages:
PointCloud2 -> optional XYZ filter -> optional ground segmentation -> optional voxel clustering -> cone markers
[cuda_cone_rush_node-1] [WARN] [1775749308.140774720] [cuda_cone_rush_node]: Not enough points for clustering (0 < 1)
[cuda_cone_rush_node-1] terminate called after throwing an instance of 'thrust::THRUST_200500_520_NS::system::system_error'
[cuda_cone_rush_node-1] what(): parallel_for failed: cudaErrorInvalidDevice: invalid device ordinal
[ERROR] [cuda_cone_rush_node-1]: process has died [pid 8233, exit code -6, cmd '/home/orin/ros2_dev/install/cuda_cone_rush/lib/cuda_cone_rush/cuda_cone_rush_node --ros-args -r __node:=cuda_cone_rush_node --params-file /home/orin/ros2_dev/install/cuda_cone_rush/share/cuda_cone_rush/config/config.yaml'].
| Lidar Points | Board | avg exec (ms) |
|---|---|---|
| 128K | Orin Nano Super | 10ms |
| 128K | Orin Dev 2048 cuda | 5ms |
| 128K | RTX 4060 Mobile 3072 cuda | 1.1ms |
- CUDA passthrough filtering (
cuda_filtering) - CUDA RANSAC ground segmentation (
cuda_segmentation) - CUDA voxel clustering + cone dimension filtering (
cuda_clustering+cluster_filtering) - Two point cloud conversion backends:
- CUDA backend (
src/utils/cuda_pointcloud_converter.cu) - CPU backend (
src/utils/pointcloud_converter.cpp)
- CUDA backend (
- Optional performance logging to ROS topic (
LOGGER_PUB)
- ROS 2 Humble
- CUDA Toolkit
- PCL
ament_cmake
From your workspace root:
cd ~/ros2_ws
colcon build --packages-select cuda_cone_rush
source install/setup.bashThese options are available in CMakeLists.txt:
| Option | Default | Description |
|---|---|---|
ENABLE_VERBOSE |
OFF |
Prints processing timings to stdout |
LATENCY_TESTING |
OFF |
Print latency information for each BARQ callback |
USE_CUDA_POINTCLOUD_CONVERTER |
ON |
Uses CUDA converter instead of CPU converter |
USE_PINNED_MEMORY |
ON on x86, OFF otherwise |
Enables pinned host memory for host/device transfers |
NSIGHT_SDK |
OFF |
Set an execution limit for NVIDIA Nsight Systems profiling |
Example:
colcon build --packages-select cuda_cone_rush --cmake-args -DENABLE_VERBOSE=ON -LATENCY_TESTING=ONcd ~/ros2_ws
source install/setup.bash
ros2 launch cuda_cone_rush cudaconerush.launch.pyParameters are loaded from config/config.yaml under /cuda_cone_rush_node.
input_topicfiltered_topicsegmented_topiccluster_topicframe_id
minClusterSizemaxClusterSizevoxelXvoxelYvoxelZcountThreshold
clusterMaxX,clusterMaxY,clusterMaxZclusterMinX,clusterMinY,clusterMinZmaxHeight
downFilterLimitX,upFilterLimitXdownFilterLimitY,upFilterLimitYdownFilterLimitZ,upFilterLimitZ
distanceThresholdmaxSegmentationDistancemaxIterationsprobability
filterpublishFilteredPcsegmentpublishSegmentedPcclusteringpublishClusterlimitWarning_ms
Subscriptions:
input_topic(sensor_msgs/msg/PointCloud2)
Publications:
filtered_topic(sensor_msgs/msg/PointCloud2) whenpublishFilteredPc=truesegmented_topic(sensor_msgs/msg/PointCloud2) whenpublishSegmentedPc=truecluster_topic(visualization_msgs/msg/Marker) whenpublishCluster=true/logger/clustering/time(std_msgs/msg/Float64) when compiled withLOGGER_PUB=ON
src/
main.cpp
controller_node.cu
filtering/cuda_filtering.cu
segmentation/cuda_segmentation.cu
clustering/cuda_clustering.cu
clustering/cluster_filtering/dimension_filter.cpp
utils/cuda_pointcloud_converter.cu
utils/pointcloud_converter.cpp
include/cuda_cone_rush/
controller_node.hpp
filtering/
segmentation/
clustering/
utils/
Apache-2.0