Skip to content

Releases: EdgeFirstAI/fusion

EdgeFirst Fusion v1.10.0

Choose a tag to compare

@github-actions github-actions released this 02 Oct 04:49
93a6779

EdgeFirst Fusion v1.10.0

Installation

Download Binaries

Platform Binary
Linux x86_64 edgefirst-fusion-linux-x86_64
Linux ARM64 edgefirst-fusion-linux-aarch64
# Download and install (ARM64 example)
wget https://github.com/EdgeFirstAI/fusion/releases/download/v1.10.0/edgefirst-fusion-linux-aarch64
chmod +x edgefirst-fusion-linux-aarch64
sudo mv edgefirst-fusion-linux-aarch64 /usr/local/bin/edgefirst-fusion

What's Changed

Timestamp contract and temporal alignment: every fusion output carries its source acquisition stamp, and fusion pairs inputs by stamp instead of by arrival (EDGEAI-1940).

Added

  • Stamp-based pairing of point clouds with model/output and fusion-grid predictions, and of radar cubes with camera frames. Inputs farther apart than MAX_TEMPORAL_DELTA (MAX_GRID_DELTA for the grid) are skipped with a warning naming the topics, repeated at most once per stats interval (EDGEAI-1940)
  • SYNC_WAIT, MAX_TEMPORAL_DELTA, MAX_GRID_DELTA, MODEL_BUFFER_SIZE, CAMERA_BUFFER_SIZE, RADAR_TIME_OFFSET, LIDAR_TIME_OFFSET and STATS_INTERVAL settings. Non-finite or out-of-range values and buffer sizes below 1 are rejected at startup (EDGEAI-1940)
  • Periodic pairing statistics per pipeline: paired, too_far, missing, grid_too_far, grid_missing (point-cloud lines), stale (cube and camera line, frames skipped as too old to read), and delta, grid_delta, wait and latency summaries (EDGEAI-1940)
  • Warnings when the radar cube or camera topic stops publishing to a radar and camera model, with backoff (EDGEAI-1940)

Changed

  • The Zenoh sample timestamp equals header.stamp on every fusion topic. fusion/model_output and fusion/model_output/tracked carry the radar cube stamp (the camera frame stamp for a camera-only model) (EDGEAI-1940)
  • tf_static is stamped with the time of each 1 Hz republish (EDGEAI-1940)
  • Tracker lifetimes use the monotonic clock. Buffers clear, and the grid tracker resets, when input stamps step back (EDGEAI-1940)
  • The grid tracker runs once per grid in the fusion-model thread (EDGEAI-1940)
  • MAX_MODEL_AGE warns when the newest model output was received more than the limit ago (EDGEAI-1940)
  • With a radar and camera model, a dedicated thread converts camera frames on arrival into a ring of CAMERA_BUFFER_SIZE frames, and each radar cube is paired with the nearest frame by stamp. Frames received more than 2 s ago are never paired (EDGEAI-1940)
  • Camera frames that arrive after their capture buffer may have been overwritten are skipped instead of converted. The limit is (N - 1) frame periods less a margin, with N learned from the distinct DMA-BUF descriptors in CameraFrame and the period from the stamp interval, so it follows the camera service's CAMERA_BUFFERS and frame rate. While it is being learned the limit uses the buffers and shortest interval seen so far, so it never overstates the window (EDGEAI-1940)
  • Model-output pairing is skipped when VISION_MODEL_TOPIC is empty (EDGEAI-1940)

Fixed

  • The grid tracker re-ingested the same grid on every point cloud (EDGEAI-1940)
  • Grid and centroid tracks shared one tracker (EDGEAI-1940)
  • Model outputs were dropped while fusion was classifying (EDGEAI-1940)
  • fusion/model_output/tracked was published by both the radar and lidar threads (EDGEAI-1940)

Full Documentation: https://github.com/EdgeFirstAI/fusion#readme

EdgeFirst Fusion v1.9.0

Choose a tag to compare

@github-actions github-actions released this 16 Sep 04:06
12fa19a

EdgeFirst Fusion v1.9.0

Installation

Download Binaries

Platform Binary
Linux x86_64 edgefirst-fusion-linux-x86_64
Linux ARM64 edgefirst-fusion-linux-aarch64
# Download and install (ARM64 example)
wget https://github.com/EdgeFirstAI/fusion/releases/download/v1.9.0/edgefirst-fusion-linux-aarch64
chmod +x edgefirst-fusion-linux-aarch64
sudo mv edgefirst-fusion-linux-aarch64 /usr/local/bin/edgefirst-fusion

