• v0.3.0 ff6a87f084

    v0.3.0 — Typed Arrow payloads
    validate / validate (push) Successful in 58m48s
    validate / test (push) Successful in 58m55s
    Stable

    cristhian released this 2026-09-15 16:14:39 +00:00 | 0 commits to main since this release

    Every payload this node publishes is now a typed Arrow array. That is what makes it consumable by dora-image-view, which takes std/media/v1/Image — and what the old flat byte buffers could not satisfy at any setting: dora's compatibility graph has no edge from std/core/v1/UInt8 to std/media/v1/Image, so the wiring failed dora validate whatever the node actually sent.

    Requires dora 1.0+ (verified against dora-cli 1.0.1).

    Breaking changes

    Upgrading from v0.2.0 needs dataflow and consumer changes:

    • image_bgr is renamed to image. Update outputs: and anything wired to it.
    • image and depth are std/media/v1/Image — an Arrow struct of width: UInt32, height: UInt32, encoding: Utf8 and data: LargeBinary, not a flat buffer. image is bgr8; depth is 32FC1, one float32 per pixel, still millimetres with 0 for missing and no inf or nan.
    • camera_info and point_cloud are Float32 arrays and camera_state a UTF-8 string, rather than raw bytes that only claimed those types in the manifest. A consumer reinterpreting a UInt8 buffer as floats now gets floats directly.
    • Metadata the payload now carries itself is gone: shape, dtype, layout and encoding on image and depth; dtype, layout and shape on camera_info; dtype on point_cloud; dtype and encoding on camera_state. units=mm stays on depth, and shape, channels and units stay on point_cloud, which is a flat array with no self-describing grid. Intrinsics (fx, fy, cx, cy, distortion), frame_id and both timestamps are unchanged on every output.
    • dataflow_plot.yml is replaced by dataflow_view.yml, which wires dora-image-view instead of the dora-hub opencv-plot node. That also retires the PEP 668 pip install failure listed under v0.2.0's known limitations: the viewer builds with uv pip install . under dora run --uv.

    New

    • src/arrow packs every payload against the Arrow C data interface, so the node exports typed Arrow arrays without linking Arrow C++ — which would put libarrow on every build machine, Jetson included. Payload bytes are borrowed rather than copied: dora IPC-encodes the array into shared memory inside send_arrow_output and then calls the release callbacks.
    • tests/run.sh — the first test suite here that needs no camera, no ZED SDK and no CUDA. Each exported array is round-tripped through pyarrow's C data interface to check the values a consumer reads back, and rebuilt under the address and undefined-behaviour sanitizers to check that releasing one frees the whole tree. CI runs it beside dora validate.
    • dataflow_view.yml — the camera into dora-image-view on image, depth and camera_info. A git: node's manifest is not read at validate time, so the file repeats the viewer's contract in input_types:, which gets both sides of the wiring checked before anything runs.

    Fixed

    • The documented tick behaviour was wrong. A tick does not trigger a grab: capture is free-running at ZED_FPS on its own thread, and a tick forwards the newest frame there is. The tick therefore sets the publish rate, never the capture rate — the default 100 ms tick against the default 15 fps keeps two frames out of every three, while dora/timer/millis/66 forwards all of them. Corrected in the README, dora-node.yml and AGENTS.md.
    • The usage snippet listed four of the five outputs, which read as an omission rather than the choice it is.
    • The README is a quarter shorter and follows the shape of the sibling node repositories.

    Verified

    • tests/run.sh passes, and the leak check was confirmed to fail when the release callback is broken.
    • dora validate (dora-cli 1.0.1) passes on both dataflows, and fails as expected when the manifest is reverted to std/core/v1/UInt8.
    • src/main.cc compiles against the generated dora-node-api.h and the ZED SDK headers.

    Known limitations

    • Not yet run against hardware. The full build and an end-to-end dataflow_view.yml run are outstanding: the machine this was prepared on has no OpenCV, which src/zed/capture.cc needs, so scripts/build.sh stops at configure there. Everything above the SDK is covered by the tests; the camera path is not.
    • dataflow_view.yml pins the viewer at v0.1.0, the newest tag published for dora-image-view. Its README advertises v0.1.1, which is not pushed yet.
    Downloads
  • 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
  • v0.1.0 748b0c3665

    v0.1.0 Stable

    cristhian released this 2026-03-29 19:22:02 +00:00 | 25 commits to main since this release

    First release.

    Features

    • ZED stereo camera capture with configurable resolution, FPS, and depth mode
    • Modular detection engine architecture
    • Native ZED SDK TensorRT object detection (ZED_ENGINE=native)
    • Open-vocabulary YOLO-World detection via ONNX Runtime with CLIP text encoder (ZED_ENGINE=open_vocab)
    • Runtime label updates via update_vocabulary dora input
    • Point cloud output with bandwidth control (ZED_PC_MODE: FULL / HALF / ROI)
    • Dora dataflow outputs: image_bgr, point_cloud, camera_info, objects
    • Install scripts for Ubuntu 24.04 x86_64 and NVIDIA Jetson ARM64
    Downloads