Skip to main content

dora-openarm-selector

A dora-rs node that receives the same kind of messages from several sources and forwards only the ones from the selected source. You can use it to switch arm commands between VR teleoperation and a policy, for example.

The selected source is the highest-priority one among the enabled sources. This node doesn't look into values, so it depends on neither the robot nor the arm.

Install

pip install dora-openarm-selector

Usage

- id: arm-command-selector
  path: dora-openarm-selector
  args: --sources vr,policy
  inputs:
    vr_enabled: vr-controller/enabled
    vr_right: ik/position_right
    vr_left: ik/position_left
    policy_right: actions-executor/move_position_right
    policy_left: actions-executor/move_position_left
  outputs:
    - right
    - left
    - selected

With this dataflow, policy drives the arms by default. While vr-controller/enabled is true, vr takes over because it has the higher priority.

Arguments

Argument Environment variable Required Description
--sources vr,policy SOURCES Yes Comma-separated source names. Earlier ones have higher priority.

A source name must not contain _. Each source must have at least one input. Inputs of sources that aren't in --sources are ignored. You can use it to select a source by an environment variable for dora run without changing wiring, because dora-rs expands environment variables in env: values:

- id: arm-command-selector
  path: dora-openarm-selector
  env:
    SOURCES: "${TELEOP_SOURCE:-ker}"
  inputs:
    ker_right: leader/follower_position_right
    ker_left: leader/follower_position_left
    webxr_right: ik/position_right
    webxr_left: ik/position_left
  outputs:
    - right
    - left

With this configuration, TELEOP_SOURCE=webxr dora run ... forwards only webxr_* inputs and ker_* inputs are ignored. ker is used when TELEOP_SOURCE isn't set. A misspelled TELEOP_SOURCE such as webrx is rejected at startup because webrx has no input.

Inputs

Input ID Type Description
<source>_<channel> Any Data to forward such as vr_right.
<source>_enabled bool (length 1) true enables the source, false disables it.

You can name channels freely such as right and left. The source of an input ID is the part before the first _. An input ID whose source isn't in --sources is ignored, so a misspelled source in an input ID such as polcy_right isn't detected. The format of an ignored input ID is still checked, so polcy_selected is rejected. enabled is the channel for <source>_enabled input, so it isn't forwarded. selected can't be used as a channel name because it conflicts with selected output.

A source without <source>_enabled input is always enabled. A source with <source>_enabled input is disabled until it receives true. Invalid values such as null are ignored with an error message.

Outputs

Output ID Description
<channel> <source>_<channel> of the selected source as is, with selected_source metadata.
selected The selected source name (string) at startup and whenever it changes. An empty string if no source is selected.

selected_source metadata lets a recorder record which source a command came from. If you don't list selected in outputs:, this node doesn't send it.

Behavior

  1. At startup, only sources without <source>_enabled input are enabled.
  2. Every <source>_enabled input selects the highest-priority enabled source again.
  3. Only <source>_<channel> of the selected source is forwarded to <channel>. Others are dropped.
  4. Switching doesn't resend previous values. Forwarding starts from the next message from the newly selected source.
  5. Nothing is forwarded while no source is selected.
  6. When <source>_enabled input is closed, for example because its upstream node exits, the source is disabled. When all <source>_<channel> inputs of a source are closed, the source is never selected. Otherwise it would block lower-priority sources forever.

Example

example/dataflow-mujoco.yaml teleoperates OpenArm in a MuJoCo simulation (dora-openarm-mujoco) with KER or WebXR. Both of them are always running, so you need a KER connected via USB and a TLS certificate for WebXR. TELEOP_SOURCE environment variable selects which one moves the arms.

Generate a self-signed TLS certificate into example/ with example/prepare_tls.sh. Pass a host name that your VR device can resolve. See dora-openarm-webxr's setup for details.

example/prepare_tls.sh $(hostname).local

Then build and run the dataflow:

pip install dora-rs-cli
dora build example/dataflow-mujoco.yaml
# KER moves the arms. KER is the default.
TELEOP_SOURCE=ker dora run example/dataflow-mujoco.yaml
# WebXR moves the arms.
TELEOP_SOURCE=webxr dora run example/dataflow-mujoco.yaml

To use WebXR, open https://$(hostname).local:8443/ in the Web browser on your VR device and press the "Start" button.

License

Licensed under the Apache License 2.0. See LICENSE for details.

Copyright 2026 Enactic, Inc.

Code of Conduct

All participation in the OpenArm project is governed by our Code of Conduct.

Metadata

Release files for dora-openarm-selector 0.1.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for dora-openarm-selector 0.1.0
File Size Uploaded
dora_openarm_selector-0.1.0.tar.gz 12.2 kB Details

Release files / dora_openarm_selector-0.1.0.tar.gz

Download URL dora_openarm_selector-0.1.0.tar.gz
Size 12.2 kB
Tags Source
SHA-256 checksum
How to use checksums
7d461309555cbd0cee4b0d4b3a25409e893801d1af224bb9dad72efad44c91d3
BLAKE2b-256 checksum
How to use checksums
8f5876a88923b632f7de7e796fa6be0e4cd5e2abedf4f4bb6e4a5149c28a8bf8
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 8, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.1.0 This release

1 release file

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page