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.
This commit is contained in:
+35
-8
@@ -7,33 +7,60 @@
|
||||
apiVersion: 1
|
||||
name: dora-zed
|
||||
namespace: liria
|
||||
description: ZED stereo camera source publishing a BGR image, a depth map, intrinsics and an optional point cloud
|
||||
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: Each tick triggers one camera grab. Connect to dora/timer/millis/N.
|
||||
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_bgr:
|
||||
type: std/core/v1/UInt8
|
||||
description: BGR image bytes, [H, W, 3]. Shape and encoding are in the metadata.
|
||||
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/core/v1/Float32
|
||||
description: Per-pixel depth in millimetres, [H, W]. Missing depth is 0, never inf or nan.
|
||||
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. Published only when ZED_POINT_CLOUD is on.
|
||||
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
|
||||
|
||||
Reference in New Issue
Block a user