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. クラスタリング – 非地面点を個々のオブジェクトに分割します。3つの方法(高さ対応BEVグリッド、適応ユークリッド、プレーンなユークリッド)があります。大きすぎるクラスタは分割されるか、構造物(例:壁、植生)として報告されます。これらは占有グリッドには表示されますが、移動オブジェクトとしては扱われません。
  4. ボックスフィッティング – 各クラスタに方向付き境界ボックス(L字、PCA、または軸平行)をフィットさせます。
  5. トラッキング – フレーム間でボックスを対応付け、一意のIDを割り当て、速度を推定し、(移動車両の場合)移動方向から進行方向を導出します。

プリセット

プリセット 地面手法 クラスタリング ボックスフィッティング トラッキング 用途
fast(デフォルト) Patchwork++ BEVグリッド(高さ対応) L字 カルマン + 移動方向 ほとんどのロボットや車両
accurate Patchwork++ 適応ユークリッド L字 カルマン + 移動方向 最大リコール、計算量は2〜4倍
legacy RANSAC ユークリッド 軸平行 カルマン v1の動作を再現(バグなし)

ベンチマークのハイライト(READMEより)

Argoverse 2(32ビームLiDARデータセット)での結果:

  • fastプリセットは、1つのCPUコアで1スキャンあたり7.5 ms(約95kポイント)で動作し、Recall@1mは0.66(真値ボックスから1m以内で発見されたオブジェクトの割合)です。
  • accurateはリコールを0.70に向上させますが、約32 msかかります。
  • トラッキングは以前の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で1スキャンあたり約15 msで動作します。幾何学的検出器とCenterPointを組み合わせたhybridモードもあり、ネットワークがトレーニングされていない障害物も含めてすべてを維持します。

パラメータ

すべてのパラメータはrqt_reconfigureまたはros2 param setでライブ変更できます。主なものは以下の通りです:

  • roi_{min,max}_{x,y,z} – 関心領域。
  • sensor_height – 地上からのLiDARの高さ(地面セグメンテーションで使用)。
  • cluster_threshold – 1つのオブジェクトのポイント間の最大ギャップ。
  • object_max_length / object_max_width – より大きなクラスタは分割されるか、構造物として扱われます。
  • occupancy_min_height / max_height – 占有としてカウントされる高さ帯。

ライセンスと入手可能性

MITライセンスで、同梱のPatchwork++コードはBSD-2-Clauseです。リポジトリにはユニットテスト、3つのROSバージョン向けCI、再現可能なベンチマークパイプラインが含まれています。

上記の事実はすべてプロジェクトのREADMEから直接引用しています。

関連

  • プロジェクト
  • プロジェクト
  • プロジェクト
  • プロジェクト