What's Changed

TFLite-only fusion models, aligned fusion.default quoting and stock radar
defaults, and NEON math fixes for radar angle binning (EDGEAI-733, EDGEAI-1234,
EDGEAI-1457).

Changed

  • fusion.default assignments are now KEY="value" with no spaces around =,
    matching other EdgeFirst services. systemd EnvironmentFile= does not strip
    those spaces, so the previous KEY = "value" form may not have been applied
    (EDGEAI-733, EDGEAI-1234)
  • Stock radar late-fusion defaults: RADAR_PCD_TOPIC=radar/clusters,
    BBOX3D_SRC=radar. LiDAR remains opt-in. BACKGROUND_INDEX is documented
    in fusion.default (EDGEAI-733, EDGEAI-1604)
  • CameraFrame fourcc is mapped to G2D the same way the camera service maps HAL
    format strings (YUYV → G2D_YUYV). Fusion no longer routes fourcc through
    G2DFormat::try_from(FourCharCode), which mis-read YUYV as VYUY
    (EDGEAI-1234)

Fixed

  • Fusion exits with an error (instead of exit 0) when no model and no PCD
    topic is configured, so the idle case is visible in the journal. The
    shipped unit still uses Restart=always; add RestartPreventExitStatus=1
    in the platform unit (meta-maivin) to stop retries. The fusion/boxes3d
    publisher is declared only when BBOX3D_SRC names an enabled PCD topic
    (EDGEAI-1234)
  • Fusion-model input tensors are identified by name. A camera-only model no
    longer treats the RGB tensor as radar and panics on copy_from_slice
    (EDGEAI-1234)
  • NEON sincos_f32 returned an inverted cosine for |x| mod 2π in
    [3π/4, 7π/4) on aarch64. The Cephes quadrant sign mask selected bit 1 of
    ~(emm2 - 2) instead of bit 2, flipping the sign over half the circle while
    leaving sine correct. Cosine is now accurate to ~1 ULP in every quadrant.
    sincos_f32 has no callers outside its own tests, so fusion output was
    unaffected (EDGEAI-1457)
  • NEON atan2_f32 returned NaN at the origin, where the min/max reduction
    divides 0/0, and treated x = -0.0 as positive so atan2(±0.0, -0.0) did
    not return ±π. Both now match f32::atan2. This path is used for radar
    angle binning, so origin-valued points no longer poison their lane
    (EDGEAI-1457)

Removed

  • DeepView RT (.rtm) fusion-model support and the deepviewrt Cargo
    feature. Fusion models are TFLite-only (EDGEAI-733, EDGEAI-1234)

Full Documentation: https://github.com/EdgeFirstAI/fusion#readme

EdgeFirst Fusion v1.8.1

Choose a tag to compare

@github-actions github-actions released this 08 Sep 13:58
427f9d3

EdgeFirst Fusion v1.8.1

Installation

Download Binaries

Platform Binary
Linux x86_64 edgefirst-fusion-linux-x86_64
Linux ARM64 edgefirst-fusion-linux-aarch64
# Download and install (ARM64 example)
wget https://github.com/EdgeFirstAI/fusion/releases/download/v1.8.1/edgefirst-fusion-linux-aarch64
chmod +x edgefirst-fusion-linux-aarch64
sudo mv edgefirst-fusion-linux-aarch64 /usr/local/bin/edgefirst-fusion

What's Changed

Patch release for EDGEAI-1094. Argument parsing only; no wire-format or
configuration-key changes from 1.8.0.

Fixed

  • Empty environment variables in /etc/default/fusion (KEY="") are now
    treated as unset so the documented default applies instead of failing to
    start. The documented "leave empty to disable" topics (LIDAR_OUTPUT_TOPIC,
    RADAR_OUTPUT_TOPIC, VISION_MODEL_TOPIC, MODEL_INFO_TOPIC) keep their
    empty value (EDGEAI-1094)

Full Documentation: https://github.com/EdgeFirstAI/fusion#readme

EdgeFirst Fusion v1.8.0

Choose a tag to compare

@github-actions github-actions released this 31 Aug 15:11
a6d31f0

