更新时间:2026-06-30 GMT+08:00
分享

创建数据评测任务

场景描述

数据评测是具身智能开发必不可少的环节,客户采集的数据可能在数据质量方面没有清晰的反馈。通过数据评测可以对数据集进行系统性的质量度量、能力映射和价值评估。

约束限制

当前版本仅支持LeRobot格式的数据集进行评测作业,且机器人类型为SO101或Galaxea R1

前提条件

  • 用户已经开通了CloudRobo账号。
  • 用户已有一批LeRobot格式的数据集在本地。
  • 用户终端最低硬件配置,客户已采购数据评测的算力资源。

创建数据评测任务

  1. 登录CloudRobo控制台
  2. 在左侧菜单栏中单击“数据准备 > 数据评测”,进入数据评测页面。
  3. 单击右上角“创建任务”,进入创建页面,参照如下参数说明配置相关信息。

    表1 数据评测参数说明

    参数

    说明

    基础信息

    任务名称

    数据评测任务的名称。

    命名规则:名称是由中文、数字、字母、下划线(_)、连字符(-)、点(.)、斜线(/)组成,输入长度范围为3~64个字符。

    描述(可选)

    数据评测的简介。

    长度为512个字符以内。

    资源配置

    资源池类型

    请按照实际需要选择资源池。

    • 专属资源池:专属资源池不与其他用户共享,资源更可控。在使用专属资源池之前,您需要先创建专属资源池,然后在开发过程中选择此专属资源池。专属资源池的创建可通过订阅CloudRobo具身智能开发平台基础版或专业版纳管资源完成。不同方式创建的专属资源池应用场景有所不同,请以实际界面展示为准。
    • 公共资源池:公共资源池提供公共的大规模计算集群,根据用户作业参数分配使用,资源按作业隔离。用户下发训练作业、部署模型、使用开发环境实例等情况下,均可以使用公共资源池完成。开通账号并申请公测后即可使用CloudRobo的公共资源池。

    专属资源池

    当“资源池”选择“专属资源池”时,显示此参数。

    请在下拉列表选择已有的专属资源池。

    实例规格

    下拉选择资源池类型对应的实例规格。

    评测信息

    评测算法

    在下拉框中选择相应的评测信息。

    当前可支持的评测算法有:数据集多样性评测数据集质量评测

    数据集

    可选“空间资产-数据”或“对象存储服务OBS”。

    • 空间资产-数据:单击在弹出来的窗口中选择空间资产-数据。或者单击“创建数据集”,在弹出来的框中填写参数信息。可参考空间资产-创建数据资产章节。
    • 对象存储服务OBS:单击在弹出来的OBS存储数据路径下选择数据。
      说明:
      1. 不支持选择跨区域(Region)的OBS桶。如果您的OBS桶中有需要特别保护的敏感数据,请自行对数据加密后再存放到OBS桶。
      2. 需选择符合格式要求的数据文件,建议文件中包含README用来解析数据的详细情况。

    数据集名称

    仅在数据集选择“对象存储服务OBS”时有效。

    在输入框中输入数据集名称。

    命名规则:由中文、数字、字母、下划线(_)、中划线(-)组成,长度为2~64个字符。

    机器人描述文件

    单击在弹出来的存储位置弹框中选择OBS路径。

    说明:
    1. 需选择符合格式要求的机器人描述文件,文件中必须包含机器人urdf描述文件以及yaml配置文件,提供数据评测任务需要的参数和描述文件信息。
    2. 不支持选择跨区域(Region)的OBS桶。如果您的OBS桶中有需要特别保护的敏感数据,请自行对数据加密后再存放到OBS桶。
    3. 需选择符合格式要求的数据文件,建议文件中包含README用来解析数据的详细情况。

  4. 填写完相关参数后,单击“立即创建”,数据评测任务创建完成,系统自动返回数据评测列表页面,等待一段时间后,状态为“排队中”即为创建成功。

数据集质量评测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(继承机制)

    子配置组通过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-数据字段定义

    定义如何从LeRobot数据集中提取特定字段。

    逻辑字段名(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"

相关文档