论文 Appendix H × 仓库实现

一句话

多源开放机器人轨迹先做轻量清洗与动作对齐,再进训练时的 20 维部分统一布局;论文写的是统一概念管线,代码按数据集开关落地,不是每个源都开全套

主预训 mixture:agilex_franka_5data_manualvel_balance_50

核心实现:starVLA/dataloader/gr00t_lerobot/datasets.py + data_config.py + transform/state_action.py


1. 用了什么数据、原生动作空间

平台

训练数据

评估

原生动作

AgileX 双臂

InternData-A1、RoboCoin

RoboTwin 2.0

14 维:12 绝对关节角 + 2 夹爪

Franka 单臂

DROID (v1.0.0/1)、DROID_100、MolmoAct

LIBERO-Plus、VLA-Arena

7 维:6 delta EEF + 1 夹爪

异构来源:硬件、标注、接口、帧率、夹爪约定都不同 → 有噪声,也有尺度不一致。


2. 要解决的三类问题

  1. 无效任务名:无法提供语言监督

  2. 动作异常大值:采集/日志/预处理伪影

  3. 有效轨迹之间尺度不一致:FPS、幅值、夹爪约定不同

    目标:去掉不可靠监督,尽量保留有用轨迹(优先 step/chunk 级,少整条粗暴删除——主要体现在 Franka Delta)。


    3. 清洗流水线(逻辑顺序)

    步骤 A:无效语言监督 → 整条轨迹丢弃

    论文: unknown_task / n/a / none / no action / 空白 / 空串

    代码:

    • 常量:DROID_INVALID_TASK_MARKERSdatasets.py

    • 函数:is_invalid_droid_task_text_trajectory_has_invalid_droid_task

    • 机制通用,主配方只给 DROID / DROID_100 打开filter_invalid_droid_task=True

    • MolmoAct / InternA1 / RoboCoin:

    • 另有工程项:空 language instruction → 凡开了 language 的数据都会整条丢


      步骤 B:Franka Delta EEF 对齐(DROID / DROID_100 / MolmoAct)

      论文与代码基本一致。

      1. 帧率对齐:$$\Delta a[t]=a[t+1]-a[t$$,再 $$\times \mathrm{FPS$$ → 每秒速度

        1. action_target_mode=delta_eef_velocity

        2. _postprocess_action_targetdatasets.py

      2. 标坏步:\|平移速度\| > 0.5 或 \|旋转速度\| > 1.0

      3. chunk 筛选:对每个采样起点对应的 action chunk,无效步占比 $$r_$$

        1. $$r_C > 0.$$ → 该起点不进训练索引

        2. $$r_C \le 0.$$ → 保留;训练时用 action_valid_mask 对坏步不计 loss

        3. _get_valid_delta_eef_step_mask

      4. 归一化:平移按 0.5、旋转按 1.0(代码用 min_max、stats ±0.5/±1.0)

        离线脚本:

        • examples/DROID/compute_filtered_caches_droid_action_delta.py

        • examples/MolmoAct/compute_caches_molmoact_delta_eef.py

          配置:_build_strict_franka_manual_velocity_defaultsdata_config.py


          步骤 C:AgileX 绝对关节角对齐(InternA1 / RoboCoin)

          论文写: 去掉超出 $$[-2\pi,2\pi$$ 的值 → wrap 到 $$[-\pi,\pi$$ → 不再额外归一化

          重要纠正:

          论文 没有 写关节角也复用 Delta 的 $$r_$$ chunk 公式;代码也 没有 对关节做 step/$$r_$$ 过滤。

          代码实际:

          • 越界:|θ| > 2π整条轨迹丢弃_trajectory_has_outlier_action

            • RoboCoin:开filter_outlier_trajectory=True, outlier_abs_limit≈2π

            • InternA1:关(默认只有 gripper_norm_mode=min_max + wrap)

          • wrap:Normalizer(mode="wrap")transform/state_action.py

            • InternA1、RoboCoin:都开

          • 不做幅值归一化:✅


            步骤 D:Gripper(两平台)

            论文: 去极端 outlier → 每个数据集各自 min-max → $$[0,1]$$

            代码:

            • min-max:五家主数据源基本都开(gripper_norm_mode=min_max

            • 极端值整条丢:主要 RoboCoin|g|>1);Franka 侧默认没开同名 gripper outlier 开关

            • 论文未写死「0=闭、1=开」,只保证映到 $$[0,1$$


              4. 主 mixture:谁开了什么(最关键)

              操作

              DROID

              DROID_100

              MolmoAct

              InternA1

              RoboCoin

              无效 task 名

              空 language

              ✅*

              ✅*

              ✅*

              ✅*

              ✅*

              Δ×FPS + 0.5/1.0 + $$r_$$ + step mask

              Δ 归一化 ±0.5/±1

              关节 |θ|>2π 整条丢

              关节 wrap

              Gripper 极端值整条丢

              ❌†

              ❌†

              ❌†

              Gripper min-max

              \* 有 language modality 即生效 † 默认未开 filter_gripper_outlier_trajectory

              robot_type

              • DROID:oxe_droid_exterior{1,2}_wrist_manualvel_strict_50

              • MolmoAct:molmoact_franka_exterior{1,2}_wrist_manualvel_strict_50

              • InternA1:split_aloha_flip_wrap50

              • RoboCoin:ROBOCOIN.AgileX_flip_wrap


                5. 和「清洗」相关但不属于 Appendix H 离线清洗的部分

                模块

                是不是离线清洗

                做什么

                I.2 20 维布局

                ❌ 训练时映射

                7D/14D scatter 进 20D,action_dim_mask 关掉无物理意义维(QwenHybrid_xrobot_padding.py

                Wrap-aware loss

                ❌ 训练损失

                绝对关节维对 ±π 做环绕 L1(数据端 wrap 不够,预测仍可能跨界)

                D 章 VLM caption

                轻量格式化 + 共训

                保 VLM prior,不是机器人轨迹清洗

                G 章 UMI 20K

                补充实验

                轻过滤 + 转 delta EEF;仓库无对应脚本

                清洗产出主要是索引/统计缓存(不改写原始 parquet):

                • meta/steps_data_index_filtered_*.pkl

                • meta/stats_gr00t_filtered_*.json


                  6. 最短记忆版

                  无效语言 → 整条丢(主开:DROID)
                       ↓
                  Franka:Δ×FPS → 标坏步 → r_C 筛起点 → mask 坏步 → ÷0.5/÷1.0
                  AgileX:(|θ|>2π 整条丢?RoboCoin✅ InternA1❌) → wrap → 不归一化
                       ↓
                  Gripper:分数据集 min-max → [0,1](极端值过滤主开 RoboCoin)
                       ↓
                  训练时再映射到 20 维 + dim mask(不属于离线清洗)

                  Logo

                  DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

                  更多推荐