EdgeFirst Fusion v1.8.0

Installation

Download Binaries

Platform Binary
Linux x86_64 edgefirst-fusion-linux-x86_64
Linux ARM64 edgefirst-fusion-linux-aarch64
# Download and install (ARM64 example)
wget https://github.com/EdgeFirstAI/fusion/releases/download/v1.8.0/edgefirst-fusion-linux-aarch64
chmod +x edgefirst-fusion-linux-aarch64
sudo mv edgefirst-fusion-linux-aarch64 /usr/local/bin/edgefirst-fusion

What's Changed

Added

  • --background-index CLI (-1 = last channel, 0..N = explicit) for
    semantic-segmentation background skipping (EDGEAI-1106)
  • UNCLASSIFIED sentinel (u8::MAX) so class 0 remains a valid model label
    (EDGEAI-1106)

Changed

  • Attach a Zenoh source timestamp on published fusion and tf_static
    samples so the recorder can use publisher time instead of receive time.
  • Set the Zenoh session namespace to the system hostname and drop the rt/
    prefix from default key expressions. Wire keys are {hostname}/fusion/…
    and {hostname}/tf_static (EDGEAI-1396).
  • Migrated to edgefirst-schemas 4.0.0: messages are immutable CDR views constructed with
    Type::from_cdr / Type::builder()...build()?.into_cdr(). Removed serde_cdr and
    DmaBuffer; DetectBox/Track fields are flattened (track_id, track_lifetime,
    track_created on DetectBoxView).
  • Camera ingest uses edgefirst_msgs/CameraFrame tensors (plane 0 handle + pidfd import)
    instead of DmaBuffer. Default --camera-topic is camera/frame.
  • Majority-vote class assignment via ClassHistogram across a tracklet lifetime
    (EDGEAI-1106)

Fixed

  • Reject invalid CameraFrame dimensions
  • Unrecognized box labels skipped instead of silently mapping to class 0
    (EDGEAI-1106)

Full Documentation: https://github.com/EdgeFirstAI/fusion#readme

EdgeFirst Fusion v1.7.2

Choose a tag to compare

@github-actions github-actions released this 10 Mar 23:15
v1.7.2
6234846

EdgeFirst Fusion v1.7.2

Installation

Download Binaries

Platform Binary
Linux x86_64 edgefirst-fusion-linux-x86_64
Linux ARM64 edgefirst-fusion-linux-aarch64
# Download and install (ARM64 example)
wget https://github.com/EdgeFirstAI/fusion/releases/download/v1.7.2/edgefirst-fusion-linux-aarch64
chmod +x edgefirst-fusion-linux-aarch64
sudo mv edgefirst-fusion-linux-aarch64 /usr/local/bin/edgefirst-fusion

What's Changed

Fixed

  • Removed erroneous base_link transform that was modifying point XYZ coordinates — fusion output now preserves original sensor-frame coordinates unchanged
  • bbox3d output frame_id now uses the source sensor frame_id instead of base_link_optical

Full Documentation: https://github.com/EdgeFirstAI/fusion#readme

EdgeFirst Fusion v1.7.1

Choose a tag to compare

@github-actions github-actions released this 10 Mar 20:36
v1.7.1
71932bf

EdgeFirst Fusion v1.7.1

Installation

Download Binaries

Platform Binary
Linux x86_64 edgefirst-fusion-linux-x86_64
Linux ARM64 edgefirst-fusion-linux-aarch64
# Download and install (ARM64 example)
wget https://github.com/EdgeFirstAI/fusion/releases/download/v1.7.1/edgefirst-fusion-linux-aarch64
chmod +x edgefirst-fusion-linux-aarch64
sudo mv edgefirst-fusion-linux-aarch64 /usr/local/bin/edgefirst-fusion

What's Changed

Fixed

  • Output frame_id on rt/fusion/lidar and rt/fusion/radar now preserves the source sensor frame_id instead of incorrectly using base_link — the fusion output XYZ coordinates are unchanged from the source PCD

Changed

  • Updated ARCHITECTURE.md to clarify that fusion projection does not modify point coordinates

Full Documentation: https://github.com/EdgeFirstAI/fusion#readme

EdgeFirst Fusion v1.7.0

Choose a tag to compare

@github-actions github-actions released this 10 Mar 16:58
v1.7.0
bf7b17b

EdgeFirst Fusion v1.7.0

