VLAct 数据清洗总结 (对应代码)
论文 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. 要解决的三类问题
-
无效任务名:无法提供语言监督
-
动作异常大值:采集/日志/预处理伪影
-
有效轨迹之间尺度不一致:FPS、幅值、夹爪约定不同
目标:去掉不可靠监督,尽量保留有用轨迹(优先 step/chunk 级,少整条粗暴删除——主要体现在 Franka Delta)。
3. 清洗流水线(逻辑顺序)
步骤 A:无效语言监督 → 整条轨迹丢弃
论文: unknown_task / n/a / none / no action / 空白 / 空串
代码:
-
常量:
DROID_INVALID_TASK_MARKERS(datasets.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)
论文与代码基本一致。
-
帧率对齐:$$\Delta a[t]=a[t+1]-a[t$$,再 $$\times \mathrm{FPS$$ → 每秒速度
-
action_target_mode=delta_eef_velocity -
_postprocess_action_target(datasets.py)
-
-
标坏步:\|平移速度\| > 0.5 或 \|旋转速度\| > 1.0
-
chunk 筛选:对每个采样起点对应的 action chunk,无效步占比 $$r_$$
-
$$r_C > 0.$$ → 该起点不进训练索引
-
$$r_C \le 0.$$ → 保留;训练时用
action_valid_mask对坏步不计 loss -
_get_valid_delta_eef_step_mask
-
-
归一化:平移按 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_defaults(data_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, |
|
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(不属于离线清洗)
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐



所有评论(0)