• v0.2.0 86b7a1a8f7

    v0.2.0 — Pure camera source on dora 1.0
    validate / validate (push) Successful in 59m0s
    Stable

    cristhian released this 2026-09-08 15:07:03 +00:00 | 5 commits to main since this release

    dora-zed is now a pure camera source. Detection has left the node, depth is a first-class output, timestamps can be correlated across nodes, and the camera runs on its own thread so a disconnect never freezes the dataflow.

    Requires dora 1.0+ (verified against dora-cli 1.0.1) and no longer requires ONNX Runtime.

    Breaking changes

    Upgrading from v0.1.0 needs dataflow and configuration changes:

    • objects output removed. Detection is gone from this node. The native (ZED SDK TensorRT) and yolo_onnx engines and their src/engines/ sources remain reachable at tag v0.1.0. zed_native cannot be extracted — it binds to the live camera handle and cannot run in a node that receives images over a dataflow.
    • git_checkout: is no longer valid. dora 1.0 pins a source with the mutually exclusive tag:, rev: or branch:.
    • The build command changed to scripts/build.sh. dora 1.0 runs build commands directly rather than through a shell, so mkdir -p build && cd build && cmake .. && make install no longer works.
    • Environment variables removed: ZED_ENGINE, ZED_DETECTION_MODEL, ZED_DETECTION_CONFIDENCE, ZED_DETECTION_TRACKING, all ZED_ONNX_*, and ZED_RETRY_INTERVAL_SECONDS (replaced by a backoff).
    • ZED_PC_MODE=ROI removed. It cropped the cloud to detected bounding boxes. FULL and HALF remain.
    • point_cloud is now off by default. Set ZED_POINT_CLOUD to publish it. Consumers needing 3D should back-project depth with the published intrinsics instead — at 1080p a full cloud is ~14.7 MB per frame.
    • camera_info is published once per camera session, not per frame: with the first frame after the camera opens, and again after a reconnection.
    • timestamp_ns metadata replaced by device_timestamp_ns and host_timestamp_ns, both Unix-epoch nanoseconds as dora timestamp parameters.
    • Defaults changed to match the reference driver perception was tuned against: ZED_RESOLUTION 720 → 1080, ZED_DEPTH_MIN_MM 10 → 200, ZED_DEPTH_MAX_MM 500 → 600.

    New

    • depth output — float32 [H, W] in millimetres on every frame that carries image_bgr. Missing depth is 0; the payload contains no inf or nan.
    • camera_state output — opening / streaming / recovering, published on each change, so a downstream node can tell "no frame yet" from "camera lost".
    • dora-node.yml manifest declaring a type for every port, plus strict_types: true in the dataflow and a dora validate CI gate that needs no camera and no ZED SDK.
    • All six depth modes reachable — NEURAL, NEURAL_PLUS, NEURAL_LIGHT, PERFORMANCE, QUALITY, NONE. An unrecognised value is now a startup error listing the accepted values, instead of silently falling back to NEURAL.
    • ZED_CONFIDENCE_THRESHOLD (60) and ZED_TEXTURE_CONFIDENCE_THRESHOLD (100), which were previously never set.
    • Builds on Jetson: ONNX Runtime is no longer a configure-time requirement, and there is no official ARM64 GPU binary for it.

    Fixed

    • The camera no longer blocks the dora event loop. The ZED SDK can block indefinitely inside grab() and open() on a disconnected camera — InitParameters::async_grab_camera_recovery does not prevent this, measured on a ZED-M under SDK 5.3. The camera now runs on its own thread and the event loop only reads the newest frame, so Stop stays answerable however long the SDK blocks. Recovery uses a 1/2/5/10 s backoff, escalating from close() to sl::Camera::reboot() (guarded to the ZED 2 and newer, where that call does anything).
    • Frame timestamps are comparable. steady_clock's epoch is unspecified, so the old value could not be compared against another node, wall clock, or a recording — and recorded when the node processed the frame rather than when the camera captured it.
    • Blank frames are not published. A camera whose link has dropped can keep reporting successful grabs while handing back a uniform frame.

    Verified

    Built and run on a Jetson (aarch64) against a ZED-M, ZED SDK 5.3, dora-cli 1.0.1:

    14:58:45  camera state: recovering          <- cable pulled
    14:59:11  camera delivered no usable frame for 30.0131s
    14:59:11  attempt 1; next open in 1s → 2s → 5s → 10s (capped)
    15:01:03  ZED camera opened (ZED-M, SN 18688272)   <- cable replugged
    15:01:05  camera recovered after 13 attempt(s)
    15:01:05  camera state: streaming
    

    Unplugging leaves the node responsive, replugging resumes publishing without restarting the dataflow, and dora stop with the camera unplugged returns in 0.70 s with the capture thread joining gracefully.

    Known limitations

    • Escalation to sl::Camera::reboot() is untested on hardware: it is guarded to the ZED 2 and newer, and testing was done on a ZED-M where the call is deliberately skipped.
    • Blank-frame suppression was not exercised directly — the disconnected camera failed its grabs rather than returning uniform frames.
    • The example dataflow.yml includes a dora-hub plot node whose pip install fails on hosts with PEP 668 (externally-managed-environment). That is the third-party node, not this one.

    Closes #9, #10, #11, #12, #13, #14, #15, #16.

    Downloads