Quick start

Pick a Python config, run eva --config <path.py>, drive the rest from the web console. --config is required.

The shape of a run

eva loads one .py config and builds the transport, robot, and policy connection from it, then serves the web console. The config fixes robot, transport, policy server, and action space. Run commands from the project root so relative configs/... paths resolve.

On real hardware: from bringup to data collection

Once the environment is installed (see Installation), this is the end-to-end order for bringing a live robot up. Validate each step in its console before moving to the next.

  1. Bring up the hardware node. EVA does not drive motors directly; the real-time loop talking to motors and cameras runs as a separate program on the robot's computer — the hardware node. Reference nodes ship under examples/hardware/<robot>/ and can be run as-is once the environment is set up, e.g. bash examples/hardware/arx/run_hardware.sh brings up the ARX R5 (CAN, SDK, cameras, and ZMQ endpoints all come up together). With no real arms, run run_fake_node.sh in the same folder instead — a software-only fake node that speaks the same ZMQ protocol.
  2. Verify the link in MANUAL first. With the node up, launch EVA (eva --config <deploy config> --web-port 8080) and start in MANUAL: no policy is in the loop here. Build a target pose with one slider per joint, CONNECT to the robot, and SEND TO REAL. If the arm follows and state reads back cleanly, the robot and eva-client are talking. This step confirms a new robot can communicate and is the easiest place to isolate problems.
  3. Set the policy port in the config. Once the link is good, point policy.host / policy.port in the config at your policy server (the UR5e presets default to 9000). The policy server is a separate process; launch it per its own instructions. For editing the port, see Configuration.
  4. Run inference from DEBUG. Open DEBUG and work down four steps to close the loop: pick a prompt → choose the run mode (real for the robot / sim to preview) and an inference strategy → Setup resets and validates → Run streams actions continuously.
  5. Collect data in COLLECT when you need it. With the collection hardware connected (e.g. a teleop leader arm), write a collection config (configs/02_collection/<robot>.py) that sets up the task, launch EVA, open COLLECT, and start recording.

Open-loop replay (no servers)

configs/00_openloop/* sets transport=dataset: EVA reads observations from a recorded dataset on disk and connects no policy. You drive playback from REPLAY.

bash
eva --config configs/00_openloop/ur5e_openloop.py
log
Creating transport: type=dataset robot=ur5e
Transport ready: type=dataset obs_mode=JointState
Console web server started on port 8080

Open http://127.0.0.1:8080, go to REPLAY, point at a dataset folder, pick an episode, step or scrub.

You supply the dataset. The preset ships no data. An empty or missing path fails with dataset_dir is required.

Deploy against a policy server

configs/01_deploy/<robot>/* drives a live robot and connects to a policy server at the host/port set in the config.

Step 1 — start the policy server

The policy server is a separate process, not part of EVA. Launch it per its own instructions and note its address; policy.host and policy.port in the config must match. The UR5e presets default to port 9000.

No server yet? Each backend has its own launch path. For OpenPI see spinning up a policy server; other backends follow the same pattern.

Step 2 — pick a config and launch EVA

The two UR5e presets differ only in action space:

PresetPolicy output
openpi_qpos.pyJoint positions. Sent as-is.
openpi_eef.pyEnd-effector poses. EVA solves IK before sending.
bash
# Joint positions:
eva --config configs/01_deploy/ur5e/openpi_qpos.py

# End-effector poses (IK applied):
eva --config configs/01_deploy/ur5e/openpi_eef.py
Different robot or policy server? Swap ur5e for another folder under configs/01_deploy/; edit policy.host / policy.port in the preset or its _base.py. See Configuration.

Step 3 — drive from DEBUG

Open DEBUG. Prompt and strategy drop-downs are populated from the config. Work down the controls:

ControlEffect
ConnectOpens the policy connection and reads its metadata. Fails if host/port is wrong or the server is down.
Modereal drives the robot; sim previews on a simulated arm.
Prompt + strategyTask instruction and inference strategy, both sourced from the config.
Setup → RunSetup resets to start pose and pings the policy; Run streams actions continuously.

The console

EVA serves one console on --web-port (default 8080) with six tabs — DEBUG, MANUAL, COLLECT, REPLAY, EVAL, RESULT (Web console). If the config has an eval section, EVA connects the eval policy at startup and activates EVAL and RESULT, skipping the manual Connect step.

Remote hosts

Forward the console port over SSH. Substitute the custom --web-port for both 8080s if set.

bash
ssh -L 8080:localhost:8080 <user>@<host>
# local browser: http://localhost:8080

Next steps