-
released this
2026-09-15 16:14:39 +00:00 | 0 commits to main since this releaseEvery 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 fromstd/core/v1/UInt8tostd/media/v1/Image, so the wiring faileddora validatewhatever the node actually sent.Requires dora 1.0+ (verified against
dora-cli 1.0.1).Breaking changes
Upgrading from
v0.2.0needs dataflow and consumer changes:image_bgris renamed toimage. Updateoutputs:and anything wired to it.imageanddeptharestd/media/v1/Image— an Arrow struct ofwidth: UInt32,height: UInt32,encoding: Utf8anddata: LargeBinary, not a flat buffer.imageisbgr8;depthis32FC1, one float32 per pixel, still millimetres with0for missing and noinfornan.camera_infoandpoint_cloudare Float32 arrays andcamera_statea 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,layoutandencodingonimageanddepth;dtype,layoutandshapeoncamera_info;dtypeonpoint_cloud;dtypeandencodingoncamera_state.units=mmstays ondepth, andshape,channelsandunitsstay onpoint_cloud, which is a flat array with no self-describing grid. Intrinsics (fx,fy,cx,cy,distortion),frame_idand both timestamps are unchanged on every output. dataflow_plot.ymlis replaced bydataflow_view.yml, which wires dora-image-view instead of the dora-hubopencv-plotnode. That also retires the PEP 668pip installfailure listed under v0.2.0's known limitations: the viewer builds withuv pip install .underdora run --uv.
New
src/arrowpacks 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 insidesend_arrow_outputand 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 besidedora validate.dataflow_view.yml— the camera into dora-image-view onimage,depthandcamera_info. Agit:node's manifest is not read at validate time, so the file repeats the viewer's contract ininput_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_FPSon 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, whiledora/timer/millis/66forwards all of them. Corrected in the README,dora-node.ymland 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.shpasses, 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 tostd/core/v1/UInt8.src/main.cccompiles against the generateddora-node-api.hand the ZED SDK headers.
Known limitations
- Not yet run against hardware. The full build and an end-to-end
dataflow_view.ymlrun are outstanding: the machine this was prepared on has no OpenCV, whichsrc/zed/capture.ccneeds, soscripts/build.shstops at configure there. Everything above the SDK is covered by the tests; the camera path is not. dataflow_view.ymlpins the viewer atv0.1.0, the newest tag published for dora-image-view. Its README advertisesv0.1.1, which is not pushed yet.
Downloads
-
v0.2.0 — Pure camera source on dora 1.0
Stablevalidate / validate (push) Successful in 59m0sreleased this
2026-09-08 15:07:03 +00:00 | 5 commits to main since this releasedora-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.0needs dataflow and configuration changes:objectsoutput removed. Detection is gone from this node. Thenative(ZED SDK TensorRT) andyolo_onnxengines and theirsrc/engines/sources remain reachable at tagv0.1.0.zed_nativecannot 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 exclusivetag:,rev:orbranch:.- The build command changed to
scripts/build.sh. dora 1.0 runs build commands directly rather than through a shell, somkdir -p build && cd build && cmake .. && make installno longer works. - Environment variables removed:
ZED_ENGINE,ZED_DETECTION_MODEL,ZED_DETECTION_CONFIDENCE,ZED_DETECTION_TRACKING, allZED_ONNX_*, andZED_RETRY_INTERVAL_SECONDS(replaced by a backoff). ZED_PC_MODE=ROIremoved. It cropped the cloud to detected bounding boxes.FULLandHALFremain.point_cloudis now off by default. SetZED_POINT_CLOUDto publish it. Consumers needing 3D should back-projectdepthwith the published intrinsics instead — at 1080p a full cloud is ~14.7 MB per frame.camera_infois published once per camera session, not per frame: with the first frame after the camera opens, and again after a reconnection.timestamp_nsmetadata replaced bydevice_timestamp_nsandhost_timestamp_ns, both Unix-epoch nanoseconds as doratimestampparameters.- Defaults changed to match the reference driver perception was tuned against:
ZED_RESOLUTION720 → 1080,ZED_DEPTH_MIN_MM10 → 200,ZED_DEPTH_MAX_MM500 → 600.
New
depthoutput —float32 [H, W]in millimetres on every frame that carriesimage_bgr. Missing depth is0; the payload contains noinfornan.camera_stateoutput —opening/streaming/recovering, published on each change, so a downstream node can tell "no frame yet" from "camera lost".dora-node.ymlmanifest declaring a type for every port, plusstrict_types: truein the dataflow and adora validateCI 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 toNEURAL. ZED_CONFIDENCE_THRESHOLD(60) andZED_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()andopen()on a disconnected camera —InitParameters::async_grab_camera_recoverydoes 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, soStopstays answerable however long the SDK blocks. Recovery uses a 1/2/5/10 s backoff, escalating fromclose()tosl::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: streamingUnplugging leaves the node responsive, replugging resumes publishing without restarting the dataflow, and
dora stopwith 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.ymlincludes a dora-hubplotnode whosepip installfails on hosts with PEP 668 (externally-managed-environment). That is the third-party node, not this one.
Downloads
-
v0.1.0 Stable
released this
2026-03-29 19:22:02 +00:00 | 25 commits to main since this releaseFirst 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_vocabularydora 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