Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -13,3 +13,9 @@
# limitations under the License.

__pycache__/

# Generated by `dora-openarm-dataset-recorder`.
dataset/

# Generated by `dora run`.
out/
4 changes: 3 additions & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,9 @@ license = { text = "Apache-2.0" }
readme = "README.md"
requires-python = ">=3.11"

dependencies = []
dependencies = [
"dora-rs-cli>=0.4.1",
]

[dependency-groups]
dev = [
Expand Down
227 changes: 227 additions & 0 deletions tests/dataflow.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,227 @@
# Copyright 2026 Enactic, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

nodes:
- id: controller
build: pip install dora-openarm-inference-controller
path: dora-openarm-inference-controller
env:
# Test settings: keep the dataflow running for a few seconds.
# Do NOT use these in production.
# SUCCESS_THRESHOLD: "1.1" is intentionally impossible to prevent early exit.
SUCCESS_THRESHOLD: "1.1"
TIMEOUT: "3"
inputs:
progress_tick: dora/timer/millis/100
arm_right_action: actions-executor/move_position_right
arm_right_observation: arm-right/position
arm_right_status: arm-right/status
camera_wrist_right: camera-wrist-right/image
arm_left_action: actions-executor/move_position_left
arm_left_observation: arm-left/position
arm_left_status: arm-left/status
camera_wrist_left: camera-wrist-left/image
camera_head: camera-head/image
camera_ceiling: camera-ceiling/image
observation: quittable-observer/observation
phase_classifier_result: phase-classifier/result
outputs:
- command
- arm_right_action
- arm_right_observation
- camera_wrist_right
- arm_left_action
- arm_left_observation
- camera_wrist_left
- camera_head
- camera_ceiling
- observation
- phase_classifier_result

- id: quittable-tick-arm
build: pip install dora-openarm-quitter
path: dora-openarm-quitter
inputs:
command: controller/command
# 250Hz
tick: dora/timer/millis/4
outputs:
- tick

- id: quittable-tick-camera
build: pip install dora-openarm-quitter
path: dora-openarm-quitter
inputs:
command: controller/command
# tick: dora/timer/millis/200 # 5Hz
tick: dora/timer/millis/33 # 30fps
outputs:
- tick

- id: quittable-tick-observer
build: pip install dora-openarm-quitter
path: dora-openarm-quitter
inputs:
command: controller/command
# 30Hz
tick: dora/timer/millis/33
outputs:
- tick

- id: arm-right
# DUMMY
build: pip install dora-openarm-dummy
path: dora-openarm-dummy
inputs:
request_position: quittable-tick-arm/tick
move_position: actions-executor/move_position_right
outputs:
- position
- status

- id: camera-wrist-right
# DUMMY
build: pip install dora-openarm-dummy-camera
path: dora-openarm-dummy-camera
env:
ENCODING: "jpeg"
IMAGE_HEIGHT: 600
IMAGE_WIDTH: 960
JPEG_QUALITY: 90
inputs:
tick: quittable-tick-camera/tick
outputs:
- image

- id: arm-left
# DUMMY
build: pip install dora-openarm-dummy
path: dora-openarm-dummy
inputs:
request_position: quittable-tick-arm/tick
move_position: actions-executor/move_position_left
outputs:
- position
- status

- id: camera-wrist-left
# DUMMY
build: pip install dora-openarm-dummy-camera
path: dora-openarm-dummy-camera
env:
ENCODING: "jpeg"
IMAGE_HEIGHT: 600
IMAGE_WIDTH: 960
JPEG_QUALITY: 90
inputs:
tick: quittable-tick-camera/tick
outputs:
- image

- id: camera-head
# DUMMY
build: pip install dora-openarm-dummy-camera
path: dora-openarm-dummy-camera
env:
ENCODING: "jpeg"
IMAGE_HEIGHT: 600
IMAGE_WIDTH: 960
JPEG_QUALITY: 90
inputs:
tick: quittable-tick-camera/tick
outputs:
- image

- id: camera-ceiling
# DUMMY
build: pip install dora-openarm-dummy-camera
path: dora-openarm-dummy-camera
env:
ENCODING: "jpeg"
IMAGE_HEIGHT: 600
IMAGE_WIDTH: 960
JPEG_QUALITY: 90
inputs:
tick: quittable-tick-camera/tick
outputs:
- image

- id: observer
build: pip install dora-openarm-observer
path: dora-openarm-observer
inputs:
tick: quittable-tick-observer/tick
command: controller/command
arm_right: arm-right/position
camera_wrist_right: camera-wrist-right/image
arm_left: arm-left/position
camera_wrist_left: camera-wrist-left/image
camera_head: camera-head/image
camera_ceiling: camera-ceiling/image
phase_classifier_result: phase-classifier/result
outputs:
- observation

- id: quittable-observer
build: pip install dora-openarm-quitter
path: dora-openarm-quitter
inputs:
command: controller/command
observation: observer/observation
outputs:
- observation

- id: policy-server
# DUMMY
build: pip install dora-openarm-dummy-policy-server
path: dora-openarm-dummy-policy-server
inputs:
observation: quittable-observer/observation
outputs:
- actions

- id: actions-executor
build: pip install dora-openarm-actions-executor
path: dora-openarm-actions-executor
inputs:
actions: policy-server/actions
outputs:
- move_position_right
- move_position_left

- id: phase-classifier
# DUMMY
build: pip install dora-openarm-dummy-classifier
path: dora-openarm-dummy-classifier
inputs:
observation: controller/observation
outputs:
- result

- id: recorder
# Run `dora run tests/dataflow.yaml` to create `tests/dataset/` and `tests/out/`.
build: pip install dora-openarm-dataset-recorder
path: dora-openarm-dataset-recorder
inputs:
command:
source: controller/command
queue_size: 5
arm_right_action: controller/arm_right_action
arm_right_observation: controller/arm_right_observation
camera_wrist_right: controller/camera_wrist_right
arm_left_action: controller/arm_left_action
arm_left_observation: controller/arm_left_observation
camera_wrist_left: controller/camera_wrist_left
camera_head: controller/camera_head
camera_ceiling: controller/camera_ceiling