Repository navigation
Releases: EdgeFirstAI/fusion
Release list
EdgeFirst Fusion v1.10.0
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-fusionWhat'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/outputand fusion-grid predictions, and of radar cubes with camera frames. Inputs farther apart thanMAX_TEMPORAL_DELTA(MAX_GRID_DELTAfor 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_OFFSETandSTATS_INTERVALsettings. 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), anddelta,grid_delta,waitandlatencysummaries (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.stampon every fusion topic.fusion/model_outputandfusion/model_output/trackedcarry the radar cube stamp (the camera frame stamp for a camera-only model) (EDGEAI-1940) tf_staticis 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_AGEwarns 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_SIZEframes, 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, withNlearned from the distinct DMA-BUF descriptors inCameraFrameand the period from the stamp interval, so it follows the camera service'sCAMERA_BUFFERSand 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_TOPICis 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/trackedwas published by both the radar and lidar threads (EDGEAI-1940)
Full Documentation: https://github.com/EdgeFirstAI/fusion#readme
EdgeFirst Fusion v1.9.0
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-fusionWhat'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.defaultassignments are nowKEY="value"with no spaces around=,
matching other EdgeFirst services. systemdEnvironmentFile=does not strip
those spaces, so the previousKEY = "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_INDEXis documented
infusion.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 usesRestart=always; addRestartPreventExitStatus=1
in the platform unit (meta-maivin) to stop retries. Thefusion/boxes3d
publisher is declared only whenBBOX3D_SRCnames 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 oncopy_from_slice
(EDGEAI-1234) - NEON
sincos_f32returned 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_f32has no callers outside its own tests, so fusion output was
unaffected (EDGEAI-1457) - NEON
atan2_f32returned NaN at the origin, where the min/max reduction
divides0/0, and treatedx = -0.0as positive soatan2(±0.0, -0.0)did
not return±π. Both now matchf32::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 thedeepviewrtCargo
feature. Fusion models are TFLite-only (EDGEAI-733, EDGEAI-1234)
Full Documentation: https://github.com/EdgeFirstAI/fusion#readme
EdgeFirst Fusion v1.8.1
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-fusionWhat'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
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-fusionWhat's Changed
Added
--background-indexCLI (-1= last channel,0..N= explicit) for
semantic-segmentation background skipping (EDGEAI-1106)UNCLASSIFIEDsentinel (u8::MAX) so class0remains 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-schemas4.0.0: messages are immutable CDR views constructed with
Type::from_cdr/Type::builder()...build()?.into_cdr(). Removedserde_cdrand
DmaBuffer; DetectBox/Track fields are flattened (track_id,track_lifetime,
track_createdonDetectBoxView). - Camera ingest uses
edgefirst_msgs/CameraFrametensors (plane 0 handle + pidfd import)
instead ofDmaBuffer. Default--camera-topiciscamera/frame. - Majority-vote class assignment via
ClassHistogramacross a tracklet lifetime
(EDGEAI-1106)
Fixed
- Reject invalid
CameraFramedimensions - 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
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-fusionWhat'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_idnow uses the source sensor frame_id instead ofbase_link_optical
Full Documentation: https://github.com/EdgeFirstAI/fusion#readme
EdgeFirst Fusion v1.7.1
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-fusionWhat's Changed
Fixed
- Output
frame_idonrt/fusion/lidarandrt/fusion/radarnow preserves the source sensor frame_id instead of incorrectly usingbase_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
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-fusionWhat's Changed
Added
- Dynamic projection using
tf_staticcamera transform — camera extrinsics are now resolved from the TF tree instead of hardcoded - Deterministic FNV-1a
track_idhash for stable cross-process track identification - SoA
FusionFramelayout replacingParsedPointAoS for cache-friendly processing - NEON SIMD optimizations for aarch64: vectorized sincos, atan2, magnitude3, and transform+project kernels
- Per-sensor output topics:
rt/fusion/lidarandrt/fusion/radarreplacing sharedrt/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-topicand--boxes2d-topic --model-info-topicfor 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 tort/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-agereplaces--max-mask-agefor unified vision model staleness check- Updated
fusion.defaultwith new topic names and parameters
Removed
--mask-topic,--boxes2d-topicCLI parameters (replaced by--vision-model-topic)--classes-topic,--tracks-topicCLI parameters (replaced by per-sensor--lidar-output-topic,--radar-output-topic)serialize_tracksoutput (tracking data now integrated into per-sensor output)
Full Documentation: https://github.com/EdgeFirstAI/fusion#readme
EdgeFirst Fusion v1.6.0
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-fusionWhat's Changed
Added
instance_idfield (UINT32) in all fusion output PointCloud2 messages for instance-level object identification- boxes2d detection fusion: subscribe to
rt/model/boxes2dtopic and use 2D bounding boxes for point classification with per-instance tracking --boxes2d-topicCLI parameter to configure the boxes2d subscription topic--max-mask-ageCLI parameter to control staleness threshold for mask and boxes2d datafusion.defaultsystemd 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 overridesinsert_standard_fields()helper in pcd.rs to eliminate triplicated field layout code.github/copilot-instructions.mdwith project coding conventionscheckandsbomtargets in Makefile- Unit tests for
parse_box_label,box_fusion_clusteredoverlapping boxes, andbox_fusion_no_cluster
Fixed
- Replaced
.unwrap()calls with defensivematch/if letingrid_nearest_clusterandlate_fusion_clustered parse_box_labelnow logs a warning on invalid input instead of silently returning 0- Clippy warnings: extracted
LoadedFrame/FusionResulttype 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.defaultas a release artifact
Full Documentation: https://github.com/EdgeFirstAI/fusion#readme
EdgeFirst Fusion v1.5.0
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-fusionWhat'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_pointwas overwriting computed x-coordinate with 0.0 - Critical:
munmaperror check using> 0instead of!= 0 - Critical: Missing
MAP_FAILEDvalidation aftermmapcalls - Critical:
min_dist2/min_point_indnot reset per-box ingrid_nearest_point_no_clusterandgrid_nearest_cluster - Critical: PCD deserialization panicking on malformed input instead of returning error
- Critical: Production
assert_eq!inget_3d_bboxreplaced withdebug_assert_eq! - Critical: Dropped
JoinHandlefor TF static publisher task now logs errors - Numerically unstable sigmoid in fusion model post-processing
- Unsafe
libc::memcpyreplaced with safecopy_from_slicein 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_binsresettingfirst_markedto 0 instead ofu128::MAX- Missing
j >= 1andj >= 2guards inmark_grid_one_columnandmark_cell_three_column - Blocking
thread::sleepin async context replaced withtokio::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
deepviewrtCargo feature; default builds are TFLite-only and no longer requirelibdeepview-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()inget_cluster_ids - Return
&[Tracklet]instead of&Vec<Tracklet>from tracker - Gated test-only types behind
#[cfg(test)]in Kalman filter - Removed
workflow_calltrigger from build.yml to prevent redundant builds on tag push
Removed
- Dead
_process_dmabufferfunctions and unused imports from model code - ~100 lines of commented-out test code in fusion_model.rs
- Commented-out debug println statements
BoolDefaultTruetype alias from args
Security
- Added security policy and vulnerability reporting process
Full Documentation: https://github.com/EdgeFirstAI/fusion#readme