Files
dora-zed/dora-node.yml
cristhian c1a7d70ba6 add typed Arrow payloads and a dora-image-view dataflow
dora-image-view takes std/media/v1/Image, and dora's compatibility graph
has no edge from std/core/v1/UInt8 to it, so wiring the two failed
`dora validate` whatever the node actually sent. Its flat-buffer fallback
would not have decoded these frames either: it reads width/height
metadata, and this node only published shape.

image and depth now go out as the Image struct, camera_info and
point_cloud as Float32 arrays and camera_state as a string, all built
against the Arrow C data interface in src/arrow so the node still links
no Arrow C++. Shape, dtype and encoding metadata are dropped where the
payload describes itself; intrinsics, frame_id and both timestamps are
unchanged. tests/run.sh covers the packing without a camera or the SDK,
round-tripping each array through pyarrow and rebuilding it under the
sanitizers.

Breaking: image_bgr is renamed to image and every payload changes shape.
dataflow_plot.yml is replaced by dataflow_view.yml, which wires the
viewer from a tag and repeats its contract in input_types so validate
checks both sides of the wiring.
2026-09-15 10:52:08 -05:00

67 lines
2.3 KiB
YAML

# Node manifest: the typed contract a consumer wires against.
#
# No source package is shared between node repositories, so this file and its
# type URNs are the only contract a consumer has. `dora validate` checks a
# dataflow against it without running the node, so CI needs no camera and no
# ZED SDK.
apiVersion: 1
name: dora-zed
namespace: liria
description: ZED stereo camera source publishing an image, a depth map, intrinsics and an optional point cloud
categories: [sensor]
keywords: [zed, stereolabs, camera, depth, stereo, jetson]
runtime: cpp
entrypoint: bin/dora_zed
build: scripts/build.sh
dora: ">=1.0"
inputs:
tick:
type: std/core/v1/UInt64
required: true
description: >-
Publishes the newest frame the capture thread has grabbed, or nothing if
none arrived since the last tick. It does not drive the camera: capture is
free-running at ZED_FPS, so this sets the publish rate and anything
captured between two ticks is dropped. Connect to dora/timer/millis/N.
outputs:
image:
type: std/media/v1/Image
description: >-
Captured frame as an Arrow struct {width, height, encoding, data}. The
encoding is always bgr8, three bytes per pixel.
depth:
type: std/media/v1/Image
description: >-
Depth map as an Arrow struct {width, height, encoding, data}, one channel
per pixel -- dora has no depth type, and a depth map is an image whose
pixels are distances, which is how ROS spells it too. The encoding is
32FC1 and the `units` metadata is mm. Missing depth is 0, never inf or
nan.
camera_info:
type: std/core/v1/Float32
description: Intrinsics [fx, fy, cx, cy], distortion in the metadata. Published once per camera session.
point_cloud:
type: std/core/v1/Float32
description: XYZRGBA point cloud, shape in the metadata. Published only when ZED_POINT_CLOUD is on.
camera_state:
type: std/core/v1/String
description: One of opening, streaming, recovering. Published on every change.
example: |
- id: zed-camera
git: https://gitea.liria.cl/liria/dora-zed.git
tag: v0.3.0
build: scripts/build.sh
path: bin/dora_zed
inputs:
tick: dora/timer/millis/100
outputs:
- image
- depth
- point_cloud
- camera_info
- camera_state