DEBUG

Default console tab. Four-step left column — prompt → config → setup → control — drives one closed-loop policy run; right side streams the live 3D arm, cameras, and action/state charts. Run modes: REAL, SIM, STEP.

Four-step workflow on the left, live 3D arm and cameras on the right.

Prerequisites

bash
eva --config <path-to-your-config> --web-port 8080
# then open http://localhost:8080
Note: One unified console; DEBUG and the other five tabs share the same UI and the same launch command. See CLI reference.

Overview

DEBUG is the first of six console tabs (DEBUG·MANUAL·COLLECT·REPLAY·EVAL·RESULT) and runs one closed-loop inference: connect to the policy server, request actions, dispatch to robot or sim, and stream telemetry back.

Four-step workflow

Four numbered panels in the left column, top to bottom. The guide bar shows STEP n/4. Each step unlocks the next.

#PanelAction
1PROMPTPick a task prompt from the config-provided list.
2CONFIGPick run mode (REAL / SIM / STEP) and strategy (see Strategies).
3SETUPRuns automatically after steps 1–2. Connects the policy, resets the arm to home, validates with one inference.
4CONTROLRUN / STOP / RESET (continuous) or SIM ↻ / REAL ▶ / STOP / RESET (STEP). Enabled only after Setup succeeds.
Note: Setup is auto-triggered, not a button. RETRY appears only when the policy server is unreachable.

Reading Setup status

UI stateMeaningAction
Spinner with sub-stages (connect, reset, validate)In progressWait.
CONTROL unlocked; policy indicator LINKEDSuccessProceed to Control.
Policy indicator DOWN; RETRY visiblePolicy server unreachableVerify server + IP/port, click RETRY.

The LINKED / DOWN indicator also sits permanently in the right-hand status bar.

Note: Setup is fail-fast — one attempt, no auto-retry. This prevents a down server from freezing the console.

Run modes

Three modes in step 2, SIM by default. MANUAL has its own top-level tab.

ModeBehavior
REALDispatches actions to the real robot, mirrored to the sim preview, and records executed actions. Resets the arm to home first.
SIMSimulation only — 3D arm moves, real robot does not. Setup skips the reset.
STEPBreakpoint single-step: infer and execute one chunk at a time, previewed in sim, dispatched to the real robot on confirm. See next section.

A stopped REAL or SIM run resumes from the arm's current actual pose, not from the start.

Warning: REAL moves the real robot and resets it to home first. Clear the work area and locate the emergency stop before starting.

STEP: breakpoint single-stepping

STEP replaces continuous RUN/STOP with a preview-then-commit flow. After Setup succeeds:

  1. SIM ↻ — infer one chunk and animate it on the sim arm; the chunk is staged.
  2. Inspect the sim preview. Banner reads "SIM preview done · N actions · press REAL ▶ to dispatch".
  3. REAL ▶ — dispatch the staged chunk to the real robot; staging clears. The 3D view stays on the sim result.
  4. STOP ■ / RESET ⟲ behave as in continuous mode.

The preview always runs in sim first; there is no skip-sim path.

Note: STEP also works in REPLAY. There, SIM ↻ dispatches the next recorded chunk instead of querying the policy.

Live stage

Right side, three auto-refreshed regions, nothing to operate.

Below the stage: transport online, policy LINKED/DOWN, session state, last inference time, step count, elapsed time.

Note: "Transport online" requires data received within the last 2 s. An open channel with no traffic still reads offline — it reflects flow, not link state.

Gripper control and tuning

The GRIPPER panel exposes one open/close switch per gripper: GRIPPER for single-arm, LEFT / RIGHT for dual-arm.

Each switch has a force lock:

TUNING adjusts inference parameters live without restart: inference rate (Hz), publish rate (Hz), and the active strategy's tunable fields. APPLY takes effect on the next cycle; a running strategy updates in place.

Note: APPLY changes only the running parameters; edits are not persisted to the config file and are lost on restart.

Config for the DEBUG

DEBUG shares the console's .py config — no DEBUG-only file. The prompt list, selectable strategies, and tuning defaults all come from this file. Fields first, then a minimal skeleton.

FieldSetsNotes
policy.typePolicy backende.g. openpi. See Backends.
policy.host / policy.portPolicy server addressMust match the running policy server.
inference_cfg.debug_tasksPrompt list (step 1)List of prompt strings shown in PROMPT.
inference_strategiesStrategy options (step 2)Each key is one option. See Strategies.
inference_cfg.inference_rateTUNING "inference rate" default (Hz)Live-tunable.
inference_cfg.publish_rateTUNING "publish rate" default (Hz)Live-tunable.
inference_cfg.action_space / obs_spaceAction / observation spaceJointState or EEFPose; sets chart dimensions. See Action spaces.

Minimal DEBUG config skeleton. _base_ inherits a parent that already sets robot and transport; only DEBUG-related fields are overridden here. "← fill in" / "← change" mark required edits.

python
_base_ = ['_base.py']              # inherit parent (robot + transport)

policy = dict(
    type='openpi',                   # backend: openpi / starvla / gr00t / ...
    host='<policy-server-IP>',        # ← fill in (127.0.0.1 for local)
    port=<port>,                     # ← fill in (default 9000)
)

inference_cfg = dict(
    debug_tasks=[                       # PROMPT panel list (step 1)
        '<task prompt>',                # ← match the policy's training tasks
    ],
    inference_rate=3.0,                # Hz; live-tunable in TUNING
    publish_rate=30,                   # Hz; live-tunable in TUNING
)

inference_strategies = {            # STRATEGY picker (step 2)
    'sync':  dict(type='BaseInferStrategy', args=dict(execute_horizon=5)),
    'async': dict(type='AsyncLinearOverlapInferStrategy', args={}),
}
Tip: Start from a ready-made .py under configs/01_deploy/ for your robot and edit only the "←" spots. Full field list and _base_ rules in Configuration.
Note: SIM vs REAL is a UI choice, not a config field. One config serves all three modes; the transport in the config decides only where REAL actions go and where observations come from (see Transport).

Customizing prompts and strategies

python
inference_strategies = {
    'async': dict(args=dict(latency_k=8)),       # change only this arg of async; rest inherited
    'act':   dict(args=dict(exp_weight_m=0.01)),
}