SS47816/lidar_obstacle_detector
Real-time 3D LiDAR obstacle detection, tracking & trajectory prediction for ROS 1 / ROS 2: ground segmentation, clustering, 2.5D occupancy, optional GPU CenterPoint (TensorRT). ~10 ms/scan on one CPU core.
功能概述
这个C++库处理3D LiDAR扫描(sensor_msgs/PointCloud2消息),以实时检测和跟踪障碍物(车辆、行人、墙壁等)。它支持ROS 1和ROS 2,并在单个CPU核心上运行——无需GPU(尽管存在可选的GPU模式)。输出包括定向边界框、对象ID、速度和占用栅格,可用于Nav2或Autoware等导航栈。
主要特性
- 地面分割 – 将地面点与物体分离,即使在坡道和路缘上也能工作(使用Patchwork++算法)。
- 聚类 – 将障碍物点分组为对象。
- 框拟合 – 为每个对象拟合定向边界框。
- 多对象跟踪 – 分配ID、估计速度,并使用卡尔曼滤波器+匈牙利匹配预测未来位置。
- 占用栅格 – 构建自由/占用空间的2D网格和3D体素云,可直接用于代价地图。
- 无需训练数据 – 默认管道是几何的、无模型的;可选的NVIDIA GPU检测器可以添加类别标签。
- 可复现基准 – 在Argoverse 2和nuScenes数据集上公开结果。
工作原理(管道)
- 预处理 – 裁剪到感兴趣区域,移除自我车辆边界框内的点,并降采样(体素网格)。
- 地面分割 – 分离地面和非地面点。默认的
fast预置使用Patchwork++(最先进的方法)加上高程图细化来处理坡道。 - 聚类 – 将非地面点划分为单个对象,使用三种方法之一(高度感知BEV网格、自适应欧几里得或普通欧几里得)。过大的聚类会被分割或报告为结构(例如墙壁、植被)——它们出现在占用栅格中,但不作为移动对象。
- 框拟合 – 为每个聚类拟合定向边界框(L形、PCA或轴对齐)。
- 跟踪 – 跨帧关联框,分配唯一ID,估计速度,并且(对于移动车辆)从运动推导航向方向。
预置
| 预置 | 地面方法 | 聚类 | 框拟合 | 跟踪 | 用途 |
|---|---|---|---|---|---|
fast(默认) |
Patchwork++ | BEV网格(高度感知) | L形 | 卡尔曼 + 运动航向 | 大多数机器人和车辆 |
accurate |
Patchwork++ | 自适应欧几里得 | L形 | 卡尔曼 + 运动航向 | 最佳召回率,2–4倍计算量 |
legacy |
RANSAC | 欧几里得 | 轴对齐 | 卡尔曼 | 模拟v1行为(无其缺陷) |
基准亮点(来自README)
在Argoverse 2(32线激光雷达数据集)上:
fast预置在单个CPU核心上以每扫描7.5毫秒(约95k点)运行,并达到Recall@1m为0.66(在地面真值框1米内找到的对象比例)。accurate将召回率提高到0.70,但需要约32毫秒。- 跟踪比之前的v1版本稳定得多:ID切换从11,822降至1,725(fast),IDF1得分(身份感知F1)从0.20提高到0.73。
- 错误分类为地面的对象点比例从25%降至5%。
安装与使用
支持ROS 2(Humble、Jazzy)和ROS 1(Noetic)。使用colcon(ROS 2)或catkin(ROS 1)构建。还提供了pixi环境,无需系统安装ROS即可运行。
启动示例(ROS 2):
ros2 launch lidar_obstacle_detector obstacle_detector.launch.py points:=/velodyne_points
发布诸如~/detections(带跟踪ID的框)、~/markers(用于RViz)、~/occupancy(栅格)等话题。
可选GPU检测器
通过使用-DLOD_WITH_TENSORRT=ON构建,可以使用NVIDIA的CUDA‑CenterPoint——一个训练好的神经网络,添加类别标签(汽车、行人等)和完整航向角。它在RTX 3090 Ti上每扫描约15毫秒运行。还存在hybrid模式,将几何检测器与CenterPoint结合,保留所有障碍物,包括网络未训练过的障碍物。
参数
所有参数都可以通过rqt_reconfigure或ros2 param set实时更改。关键参数包括:
roi_{min,max}_{x,y,z}– 感兴趣区域。sensor_height– 激光雷达离地高度(用于地面分割)。cluster_threshold– 同一对象点之间的最大间隙。object_max_length/object_max_width– 更大的聚类将被分割或视为结构。occupancy_min_height/max_height– 被视为占用的高度带。
许可与可用性
MIT许可,附带Patchwork++代码为BSD-2-Clause。仓库包含单元测试、针对三个ROS版本的CI,以及可复现的基准管道。
以上所有事实均直接来自项目README。
相关
- 项目
- 项目
- 项目
- 项目