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.5ms(약 95k 포인트)로 실행되며 Recall@1m이 0.66(정답 상자에서 1m 이내에서 발견된 객체 비율)입니다.accurate는 재현율을 0.70으로 높이지만 약 32ms가 걸립니다.- 추적은 이전 v1보다 훨씬 안정적입니다: ID 전환은 11,822에서 1,725로 감소(fast), IDF1 점수(ID 인식 F1)는 0.20에서 0.73으로 향상.
- 객체 점이 지면으로 잘못 분류되는 비율이 25%에서 5%로 감소.
설치 및 사용법
ROS 2(Humble, Jazzy)와 ROS 1(Noetic)을 지원합니다. colcon(ROS 2) 또는 catkin(ROS 1)으로 빌드합니다. 시스템 ROS 설치 없이 실행할 수 있는 pixi 환경도 제공됩니다.
실행 예제(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에서 스캔당 약 15ms로 실행됩니다. 기하학적 탐지기와 CenterPoint를 결합하는 hybrid 모드도 있어 네트워크가 훈련되지 않은 장애물을 포함한 모든 장애물을 유지합니다.
매개변수
모든 매개변수는 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에서 직접 가져온 것입니다.
관련
- 프로젝트
- 프로젝트
- 프로젝트
- 프로젝트