
# 多样性评测算子
#### 功能概述
数据集多样性评测算子用于对机器人轨迹数据集进行全面多样性评估与分析，从指令、技能、物体、场景、空间等多个维度衡量数据集的丰富程度和覆盖范围，帮助判断数据集是否足以支撑高质量的模型训练。
核心能力：
- 指令多样性：评估任务指令中动词-宾语组合的丰富度。
- 技能多样性：评估操作技能（pick、place、grab 等）的覆盖程度。
- 物体类别多样性：评估数据集中涉及的物体类别丰富度。
- 物体实例多样性：评估同一类别下具体物体实例的丰富程度。
- 场景多样性：评估场景环境的丰富程度（需相机图像）。
- 本体多样性：评估机器人形态的多样性。
- 末端执行器空间覆盖：分析末端执行器在3D工作空间中的覆盖程度。
- 抓取位姿分布：分析抓取动作时末端执行器的位姿分布。
- 操作物体空间分布：分析机器人与物体交互时的空间位置分布。
- 轨迹长度分布：分析episode长度的分布特征。
输入：LeRobot 格式数据集目录（支持 V3 和 V2.1，自动识别并转换）、机器人描述文件（URDF）和 YAML 配置文件
输出：PDF 格式的多样性评测报告 + 包含 3D 交互可视化内容的压缩包（tar.gz，内含 HTML 交互页面和 JSON 结果数据）
支持机型：如[表1]所示。
 表1支持机型 
| 机器人        | 类型 | 自由度         | 说明             |
|:---|:---|:---|:---|
| Galaxea R1 | 双臂 | 24 DOF（含夹爪） | 左右臂各 6 关节 + 夹爪 |
| SO101      | 单臂 | 6 DOF（含夹爪）  | 5 关节 + 夹爪      |
   
