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数据集上公开结果。

工作原理(管道)

  1. 预处理 – 裁剪到感兴趣区域,移除自我车辆边界框内的点,并降采样(体素网格)。
  2. 地面分割 – 分离地面和非地面点。默认的fast预置使用Patchwork++(最先进的方法)加上高程图细化来处理坡道。
  3. 聚类 – 将非地面点划分为单个对象,使用三种方法之一(高度感知BEV网格、自适应欧几里得或普通欧几里得)。过大的聚类会被分割或报告为结构(例如墙壁、植被)——它们出现在占用栅格中,但不作为移动对象。
  4. 框拟合 – 为每个聚类拟合定向边界框(L形、PCA或轴对齐)。
  5. 跟踪 – 跨帧关联框,分配唯一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。

相关

  • 项目
  • 项目
  • 项目
  • 项目