Installation

Download Binaries

Platform Binary
Linux x86_64 edgefirst-fusion-linux-x86_64
Linux ARM64 edgefirst-fusion-linux-aarch64
# Download and install (ARM64 example)
wget https://github.com/EdgeFirstAI/fusion/releases/download/v1.7.0/edgefirst-fusion-linux-aarch64
chmod +x edgefirst-fusion-linux-aarch64
sudo mv edgefirst-fusion-linux-aarch64 /usr/local/bin/edgefirst-fusion

What's Changed

Added

  • Dynamic projection using tf_static camera transform — camera extrinsics are now resolved from the TF tree instead of hardcoded
  • Deterministic FNV-1a track_id hash for stable cross-process track identification
  • SoA FusionFrame layout replacing ParsedPoint AoS for cache-friendly processing
  • NEON SIMD optimizations for aarch64: vectorized sincos, atan2, magnitude3, and transform+project kernels
  • Per-sensor output topics: rt/fusion/lidar and rt/fusion/radar replacing shared rt/fusion/classes
  • Dynamic track_id(u32) in late-fusion output — detected at runtime from model output, expands PCD layout from 16 to 20 bytes/point
  • Unified --vision-model-topic (rt/model/output) replacing separate --mask-topic and --boxes2d-topic
  • --model-info-topic for dynamic label resolution from model service
  • Conditional grid publisher — only created when fusion model is configured

Changed

  • Sensor input topics (--lidar-pcd-topic, --radar-pcd-topic) now default to empty (disabled); set to rt/lidar/points, rt/lidar/clusters, etc. to enable each fusion pipeline
  • Late-fusion output uses compact vision_class(u16) + instance_id(u16) layout (16 bytes/point, was 24 bytes/point with u8 + u8 + u32 + cluster_id) for natural alignment and reduced bandwidth
  • --max-model-age replaces --max-mask-age for unified vision model staleness check
  • Updated fusion.default with new topic names and parameters

Removed

  • --mask-topic, --boxes2d-topic CLI parameters (replaced by --vision-model-topic)
  • --classes-topic, --tracks-topic CLI parameters (replaced by per-sensor --lidar-output-topic, --radar-output-topic)
  • serialize_tracks output (tracking data now integrated into per-sensor output)

Full Documentation: https://github.com/EdgeFirstAI/fusion#readme

EdgeFirst Fusion v1.6.0

Choose a tag to compare

@github-actions github-actions released this 26 Feb 22:36
v1.6.0
ef2229e

EdgeFirst Fusion v1.6.0

Installation

Download Binaries

Platform Binary
Linux x86_64 edgefirst-fusion-linux-x86_64
Linux ARM64 edgefirst-fusion-linux-aarch64
# Download and install (ARM64 example)
wget https://github.com/EdgeFirstAI/fusion/releases/download/v1.6.0/edgefirst-fusion-linux-aarch64
chmod +x edgefirst-fusion-linux-aarch64
sudo mv edgefirst-fusion-linux-aarch64 /usr/local/bin/edgefirst-fusion

What's Changed

Added

  • instance_id field (UINT32) in all fusion output PointCloud2 messages for instance-level object identification
  • boxes2d detection fusion: subscribe to rt/model/boxes2d topic and use 2D bounding boxes for point classification with per-instance tracking
  • --boxes2d-topic CLI parameter to configure the boxes2d subscription topic
  • --max-mask-age CLI parameter to control staleness threshold for mask and boxes2d data
  • fusion.default systemd EnvironmentFile documenting all configuration options
  • Behind-camera projection guard: points behind the camera are explicitly set out-of-bounds instead of producing invalid projections
  • Monotonic clock staleness warnings for mask and boxes2d data
  • Args::normalize() for handling empty-string environment variable overrides
  • insert_standard_fields() helper in pcd.rs to eliminate triplicated field layout code
  • .github/copilot-instructions.md with project coding conventions
  • check and sbom targets in Makefile
  • Unit tests for parse_box_label, box_fusion_clustered overlapping boxes, and box_fusion_no_cluster

Fixed

  • Replaced .unwrap() calls with defensive match/if let in grid_nearest_cluster and late_fusion_clustered
  • parse_box_label now logs a warning on invalid input instead of silently returning 0
  • Clippy warnings: extracted LoadedFrame/FusionResult type aliases for complex return types