#### 输入说明: 数据集与配置文件
数据集目录结构说明
多样性评测算子支持LeRobot V2.1和V3两种格式的数据集。输入路径可以是包含 meta 文件夹的父目录，也可以是meta文件夹所在的层级目录。
LeRobot V3格式：
```
<dataset_dir>/                           # 数据集根目录（输入路径）
├── data/
│   └── chunk-000/
│       ├── episode_000000.parquet       # 轨迹数据
│       ├── episode_000001.parquet
│       └── ...
├── meta/
│   ├── info.json                        # 数据集基本信息（版本、帧率等）
│   ├── stats.json                       # 数据统计信息
│   ├── tasks.parquet                    # 任务定义（parquet 格式）
│   └── episodes/                        # Episode 元信息目录
└── videos/                              # 视频数据
    ├── observation.images.front/
    ├── observation.images.wrist_left/
    └── observation.images.wrist_right/
```
LeRobot V2.1格式：
```
<dataset_dir>/                           # 数据集根目录（输入路径）
├── data/
│   └── chunk-000/
│       ├── episode_000000.parquet       # 轨迹数据
│       ├── episode_000001.parquet
│       └── ...
├── meta/
│   ├── info.json                        # 数据集基本信息（版本、帧率等）
│   ├── tasks.jsonl                      # 任务定义（jsonl格式）
│   ├── episodes.jsonl                   # Episode 元信息
│   └── episodes_stats.jsonl             # Episode 统计信息
├── images/                              # 图像数据（图片序列）
│   ├── observation.images.front/
│   ├── observation.images.wrist_left/
│   └── observation.images.wrist_right/
└── videos/                              # 视频数据（可选）
```
![](https://support.huaweicloud.com/usermanual-cloudrobo/public_sys-resources/note_3.0-zh-cn.png)
目前仅支持单数据集输入。
#### 配置文件结构
多样性评测使用 YAML 配置文件定义机器人参数、数据字段映射和启用的指标列表。从界面上选择的机器人描述文件夹需包含
```
├── r1_robot.urdf
├── r1_robot.yml
```
配置文件yml包含以下主要部分：
```
# 基础配置（所有机器人共享）
# 默认配置
default_config: r1_config # 默认使用的机器人特定配置，可选r1_config或者so101_config。如果填了r1_config，则使用星海图r1的配置。
_base_config:
  data_fields:
    camera_head:
      field_path: observation.images.head    # 相机图像路径
      source_type: observation               # 来源类型：observation（观测数据）
    state:
      field_path: observation.state
      source_type: observation
    task_descriptions:
      field_path: tasks.index                # 任务指令路径（若使用subtasks则改为 subtasks.index）
      source_type: meta                      # 来源类型：meta（元数据）
  metrics: ...          # 指标定义与启用的指标列表， 可以参考指标配置（metrics）。
  robots:  ...          # 机器人关节映射等信息（R1、SO101）,可以参考机器人定义（robots）提供的预制的robots内容
  video_backend: pyav   # 视频后端
# 机器人特定配置（继承基础配置并覆盖差异部分）
r1_config:
  extends: _base_config
  data_fields:
    camera_head:
      field_path: observation.images.front   # R1 使用前置相机
so101_config:
  extends: _base_config
  data_fields:
    camera_head:
      field_path: observation.images.up      # SO101 使用上方相机
```
#### 数据字段映射（data_fields）
_base_config中的data_fields默认定义了camera_head, state, 以及task_descriptions。metric中的指标如果使用了data_fields的值，比如task_description，则说明该指标依赖task_description项。 field_path指定数据在LeRobot数据集中的路径，source_type指定数据来源类型（observation表示观测数据，meta 表示元数据）。
```
_base_config:
  data_fields:
    camera_head:
      field_path: observation.images.front
      source_type: observation
    state:
      field_path: observation.state
      source_type: observation
    task_descriptions:
      field_path: tasks.index
      source_type: meta
  metrics:
    instruction_diversity:
      data_fields: [task_descriptions]        # 使用 task_descriptions 字段
      description: 指令多样性 - 评估动宾组合的多样性
```
表2**字段说明** 
| 字段名               | 说明     | source_type | R1 路径                    | SO101 路径              |
|:---|:---|:---|:---|:---|
| camera_head       | 头部相机图像 | observation | observation.images.front | observation.images.up |
| state             | 关节状态   | observation | observation.state        | observation.state     |
| task_descriptions | 任务指令文本 | meta        | tasks.index              | tasks.index           |
   
![](https://support.huaweicloud.com/usermanual-cloudrobo/public_sys-resources/note_3.0-zh-cn.png)
如果LeRobot数据集使用了subtasks能力（即任务包含子任务分解），task_descriptions的field_path需要改为subtasks.index，而非tasks.index。
 #### 机器人定义（robots）
R1机器人配置：
```
r1:
  angles_in_degrees: false          # 关节角单位为弧度
  vertical_axis: z                  # 竖直轴为Z轴
  desktop_axes: xy                  # 桌面平面为XY平面
  high_value_is_open: true          # 夹爪值越大越张开
  urdf_path: <urdf文件路径>
  chains:
    left_arm:
      end_effector: left_gripper_link
      gripper_index: 6
      joints:
        - left_arm_joint1
        - left_arm_joint2
        - left_arm_joint3
        - left_arm_joint4
        - left_arm_joint5
        - left_arm_joint6
    right_arm:
      end_effector: right_gripper_link
      gripper_index: 13
      joints:
        - right_arm_joint1
        - right_arm_joint2
        - right_arm_joint3
        - right_arm_joint4
        - right_arm_joint5
        - right_arm_joint6
  fk_chains: [left_arm, right_arm] # 如果数据集只使用了左臂，可以将right_arm删除，以及删除chains字段里关于右臂的内容和mapping字段里关于右臂的相关内容
  state_layout:
    state_size: 14                  # 状态向量维度（6左臂关节 + 1左夹爪 + 6右臂关节 + 1右夹爪）
    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
```
SO101机器人配置：
```
so101:
  angles_in_degrees: true           # 关节角单位为角度
  vertical_axis: z
  high_value_is_open: true
  urdf_path: <urdf文件路径>
  chains:
    arm:
      end_effector: gripper_frame_link
      gripper_index: -1             # 无独立夹爪索引
      joints: [shoulder_pan, shoulder_lift, elbow_flex, wrist_flex, wrist_roll]
  fk_chains: [arm]
  state_layout:
    state_size: 6                   # 状态向量维度（5关节 + 1夹爪）
    mapping:
      shoulder_pan: 0
      shoulder_lift: 1
      elbow_flex: 2
      wrist_flex: 3
      wrist_roll: 4
      gripper: 5
```
 #### 指标配置（metrics）
每个指标需指定所需的数据字段和描述如下：
```
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: []
      description: "轨迹长度分布 - 分析episode长度的分布特征"
    
    embodiment_diversity:
      data_fields: [task_descriptions]
      description: "本体多样性 - 评估机器人形态的多样性"
    
    # ── 场景/图像指标 ──
    scene_diversity:
      data_fields: [camera_head]
      description: "场景多样性 - 评估场景环境的丰富程度（需要相机图像）"
    
    # ── 空间分布指标（需要 FK） ──
    grasping_pose_distribution:
      data_fields: [state]
      description: "抓取位姿分布 - 分析抓取动作时末端执行器的位姿分布"
    
    end_effector_spatial_coverage:
      data_fields: [state]
      description: "末端执行器空间分布 - 分析机器人末端执行器在3D工作空间中的空间覆盖程度"
    
    manipulation_object_spatial_distribution:
      data_fields: [state, camera_head]
      description: "操作物体空间分布 - 分析机器人与物体交互时的空间位置分布"
      planes:
        xy: true
        xz: false
        yz: false
      show_episode_labels: false
      save_grasping_images:
        enabled: true
        data_field: "camera_head"
```
![](https://support.huaweicloud.com/usermanual-cloudrobo/public_sys-resources/note_3.0-zh-cn.png)
当指标依赖项data_fields在数据集缺失。算子会跳过该指标，作业不会失败。用户日志或全量报告中会显示缺失指标项以及修复建议。
#### 输出指标说明
共 10 项多样性指标，分为语义多样性、空间多样性、统计分布三类。
#### 语义多样性
- 指令多样性（instruction_diversity） 评估任务指令中动词-宾语（Verb-Object）组合的丰富度。
  表3指令多样性指标 
  | 指标                       | 说明          |
  |:---|:---|
  | unique_combinations      | 唯一的动词-宾语组合数 |
  | unique_verbs             | 唯一的动词数      |
  | unique_objects           | 唯一的宾语数      |
  | combination_distribution | 各组合的频率分布    |
     
  示例输出： 12 种唯一组合，11 种动词（pick、hold、grasp、seize、take、lift、grab、secure、clasp、snatch、retrieve），2 种宾语（box、plug）。
  
 
- 技能多样性（skill_diversity） 评估数据集中操作技能的丰富程度。将动词归一化为标准技能类别后统计分布。
  表4技能多样性指标 
  | 指标                            | 说明             |
  |:---|:---|
  | unique_skills                 | 归一化后的唯一技能数     |
  | total_samples                 | 总样本数           |
  | max_frequency / min_frequency | 最高/最低技能频率      |
  | mean_frequency                | 平均技能频率         |
  | tail_distribution_ratio       | 长尾分布比例（尾部技能占比） |
  | top10_concentration           | Top 10 技能集中度   |
  | skill_frequency               | 各技能的频率分布       |
     
  示例输出： 12种唯一技能（pick: 30、place: 41、grab: 18 等），Top 10集中度0.9836。
  
- 物体类别多样性（object_category_diversity） 评估数据集中涉及的物体类别丰富程度，支持超类（superclass）映射。
  表5物体类别多样性指标 
  | 指标                      | 说明         |
  |:---|:---|
  | all_specific_categories | 所有具体物体类别列表 |
  | all_superclasses        | 所有超类列表     |
  | object_mapping          | 具体类别到超类的映射 |
     
  
- 物体实例多样性（object_instance_diversity） 评估同一类别下具体物体实例的丰富程度。
  表6物体实例多样性指标 
  | 指标                          | 说明       |
  |:---|:---|
  | total_unique_instances      | 唯一物体实例总数 |
  | total_unique_categories     | 唯一类别总数   |
  | mean_instances_per_category | 每类别平均实例数 |
  | max_instances_in_category   | 单类别最大实例数 |
  | instance_frequency          | 各实例的出现频率 |
  | category_to_instances       | 类别到实例的映射 |
     
  示例输出： 5 个唯一实例（red plug、box、gray box、pink box、purple box），2 个类别。
  
- 场景多样性（scene_diversity） 评估场景环境的丰富程度，需要相机图像数据。
  表7场景多样性指标 
  | 指标                 | 说明         |
  |:---|:---|
  | all_scenes         | 所有场景标签列表   |
  | scene_similarities | 各场景间的相似度分数 |
     
  
- 本体多样性（embodiment_diversity） 评估机器人形态的多样性。
  表8本体多样性指标 
  | 指标                  | 说明                                 |
  |:---|:---|
  | unique_robot_bodies | 唯一机器人形态数                           |
  | total_task_types    | 总任务类型数                             |
  | robots              | 各机器人的详细信息（名称、类型、自由度、episode 数、任务数） |
     
  
#### 空间多样性
- 末端执行器空间覆盖（end_effector_spatial_coverage） 分析机器人末端执行器在3D工作空间中的空间覆盖程度，基于正向运动学（FK）计算。
  表9末端执行器空间覆盖指标 
  | 指标               | 说明                             |
  |:---|:---|
  | chains           | 分析的运动链列表（如 left_arm、right_arm） |
  | coordinate_frame | 坐标参考系（robot_base）              |
  | trajectory_count | 轨迹总数                           |
  | total_frames     | 总帧数                            |
  | trajectories     | 各 episode 的末端位置序列              |
     
  HTML交互报告中包含3D散点图，用于展示末端执行器在工作空间中的覆盖范围。
  
 
- 抓取位姿分布（grasping_pose_distribution） 分析抓取动作时末端执行器的位姿分布。
  表10抓取位姿分布指标 
  | 指标                      | 说明                                       |
  |:---|:---|
  | chains                  | 分析的运动链                                   |
  | rotation_representation | 旋转表示方式（euler）                            |
  | grasping_axis           | 抓取轴（x）                                   |
  | grasping_poses          | 各 episode 抓取时刻的位姿（位置 + 欧拉角 + 四元数 + 抓取方向） |
     
  HTML交互报告中包含3D散点图和方向箭头，用于展示可视化抓取位姿的空间分布。
  
- 操作物体空间分布（manipulation_object_spatial_distribution） 分析机器人与物体交互时的空间位置分布。
  表11操作物体空间分布指标 
  | 指标                  | 说明                       |
  |:---|:---|
  | coordinate_frame    | 坐标参考系                    |
  | data_source         | 数据来源（forward_kinematics） |
  | manipulation_points | 各episode操作时刻的3D坐标点       |
     
  
#### 统计分布
轨迹长度分布（trajectory_length_distribution）
分析episode长度的分布特征。
表12轨迹长度分布指标 
| 指标                          | 说明                     |
|:---|:---|
| mean / std / median         | 均值、标准差、中位数（帧数）         |
| min / max                   | 最小/最大帧数                |
| q25 / q50 / q75 / q90 / q95 | 各分位数                   |
| iqr                         | 四分位距                   |
| mean_seconds / std_seconds  | 以秒为单位的均值和标准差（假设fps=10） |
| total_episodes              | 总episode数              |
| total_frames                | 总帧数                    |
   
示例输出：均值454帧（45.4秒），标准差41帧，中位数455帧，范围344\~546帧。
#### PDF报告结构
最终生成的PDF报告包含的章节如[表13]所示。
 表13PDF报告结构 
| 章节         | 内容                   |
|:---|:---|
| 数据集概览      | 数据集名称、样本量等基本信息       |
| 指令多样性分析    | 动词-宾语组合分布柱状图与统计      |
| 技能多样性分析    | 技能频率分布与集中度分析         |
| 物体类别与实例多样性 | 物体类别、实例的丰富度统计        |
| 场景多样性分析    | 场景环境丰富度评估            |
| 本体多样性分析    | 机器人形态多样性             |
| 空间覆盖分析     | 末端执行器、抓取位姿、操作物体的空间分布 |
| 轨迹长度分布     | episode长度分布直方图与统计量   |
   
#### HTML交互报告
解压tar.gz后，在浏览器中打开index.html可查看交互式报告。交互报告的特点如下：
- 3D 可视化：末端执行器空间覆盖、抓取位姿分布、操作物体空间分布均提供3D散点图，支持旋转、缩放、平移。
- 悬浮提示：鼠标悬浮在数据点上可查看episode编号、帧索引、坐标值等详细信息。
- 分指标页面：每个指标独立一个HTML页面，通过主页index.html导航访问。
 
