创建数据评测任务
场景描述
数据评测是具身智能开发必不可少的环节,客户采集的数据可能在数据质量方面没有清晰的反馈。通过数据评测可以对数据集进行系统性的质量度量、能力映射和价值评估。
约束限制
当前版本仅支持LeRobot格式的数据集进行评测作业,且机器人类型为SO101或Galaxea R1
前提条件
- 用户已经开通了CloudRobo账号。
- 用户已有一批LeRobot格式的数据集在本地。
- 用户终端最低硬件配置,客户已采购数据评测的算力资源。
创建数据评测任务
- 登录CloudRobo控制台。
- 在左侧菜单栏中单击“数据准备 > 数据评测”,进入数据评测页面。
- 单击右上角“创建任务”,进入创建页面,参照如下参数说明配置相关信息。
表1 数据评测参数说明 参数
说明
基础信息
任务名称
数据评测任务的名称。
命名规则:名称是由中文、数字、字母、下划线(_)、连字符(-)、点(.)、斜线(/)组成,输入长度范围为3~64个字符。
描述(可选)
数据评测的简介。
长度为512个字符以内。
资源配置
资源池类型
请按照实际需要选择资源池。
- 专属资源池:专属资源池不与其他用户共享,资源更可控。在使用专属资源池之前,您需要先创建专属资源池,然后在开发过程中选择此专属资源池。专属资源池的创建可通过订阅CloudRobo具身智能开发平台基础版或专业版或纳管资源完成。不同方式创建的专属资源池应用场景有所不同,请以实际界面展示为准。
- 公共资源池:公共资源池提供公共的大规模计算集群,根据用户作业参数分配使用,资源按作业隔离。用户下发训练作业、部署模型、使用开发环境实例等情况下,均可以使用公共资源池完成。开通账号并申请公测后即可使用CloudRobo的公共资源池。
专属资源池
当“资源池”选择“专属资源池”时,显示此参数。
请在下拉列表选择已有的专属资源池。
实例规格
下拉选择资源池类型对应的实例规格。
评测信息
评测算法
在下拉框中选择相应的评测信息。
数据集
可选“空间资产-数据”或“对象存储服务OBS”。
- 空间资产-数据:单击
在弹出来的窗口中选择空间资产-数据。或者单击“创建数据集”,在弹出来的框中填写参数信息。可参考空间资产-创建数据资产章节。 - 对象存储服务OBS:单击
在弹出来的OBS存储数据路径下选择数据。 说明:- 不支持选择跨区域(Region)的OBS桶。如果您的OBS桶中有需要特别保护的敏感数据,请自行对数据加密后再存放到OBS桶。
- 需选择符合格式要求的数据文件,建议文件中包含README用来解析数据的详细情况。
数据集名称
仅在数据集选择“对象存储服务OBS”时有效。
在输入框中输入数据集名称。
命名规则:由中文、数字、字母、下划线(_)、中划线(-)组成,长度为2~64个字符。
机器人描述文件
单击
在弹出来的存储位置弹框中选择OBS路径。说明:- 需选择符合格式要求的机器人描述文件,文件中必须包含机器人urdf描述文件以及yaml配置文件,提供数据评测任务需要的参数和描述文件信息。
- 不支持选择跨区域(Region)的OBS桶。如果您的OBS桶中有需要特别保护的敏感数据,请自行对数据加密后再存放到OBS桶。
- 需选择符合格式要求的数据文件,建议文件中包含README用来解析数据的详细情况。
- 填写完相关参数后,单击“立即创建”,数据评测任务创建完成,系统自动返回数据评测列表页面,等待一段时间后,状态为“排队中”即为创建成功。
数据集质量评测yaml配置文件说明
作业会根据base/tip从URDF构建左右臂KinematicChain,然后按每帧关节角做FK,计算末端位置、速度、加速度、jerk、路径长度、抖动等指标。
yaml需要包括下图示例内容。除了一些默认值,left_arm_base_link, right_arm_base_link, left_tip_link, right_tip_link这些link的value值需要和URDF里定义的名称相同。
robots:
robot_name: "Galaxea R1" # 机器人名称, 目前仅支持Galaxea R1
robot_type: "R1" # 类型, 目前仅支持R1
base_frame: "base_link" #这是机器人整体基座坐标系, 作为模型元数据保存;当前核心任务空间计算没有直接用它做 FK 链路起点。默认值base_link,无需修改。实际左右臂 FK 用的是下面两个 arm base link。
left_arm_base_link: "left_arm_base_link" #左臂运动链起点。代码会从 left_tool_link 往父节点回溯,直到 left_arm_base_link,解析出左臂所有关节。
right_arm_base_link: "right_arm_base_link" #右臂运动链起点,同理用于解析右臂链路。
left_tip_link: "left_tool_link" #左臂末端点。这里的tip不是“夹爪某个关节”,而是URDF里定义的工具坐标link,位于左夹爪后面,用来代表任务空间里的左手/末端执行器位置。
right_tip_link: "right_tool_link" #右臂末端工具坐标 link。 数据集多样性评测yaml配置文件说明
顶层结构
dataset_configs: # 数据集 → 配置组映射 default_config: # 默认配置组名 _base_config: # 基础配置组(不直接使用,供继承) so101_config: # 配置组示例 1(继承 _base_config) r1_config: # 配置组示例 2(继承 _base_config)
1. dataset_configs—数据集映射
将数据集名称关联到配置组。评估引擎启动时,根据数据集名查找对应的配置组。
dataset_configs: svla_so101_pickplace_up: "so101_config" r1_picking_real_1104_red_speedup4x: "r1_config"
- key: 数据集名称(与LeRobot数据集目录名一致)
- value: 使用的配置组名称
查找规则(由ConfigResolver实现):
- 数据集的原始名称命中的话,直接返回;
- 去掉路径后缀后尝试匹配;
- 以上均未命中 → 使用default_config。
2. default_config—默认配置组
default_config: "so101_config"
当数据集不在 `dataset_configs` 中时,使用此配置组。
3. 配置组结构
配置组(_base_config、so101_config、r1_config等)包含以下字段:
<config_group_name>:
extends: <parent_group> # 可选,继承的父配置组
video_backend: "pyav" # 视频解码后端
robots: # 机器人运动学配置
<robot_type_name>:
urdf_path: "..." # URDF 文件名,这份yaml配置文件随urdf文件一起传递到作业容器中,urdf_path内容会被覆盖。
high_value_is_open: true # 高值 = 夹爪张开
vertical_axis: "z" # 重力轴
angles_in_degrees: false # 关节角度单位
fk_chains: ["arm"] # 正运动学链名称列表, 保持与下方chains中的<chain_name>保持一致
state_layout: # 状态向量布局
state_size: 6
mapping:
joint_name: <index> # 关节名 → 状态向量下标
chains: # 运动学链定义
<chain_name>:
joints: [...] # 关节列表(按顺序)
end_effector: "..." # 末端执行器 link 名称
gripper_index: <int> # 夹爪在状态向量中的下标
data_fields: # 数据字段定义
<logical_field_name>:
source_type: "observation" | "info" | "tasks" | "episodes"
field_path: "observation.state"
default_value: null
description: "..."
...
metrics: # 指标声明
<metric_name>:
data_fields: [...] # 依赖的逻辑字段名列表
description: "..." # 指标描述
<metric_specific_params>: # 指标特有参数(可选) 4. 字段详解及配置示例
- extends(继承机制)
表2 合并规则 字段
合并方式
data_fields
子配置覆盖父配置中同名字段,差异字段各保留
metrics
同data_fields的合并方式
robots
子配置覆盖父配置整体
其他顶层字段(video_backend等)
子配置覆盖父配置整体
注意:继承深度不限,但循环继承会抛出ConfigurationError。
- video_backend
video_backend: "pyav" # 可选值: pyav | ...
- robots—机器人配置
表3 机器人配置说明 字段
类型
说明
urdf_path
string
URDF文件路径,相对于项目根目录
high_value_is_open
bool
状态值高时夹爪是否张开
vertical_axis
string
重力方向轴("z"/"y")
desktop_axes
string
桌面平面轴(可选,双臂机器人用,如 `"xy"`)
angles_in_degrees
bool
关节角度单位是否为度数
fk_chains
list[string]
需要计算正运动学的链名称列表
state_layout
dict
状态向量布局(见下方)
chains
dict
运动学链定义(见下方)
state_layout:
state_layout: state_size: 6 # 状态向量总长度 mapping: shoulder_pan: 0 # 关节名 → 在状态向量中的下标 shoulder_lift: 1 ...chains:
chains: <chain_name>: joints: [joint1, joint2, ...] # 该链包含的关节(按顺序,名称与 mapping 中的 key 一致) end_effector: "link_name" # 末端执行器在 URDF 中的 link 名称 gripper_index: -1 # 夹爪在状态向量中的下标(-1 = 未指定,回退取状态向量最后一列) - data_fields-数据字段定义
逻辑字段名(yaml key)是代码中硬编码引用的标识符,不可修改。如需适配不同数据集,只改field_path。
表4 data_fields数据字段说明 字段
类型
说明
source_type
string
数据来源类型(见下表)
field_path
string
在数据集中的物理路径
default_value
any
字段缺失时的默认值
description
string
字段说明
表5 source_type可选值 来源类型
对应数据集位置
info
meta/info.json—数据集元信息
tasks
meta/tasks.parquet—任务描述
episodes
meta/episodes/*.parquet—Episode元数据
observation
data/chunk-*/parquet+videos/*/—轨迹观察数据
表6 预定义字段参考 逻辑字段名
source_type
说明
task_descriptions
tasks
任务描述文本
state
observation
机器人状态向量
episode_length
episodes
Episode帧数
robot_type
info
机器人类型标识
fps
info
数据集帧率
camera_head
observation
主场景相机图像
- metrics-指标声明
表7 预定义指标 指标名
类别
数据字段依赖
说明
skill_diversity
task_attribute
task_descriptions
技能多样性
object_category_diversity
task_attribute
task_descriptions
物体类别多样性
instruction_diversity
task_attribute
task_descriptions
指令多样性
object_instance_diversity
task_attribute
task_descriptions
物体实例多样性
trajectory_length_distribution
task_attribute
episode_length
轨迹长度分布
embodiment_diversity
task_attribute
robot_type, task_descriptions
本体多样性
scene_diversity
task_attribute
camera_head
场景多样性
grasping_pose_distribution
spatial_distribution
state, robot_type
抓取位姿分布
end_effector_spatial_coverage
spatial_distribution
state, robot_type
末端执行器空间覆盖
manipulation_object_spatial_distribution
spatial_distribution
state, robot_type, camera_head
操作物体空间分布
标准字段:
- data_fields: 该指标依赖的逻辑字段名列表。
- description:指标说明
指标特有参数(示例:manipulation_object_spatial_distribution):
manipulation_object_spatial_distribution: data_fields: [state, robot_type, camera_head] description: "..." planes: # 可视化投影平面 xy: true xz: false yz: false show_episode_labels: false # 是否显示 episode 标签 save_grasping_images: # 是否保存抓取图像 enabled: true data_field: "camera_head" # 使用的图像字段所有指标开关通过CLI -m参数控制,不在配置中做启用/禁用过滤。
- 配置示例
dataset_configs: svla_so101_pickplace_up: "so101_config" r1_picking_real_1104_red_speedup4x: "r1_config" r1_sort_yellow_button_clean_right_sim_1212_0_200: "r1_config"
默认配置组
default_config: "r1_config"
基础配置组
_base_config: video_backend: "pyav" robots: so101: urdf_path: "embodied_data_evaluator/config/robot_urdf/so101_new_calib.urdf" high_value_is_open: true vertical_axis: "z" angles_in_degrees: true fk_chains: ["arm"] state_layout: state_size: 6 mapping: shoulder_pan: 0 shoulder_lift: 1 elbow_flex: 2 wrist_flex: 3 wrist_roll: 4 gripper: 5 chains: arm: joints: [shoulder_pan, shoulder_lift, elbow_flex, wrist_flex, wrist_roll] end_effector: gripper_frame_link gripper_index: -1 r1: urdf_path: "embodied_data_evaluator/config/robot_urdf/r1_v2_1_0.urdf" high_value_is_open: true vertical_axis: "z" desktop_axes: "xy" angles_in_degrees: false fk_chains: ["left_arm", "right_arm"] state_layout: state_size: 14 mapping: left_arm_joint1: 0 left_arm_joint2: 1 left_arm_joint3: 2 left_arm_joint4: 3 left_arm_joint5: 4 left_arm_joint6: 5 left_gripper: 6 right_arm_joint1: 7 right_arm_joint2: 8 right_arm_joint3: 9 right_arm_joint4: 10 right_arm_joint5: 11 right_arm_joint6: 12 right_gripper: 13 chains: left_arm: joints: [left_arm_joint1, left_arm_joint2, left_arm_joint3, left_arm_joint4, left_arm_joint5, left_arm_joint6] end_effector: left_gripper_link gripper_index: 6 right_arm: joints: [right_arm_joint1, right_arm_joint2, right_arm_joint3, right_arm_joint4, right_arm_joint5, right_arm_joint6] end_effector: right_gripper_link gripper_index: 13全部data_fields定义
# 以下列出的逻辑字段名是全量的,子配置覆盖时保持键名不变。 # 对于不需要的字段可以忽略,但不可改名。 data_fields: # ── 文本类 ── task_descriptions: source_type: "tasks" field_path: "task" default_value: [] description: "任务描述文本(来自 meta/tasks.parquet)" # ── 观测数据类 ── state: source_type: "observation" field_path: "observation.state" default_value: null description: "机器人状态向量" # ── Episode 元数据类 ── episode_length: source_type: "episodes" field_path: "length" default_value: null description: "Episode 帧数" # ── 数据集信息类 ── robot_type: source_type: "info" field_path: "robot_type" default_value: "so101" description: "机器人类型" fps: source_type: "info" field_path: "fps" default_value: 30.0 description: "数据集帧率" # ── 图像类(数据集间最常变) ── # 主场景相机:scene_diversity + manipulation_object 抓取图片使用 camera_head: source_type: "observation" field_path: "observation.images.head" default_value: null description: "主场景相机(头部/上方视角)"全部指标声明
metrics: # ── 任务属性指标(通用) ── skill_diversity: data_fields: [task_descriptions] description: "技能多样性 - 评估操作技能的丰富程度" object_category_diversity: data_fields: [task_descriptions] description: "物体类别多样性 - 评估物体类别的丰富程度" instruction_diversity: data_fields: [task_descriptions] description: "指令多样性 - 评估动宾组合的多样性" object_instance_diversity: data_fields: [task_descriptions] description: "物体实例多样性 - 评估具体物体实例的丰富程度" trajectory_length_distribution: data_fields: [episode_length] description: "轨迹长度分布 - 分析episode长度的分布特征" embodiment_diversity: data_fields: [robot_type, task_descriptions] description: "本体多样性 - 评估机器人形态的多样性" # ── 场景/图像指标 ── scene_diversity: data_fields: [camera_head] description: "场景多样性 - 评估场景环境的丰富程度(需要相机图像)" # ── 空间分布指标(需要 FK) ── grasping_pose_distribution: data_fields: [state, robot_type] description: "抓取位姿分布 - 分析抓取动作时末端执行器的位姿分布" end_effector_spatial_coverage: data_fields: [state, robot_type] description: "末端执行器空间分布 - 分析机器人末端执行器在3D工作空间中的空间覆盖程度" manipulation_object_spatial_distribution: data_fields: [state, robot_type, camera_head] description: "操作物体空间分布 - 分析机器人与物体交互时的空间位置分布" planes: xy: true xz: false yz: false show_episode_labels: false save_grasping_images: enabled: true data_field: "camera_head"配置组:so101_config
# 适用于 SO101 机械臂的 SVLA 数据集 # 覆盖:- camera_head.field_path → "observation.images.up"(上方相机) so101_config: extends: _base_config data_fields: camera_head: source_type: "observation" field_path: "observation.images.up" description: "主场景相机(上方视角)"配置组:r1_config
# 适用于 R1 双臂机器人的数据集 # 覆盖:- camera_head.field_path → "observation.images.front"(前方相机) r1_config: extends: _base_config data_fields: camera_head: source_type: "observation" field_path: "observation.images.front" description: "主场景相机(前方视角)"
5. 新增配置组示例
创建新配置组并继承基础配置:
my_robot_config:
extends: _base_config
robots:
my_robot:
urdf_path: "src/embodied_data_evaluator/config/robot_urdf/my_robot.urdf"
high_value_is_open: true
vertical_axis: "z"
angles_in_degrees: false
fk_chains: ["arm"]
state_layout:
state_size: 7
mapping:
joint_1: 0
joint_2: 1
joint_3: 2
joint_4: 3
joint_5: 4
joint_6: 5
gripper: 6
chains:
arm:
joints: [joint_1, joint_2, joint_3, joint_4, joint_5, joint_6]
end_effector: gripper_link
gripper_index: 6
data_fields:
camera_head:
source_type: "observation"
field_path: "observation.images.my_camera" # 覆盖相机路径
metrics:
# 可在此新增或覆盖指标定义
manipulation_object_spatial_distribution:
data_fields: [state, robot_type, camera_head]
description: "..."
planes:
xy: true
xz: true
yz: false 然后在default_config中注册:
default_config: "my_robot_config"