diff --git a/.gitignore b/.gitignore index f09bd9e..5d3dbcf 100644 --- a/.gitignore +++ b/.gitignore @@ -13,3 +13,9 @@ # limitations under the License. __pycache__/ + +# Generated by `dora-openarm-dataset-recorder`. +dataset/ + +# Generated by `dora run`. +out/ diff --git a/pyproject.toml b/pyproject.toml index 751c18c..322e6ca 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -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 = [ diff --git a/tests/dataflow.yaml b/tests/dataflow.yaml new file mode 100644 index 0000000..add3f41 --- /dev/null +++ b/tests/dataflow.yaml @@ -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