# 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 # 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. # This file is the other half. It needs the network on first build, a pad, and # an arm. # # It is `dataflow-robot.yml` with the probe attached and the console shut, for # the one job the probe exists for: checking that the pad in your hands has the # layout `mapping.py` assumes, against the arm that will actually move. Use # `dataflow-robot.yml` for ordinary driving. # # source .venv/bin/activate # not --uv; README.md says why # dora build dataflow-gamepad.yml # dora run dataflow-gamepad.yml # # `dora run`, not `dora up` + `dora start`: dora 1.0.1 refuses to start a # dataflow holding `git:` nodes from a coordinator — "node joy has git source, # but no `dora build` was run yet", straight after a build that succeeded. It is # the same shape of gap as the `--uv` one above, and it costs this file # `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 debug: enable_debug_inspection: true nodes: - id: joy git: https://gitea.liria.cl/liria/dora-joy.git tag: v0.1.1 build: pip install . path: dora-joy inputs: tick: dora/timer/millis/20 outputs: - joy - id: teleop path: dora-teleop build: pip install . inputs: tick: dora/timer/millis/50 # queue_size 1: joy ticks at 20 ms and this node at 50, so without it the # loop would work through a backlog of readings that have already been # overtaken. An arm should be driven by the newest one or by none. joy: source: joy/joy queue_size: 1 queue_policy: drop_oldest response: ulite6/response motion_state: ulite6/motion_state robot_state: ulite6/robot_state tcp_pose: ulite6/tcp_pose joint_pose: ulite6/joint_pose outputs: - twist - command - jog - request - ui_state env: SPEED_MM_S: "60" SPEED_DEG_S: "30" # Keep the deadman layers ordered: JOY_TTL_S < JOG_TTL_S < the arm's own # 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" # Declared, not spawned: `dora-teleop-probe` attaches to this id when you run # it, and the dataflow runs perfectly well when nobody does. - id: teleop-probe path: dynamic inputs: joy: joy/joy - id: ulite6 git: https://gitea.liria.cl/liria/dora-ulite6.git tag: v0.3.1 build: pip install . path: dora-ulite6 inputs: tick: dora/timer/millis/100 request: teleop/request jog: teleop/jog outputs: - response - motion_state - 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"