配置
EVA 配置是 Python .py 文件,非 YAML。--config 选定文件,_base_ 串接继承链。
前置条件
开环回放
开环把一段已录制的 episode 完整地走一遍流水线,无需机器人、无需策略服务器:
eva --config configs/00_openloop/ur5e_openloop.py
其他开环文件:arx_r5_openloop.py、dual_agilex_AGILEX_openloop.py、dual_franka_openloop.py、r1lite_openloop.py,位于 configs/00_openloop/。启动成功时 EVA 打印控制台 URL;失败则停在 Python 报错处(常见原因为 --config 路径错误或回放数据集缺失)。
--config 是必填项。没有预设菜单——行为完全来自传入的文件。--web-port 用于更改控制台端口。配置工作机制
- 继承——每个配置以
_base_ = ['_base.py', ...]起首,列出所基于的父文件。子文件只写要改的键。 - 单一默认值文件——所有默认值集中在
configs/00_base/defaults.py。无任何隐藏兜底:漏写_base_就直接缺设置。
文件布局
| 路径 | 用于 |
|---|---|
configs/00_base/defaults.py | 所有设置的默认值。仅供查阅,不修改。 |
configs/00_openloop/<robot>_openloop.py | 数据集回放。无需机器人或策略服务器。 |
configs/01_deploy/<robot>/_base.py | 单机器人共享的部署设置:type、transport、夹爪限位。 |
configs/01_deploy/<robot>/openpi_qpos.py · openpi_eef.py | 真机部署预设。复制其一作起点。 |
configs/02_collection/<robot>.py | 遥操作录制。见数据录制。 |
configs/03_evaluation/<robot>_eval.py | 多检查点对比。见评测配置。 |
继承与覆盖
EVA 按逐项设置合并父子配置:
- 重写
dict(...)块仅覆盖写出的键,其余保留自父文件。 - 标量或整列表会完全替换父值,列表绝不拼接。
继承链可多层,例如 ur5e_eval.py → ur5e/openpi_qpos.py → 00_base/defaults.py。下例中带 ← 的字段是用户典型要改的项。
_base_ = ['_base.py'] # 继承本机器人的共享部署设置。 policy = dict( type='openpi', # 后端:openpi / openpi_rtc / starvla / gr00t / mock / replay。 host='<策略服务器IP>', # ← 不填则保持 127.0.0.1。 port=<策略服务器端口>, # ← 策略服务器端口。 ) inference_cfg = dict( debug_tasks=['<任务指令>'], # ← 任务指令。 # 不写 obs_space / action_space 即保持关节角控制。 )
默认按关节角(JointState)控制。改为末端执行器(EEFPose)控制时同时覆盖两空间,n_arms 设为机器人手臂数:
inference_cfg = dict( obs_space=dict(type='EEFPose', n_arms=<手臂数>, rotation='quat', include_gripper=True), # ← 1 或 2。 action_space=dict(type='EEFPose', n_arms=<手臂数>, rotation='quat', include_gripper=True), # ← 同样的手臂数。 )
设置参考
robot
| 设置 | 默认值 | 含义 |
|---|---|---|
type | "agilex_AGILEX" | agilex_AGILEX / arx_r5 / dual_franka / agibot_g2 / r1_lite / ur5e 之一。 |
initial_qpos | None | 启动关节位姿。None 使用机器人内置默认。 |
eef_reference_frame | "base_link" | 末端执行器位姿所参照的坐标系。 |
gripper_threshold | 0.5 | 开/合阈值。None 表示禁用。 |
gripper_open / gripper_close | 1.0 / 0.0 | 完全张开/闭合的命令值(单位因机器人而异)。 |
transport
EVA 读传感器、发命令所用的通道。见传输层。
| 设置 | 默认值 | 含义 |
|---|---|---|
type | "ros1" | ros1 / ros2 / zmq / dataset。 |
node_name | "eva_client" | EVA 在 ROS 图中注册的名字。 |
convert_bgr_to_rgb | True | 模型看到图像前重排颜色通道。 |
image_height / image_width | 224 / 224 | 送入模型的图像尺寸。 |
resize_pad | True | 保持纵横比缩放并补白;否则拉伸。 |
image_layout | "chw" | chw 或 hwc。 |
sub_endpoint / pub_endpoint | tcp://127.0.0.1:5555 / :5556 | type='zmq' 时的 ZMQ 端点。 |
dataset_dir / episode_id | "" / 0 | type='dataset' 时的录制目录与 episode。 |
dataset_keys | state / eef / action + 相机映射 | 录制中各列与相机的映射。 |
disabled_cameras / disabled_groups | [] / [] | 运行时忽略的相机或传感器组。 |
topics | {} | ROS 话题。已在各部署 _base.py 中按机器人填好。 |
policy
与策略服务器的连接。见策略后端。
| 设置 | 默认值 | 含义 |
|---|---|---|
type | "openpi" | openpi / openpi_rtc / starvla / gr00t / mock / replay。 |
host / port | 127.0.0.1 / 9000 | 策略服务器地址。预设通常只改 port。 |
backend_options | {} | 后端专属扩展项。 |
inference_cfg
obs_space 与 action_space 在 JointState 与 EEFPose 间切换;见动作空间。
| 设置 | 默认值 | 含义 |
|---|---|---|
obs_space | dict(type='JointState') | 传给模型的状态表示。 |
action_space | dict(type='JointState') | 模型输出的解读方式。EEFPose 增加 n_arms / rotation / include_gripper。 |
inference_rate | 3.0 | 每秒请求计划次数。 |
publish_rate | 30 | 每秒下发命令次数。 |
setup_warmup_chunks | 2 | 正式执行前的预热 chunk 数。开环置 0。 |
debug_tasks | ['pour soybean', 'put cup'] | DEBUG 控制台中的起始指令。 |
inference_strategies
自带五种具名策略,可在控制台中实时切换。引用时只用左列的名字;见推理策略。
| 名字 | 默认调参 |
|---|---|
sync | execute_horizon=5 |
async | (无) |
naive | latency_k=4 |
act | exp_weight_m=0.01 |
rtc | (无) |
collection · eval_cfg · work_dir
collection 配置遥操作录制(列、相机、手臂);该段存在即把配置标记为录制配置——见数据录制。eval_cfg 配置多检查点对比(下节细讲)。work_dir(默认 "work_dirs")是产物输出根目录。
评测配置
评测配置让多个检查点在同一批任务上对比。它继承一个部署预设并填入 eval_cfg 段,列出 checkpoints 与 tasks;EVA 会替你加载每个模型的部署配置并指向正确的服务器。
_base_ = ['../01_deploy/<robot>/openpi_qpos.py'] # ← 该机器人的部署预设。 eval_cfg = dict( trials_per_prompt=5, # 每模型每任务试次数。 cli_mode='real', # 'real' 或 'sim'。 inference_strategy='async', # 上表中的策略名。 reset_after_each_trial=False, # True 表示每个试次后复位到起始姿态。 checkpoints=[ dict( name='<模型标签>', # ← 在 EVAL 选择器中显示在槽位字母(Model A/B/…)旁边作为标签。 config='../01_deploy/<robot>/openpi_qpos.py', # ← 相对本文件。 port=<策略服务器端口>, # ← 该模型的端口。 ), # 每个模型一个 dict。 ], tasks=[ dict(prompt_en='<英文任务指令>'), # ← 每个任务一项。 ], )
storage——fps标注于保存帧;save_queue_max限制写盘队列深度。skip_warmup_after_first——为True时只第一个试次预热。checkpoints[i]:name——标签,在 EVAL 选择器中显示在槽位字母(Model A / B / …)旁边。config——部署配置路径,相对评测文件。路径错则启动即报错停下。port——该 checkpoint 的策略服务器端口。host——可选,默认127.0.0.1。
shuffle_ckpts/shuffle_seed——随机化各检查点的试跑顺序;seed 默认42。enable_ssh_forward——服务器在远程主机时置True,需配ssh块:
enable_ssh_forward=True, ssh=dict( host='<远程主机>', user='<SSH 用户名>', port=<远程端口>, # 远程上策略服务器的端口。 # remote_sync_dir='<远程结果路径>', # 可选:把结果拷回此处。 ),
tasks[i]——必填prompt_en;可选项:milestones——评分子目标,(短键, 描述)对,例如(('grasp', 'grasp apple'),)。prompt_zh——中文指令。init_pose——本任务专用起始位姿,与robot.initial_qpos同格式。
启动流水线
eva --config 启动时依次:
- 合并父文件——沿
_base_链合并。 - 构建控制空间——按关节/EEF 选择实例化。
- 补全路径——空的输出路径由
work_dir与配置名派生。 - 校验录制配置——须定义 state、EEF、action 三类列及至少一相机一手臂,否则启动中止并指出缺项。
- 解析评测 checkpoints——逐项加载其配置并指向各自
host/port。
--config 或某个 checkpoint config 路径打错,或录制配置缺必填列。