Changed

  • Upgraded zenoh dependency from 1.5.1 to 1.7.2
  • Updated NOTICE file with current dependency versions
  • Updated documentation (README.md, ARCHITECTURE.md, TESTING.md) with boxes2d topic, instance_id field, and max_mask_age parameter
  • Release workflow now includes fusion.default as a release artifact

Full Documentation: https://github.com/EdgeFirstAI/fusion#readme

EdgeFirst Fusion v1.5.0

Choose a tag to compare

@github-actions github-actions released this 15 Feb 20:49
v1.5.0
f41f7e2

EdgeFirst Fusion v1.5.0

Installation

Download Binaries

Platform Binary
Linux x86_64 edgefirst-fusion-linux-x86_64
Linux ARM64 edgefirst-fusion-linux-aarch64
# Download and install (ARM64 example)
wget https://github.com/EdgeFirstAI/fusion/releases/download/v1.5.0/edgefirst-fusion-linux-aarch64
chmod +x edgefirst-fusion-linux-aarch64
sudo mv edgefirst-fusion-linux-aarch64 /usr/local/bin/edgefirst-fusion

What's Changed

Added

  • Initial open source release
  • Complete GitHub Actions CI/CD workflows (test, build, SBOM, release)
  • GitHub issue templates (bug report, feature request, hardware compatibility)
  • Pull request template with comprehensive checklist
  • TESTING.md with unit test and integration testing guidance
  • Occupancy grid section in ARCHITECTURE.md
  • rust-version = "1.82" in Cargo.toml
  • Named constants for magic numbers (MAX_CLASSIFICATION_DISTANCE, UNINITIALIZED_COORD)
  • Convergence assertions in Kalman filter tests

Fixed

  • Critical: draw_point was overwriting computed x-coordinate with 0.0
  • Critical: munmap error check using > 0 instead of != 0
  • Critical: Missing MAP_FAILED validation after mmap calls
  • Critical: min_dist2/min_point_ind not reset per-box in grid_nearest_point_no_cluster and grid_nearest_cluster
  • Critical: PCD deserialization panicking on malformed input instead of returning error
  • Critical: Production assert_eq! in get_3d_bbox replaced with debug_assert_eq!
  • Critical: Dropped JoinHandle for TF static publisher task now logs errors
  • Numerically unstable sigmoid in fusion model post-processing
  • Unsafe libc::memcpy replaced with safe copy_from_slice in TFLite and DeepView RT model code
  • Flood fill row boundary checks preventing horizontal neighbor wrap-around
  • Box2D width/height calculation had erroneous / 2.0
  • clear_bins resetting first_marked to 0 instead of u128::MAX
  • Missing j >= 1 and j >= 2 guards in mark_grid_one_column and mark_cell_three_column
  • Blocking thread::sleep in async context replaced with tokio::time::sleep
  • Release workflow silently skipping missing build artifacts; now fails on missing artifacts
  • Typos: centriods -> centroids, represetns -> represents, indicies -> indices

Changed

  • Feature-gated DeepView RT support behind deepviewrt Cargo feature; default builds are TFLite-only and no longer require libdeepview-rt.so
  • Migrated repository from Bitbucket to GitHub
  • Updated license to Apache-2.0
  • Renamed project from Maivin Fusion to EdgeFirst Fusion
  • Switched g2d-sys to crates.io v1.2.0 (removed local crate)
  • Updated tflitec-sys metadata for open source compliance
  • Updated edgefirst-schemas to v1.5.3 with CDR serialization migration
  • Updated NOTICE file format for SBOM validation
  • Rust version badge updated from 1.70 to 1.82 in README
  • Documentation links updated from /maivin/ to /perception
  • RadarCube type corrected in ARCHITECTURE.md
  • Idiomatic entry().or_default().push() in get_cluster_ids
  • Return &[Tracklet] instead of &Vec<Tracklet> from tracker
  • Gated test-only types behind #[cfg(test)] in Kalman filter
  • Removed workflow_call trigger from build.yml to prevent redundant builds on tag push

Removed

  • Dead _process_dmabuffer functions and unused imports from model code
  • ~100 lines of commented-out test code in fusion_model.rs
  • Commented-out debug println statements
  • BoolDefaultTrue type alias from args

Security

  • Added security policy and vulnerability reporting process

Full Documentation: https://github.com/EdgeFirstAI/fusion#readme