# scan\_detection\_fusion — LiDAR + camera fusion library for ROS 2 Jazzy

**URL:** <https://discourse.openrobotics.org/t/scan-detection-fusion-lidar-camera-fusion-library-for-ros-2-jazzy/56944>\
**Category:** Packaging and Release Management\
**Tags:** release, ros2, lidar, jazzy\
**Created:** [July 25, 2026, 1:47am UTC](https://discourse.openrobotics.org/t/scan-detection-fusion-lidar-camera-fusion-library-for-ros-2-jazzy/56944 "2026-07-25T01:47:39Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![HexboxRC](https://avatars.discourse-cdn.com/v4/letter/h/8e7dd6/32.png) [@HexboxRC](https://discourse.openrobotics.org/u/HexboxRC)\
**Post date:** [July 25, 2026, 1:47am UTC](https://discourse.openrobotics.org/t/scan-detection-fusion-lidar-camera-fusion-library-for-ros-2-jazzy/56944/1 "2026-07-25T01:47:39Z")

</div>

Hi ROS community,

I’m a high school student and wanted to share a package I’ve just released into the Jazzy distribution: **scan\_detection\_fusion** , a reusable ROS 2 library that fuses 2D LiDAR scans with camera object detections to produce range-resolved, semantically labeled obstacles and class-aware ground footprints for navigation.

**The problem it solves:** a monocular detector knows _what_ an object is and roughly _which direction_ it lies, but not how far away it is. A 2D LiDAR knows precise distance at every bearing but nothing about what it’s seeing. This package marries the two — matching each detection’s bearing to LiDAR returns in that direction, estimating a robust range, projecting to the map frame, and publishing both a labeled object registry and reconstructed `PolygonStamped` footprints for Nav2’s obstacle layer.

**Install:**  
sudo apt install ros-jazzy-scan-detection-fusion

**wo contributions beyond baseline fusion:**

- **Semantic zone routing** — LiDAR sampling is directed to the vertical region where a given class actually intersects the scan plane, so range estimates reflect the physical object rather than background
- **Class-aware footprint reconstruction** — each obstacle gets a W×D ground polygon oriented to the line of sight, with width refined from the observed LiDAR arc when evidence supports it

**Interface:** subscribes to `vision_msgs/Detection2DArray` and `sensor_msgs/LaserScan`, publishes a JSON object registry, `visualization_msgs/MarkerArray` for RViz, and `geometry_msgs/PolygonStamped` per object for Nav2. All topic names and frames are parameters so it drops into existing graphs without remapping. `camera_info` is used for pixel→angle conversion when available, with an `hfov_deg` fallback.

The algorithm lives in a ROS-free `LidarCameraFuser` class so it can be unit tested and reused without a ROS graph — 32-test pytest suite included, CI on every push.

This came out of the **SmartCane** project, an AI-powered assistive navigation device for visually impaired users. The fusion pipeline is described in a paper submitted to IEEE WF-PST.

Source: [GitHub - HexboxRC/scan\_detection\_fusion: LiDAR-Camera Fusion for ROS2 · GitHub](https://github.com/HexboxRC/scan_detection_fusion)  
Index: [scan\_detection\_fusion - ROS Package Overview](https://index.ros.org/p/scan_detection_fusion)

Feedback, issues, and PRs welcome — especially if you’re running it on a robot with a different detector or LiDAR setup.
