fix the gamepad layout and refuse a pad the node cannot read #5

Merged
cristhian merged 3 commits from fix/gamepad-layout-and-pad-calibration into main 2026-09-16 21:09:32 +00:00
3 changed files with 63 additions and 31 deletions
Showing only changes of commit eede2e5774 - Show all commits
+57 -26
View File
@@ -1,23 +1,29 @@
# The same bench, with a real gamepad and a probe. # The pad, a real arm and the probe. No bench and no browser.
# #
# `dataflow.yml` is what CI validates, and it deliberately has no pad in it: the # `dataflow.yml` is what CI validates, and it deliberately has no pad in it: the
# pad is `dora-joy`, another repo, and pulling it in by `git:` would cost that # pad is `dora-joy`, another repo, and pulling it in by `git:` would cost that
# file its one property — that it resolves and runs from this checkout alone. # file its one property — that it resolves and runs from this checkout alone.
# This file is the other half. It needs the network on first build, and a pad. # This file is the other half. It needs the network on first build, a pad, and
# an arm.
# #
# The bench answers services and publishes telemetry but never moves anything. # It is `dataflow-robot.yml` with the probe attached and the console shut, for
# What this is for is watching the node decide: the lease changing hands, the # the one job the probe exists for: checking that the pad in your hands has the
# deadman firing when you let go, and the arm being stopped when the pad — or # layout `mapping.py` assumes, against the arm that will actually move. Use
# the node reading it — goes away. # `dataflow-robot.yml` for ordinary driving.
# #
# Run it under a coordinator rather than `dora run`, so `dora topic` can read the # source .venv/bin/activate # not --uv; README.md says why
# wire and so the probe has something to attach to: # dora build dataflow-gamepad.yml
# dora run dataflow-gamepad.yml
# #
# dora up # `dora run`, not `dora up` + `dora start`: dora 1.0.1 refuses to start a
# dora start dataflow-gamepad.yml --uv --name teleop-bench # dataflow holding `git:` nodes from a coordinator — "node joy has git source,
# dora-teleop-probe # in another terminal # but no `dora build` was run yet", straight after a build that succeeded. It is
# dora topic echo -d teleop-bench teleop/jog # the same shape of gap as the `--uv` one above, and it costs this file
# dora stop --name teleop-bench && dora down # `dora topic`, which needs a coordinator to read the wire.
#
# ROBOT_IP and TOOL_TYPE below name the arm in front of you: the bench arm at
# 192.168.1.162, with a vacuum tool. Read
# `The gamepad` in README.md before picking it up — Back is the E-STOP.
strict_types: true strict_types: true
@@ -47,10 +53,11 @@ nodes:
source: joy/joy source: joy/joy
queue_size: 1 queue_size: 1
queue_policy: drop_oldest queue_policy: drop_oldest
response: bench/response response: ulite6/response
robot_state: bench/robot_state motion_state: ulite6/motion_state
tcp_pose: bench/tcp_pose robot_state: ulite6/robot_state
joint_pose: bench/joint_pose tcp_pose: ulite6/tcp_pose
joint_pose: ulite6/joint_pose
outputs: outputs:
- twist - twist
- command - command
@@ -60,8 +67,13 @@ nodes:
env: env:
SPEED_MM_S: "60" SPEED_MM_S: "60"
SPEED_DEG_S: "30" SPEED_DEG_S: "30"
# This one is about the pad, so the console stays shut. Set a port to # Keep the deadman layers ordered: JOY_TTL_S < JOG_TTL_S < the arm's own
# bring it up alongside and watch the lease move between the two. # VELOCITY_COMMAND_TTL_S, which is 0.5 s below. Each backs up the one
# inside it, and a backstop that fires first backs up nothing.
JOY_TTL_S: "0.2"
JOG_TTL_S: "0.4"
# This one is about the pad, so the console stays shut and no port is
# opened. `dataflow-robot.yml` is the one that serves it.
WEB_PORT: "0" WEB_PORT: "0"
# Declared, not spawned: `dora-teleop-probe` attaches to this id when you run # Declared, not spawned: `dora-teleop-probe` attaches to this id when you run
@@ -71,15 +83,34 @@ nodes:
inputs: inputs:
joy: joy/joy joy: joy/joy
- id: bench - id: ulite6
path: examples/bench.py git: https://gitea.liria.cl/liria/dora-ulite6.git
tag: v0.3.1
build: pip install .
path: dora-ulite6
inputs: inputs:
tick: dora/timer/millis/200 tick: dora/timer/millis/100
jog: teleop/jog
request: teleop/request request: teleop/request
ui_state: teleop/ui_state jog: teleop/jog
outputs: outputs:
- response - response
- robot_state - motion_state
- tcp_pose
- joint_pose - joint_pose
- tcp_pose
- robot_state
# dora type-checks before it fetches a `git:` source, so it cannot read the
# arm's own manifest from here. These three repeat what `dora-ulite6`
# v0.3.1 annotates; `response` and `motion_state` stay untyped there and so
# stay untyped here. Re-check them when moving to a new tag.
output_types:
joint_pose: std/core/v1/Float32
tcp_pose: std/core/v1/Float32
robot_state: std/core/v1/String
env:
ROBOT_IP: "192.168.1.162"
TOOL_TYPE: "vacuum"
# The outermost deadman, enforced by the controller whether or not any of
# this is alive. Every timer above must stay below it.
VELOCITY_COMMAND_TTL_S: "0.5"
# The pad does not home. Nothing moves until somebody pushes a stick.
INIT_MODE: "none"
+3 -3
View File
@@ -16,8 +16,8 @@
# then looks for its entrypoint in this dataflow's venv instead. README.md has the # then looks for its entrypoint in this dataflow's venv instead. README.md has the
# detail. `dataflow.yml` has no `git:` nodes and is fine with --uv. # detail. `dataflow.yml` has no `git:` nodes and is fine with --uv.
# #
# Set ROBOT_IP and TOOL_TYPE below to match the arm in front of you. The # ROBOT_IP and TOOL_TYPE below name the arm in front of you: the bench arm at
# defaults are `dora-ulite6`'s own: 192.168.1.192 and a vacuum tool. # 192.168.1.162, with a vacuum tool.
# #
# The web console comes with the node: it serves the page and holds the # The web console comes with the node: it serves the page and holds the
# browsers' sockets itself, so `http://<this machine>:7000` is a second way to # browsers' sockets itself, so `http://<this machine>:7000` is a second way to
@@ -102,7 +102,7 @@ nodes:
tcp_pose: std/core/v1/Float32 tcp_pose: std/core/v1/Float32
robot_state: std/core/v1/String robot_state: std/core/v1/String
env: env:
ROBOT_IP: "192.168.1.192" ROBOT_IP: "192.168.1.162"
TOOL_TYPE: "vacuum" TOOL_TYPE: "vacuum"
# The outermost deadman, enforced by the controller whether or not any of # The outermost deadman, enforced by the controller whether or not any of
# this is alive. Every timer above must stay below it. # this is alive. Every timer above must stay below it.
+3 -2
View File
@@ -5,8 +5,9 @@
# manifest from `path:` and CI needs no gamepad, no robot and no sibling clones. # manifest from `path:` and CI needs no gamepad, no robot and no sibling clones.
# #
# There is **no gamepad here**, because the pad is another node and wiring it in # There is **no gamepad here**, because the pad is another node and wiring it in
# by `git:` would cost this file the one property it has. For a real pad on a # by `git:` would cost this file the one property it has. For a real pad, use
# real bench, use `dataflow-gamepad.yml`. # `dataflow-robot.yml`, or `dataflow-gamepad.yml` to check the pad with the
# probe — both of which drive a real arm.
# #
# This is **not** the real stack. The bench answers services and publishes # This is **not** the real stack. The bench answers services and publishes
# telemetry but never moves anything. README.md carries the four-node wiring a # telemetry but never moves anything. README.md carries the four-node wiring a