4. 环境与数据准备
ACT(Action Chunking Transformer)属于模仿学习策略,其训练效果高度依赖“环境一致性”和“数据质量”。在正式训练之前,必须完成四件事:搭建可复现的仿真平台、确认真实机器人接口、按统一规范采集示教数据、建立标准化的数据格式与预处理流水线。本节将围绕这四步展开,并给出可直接落地的目录结构、参数配置与检查清单。
一、核心原理:环境与数据是策略的“地基”
ACT 的学习目标是:给定当前观测(多路相机图像 + 关节状态),预测未来一段时间内的动作序列(action chunk)。因此数据中必须同时包含观测流与动作流,且两者在时间上严格对齐。若仿真与真机的相机内参、关节顺序、控制频率不一致,策略在迁移时会出现“看得见但动不对”的问题。环境准备的本质,是让仿真、真机、数据三者共享同一套“坐标系、单位、频率、命名”约定。
二、仿真平台搭建:以 MuJoCo / Isaac 为例
仿真平台用于低成本验证算法与生成大规模数据。推荐使用 MuJoCo 进行快速原型验证,Isaac Sim/Gym 用于高保真渲染与并行采样。搭建时需固定随机种子、物理步长与渲染分辨率,并导出与真机一致的观测接口。
# 仿真环境关键配置示例(YAML)
env:
name: "sim_arm_pick"
control_freq: 30 # 控制频率 Hz
physics_dt: 0.002 # 物理步长
cameras:
- name: "top"
resolution: [480, 640]
- name: "wrist"
resolution: [480, 640]
robot:
dof: 7
joint_order: ["j1","j2","j3","j4","j5","j6","gripper"]
action_dim: 7
seed: 42
仿真数据采集通常通过脚本化专家策略或遥操作完成。建议每个任务至少采集 50~100 条成功轨迹,并保留少量失败轨迹用于鲁棒性分析。
三、真实机器人接入:接口与安全
真机接入的核心是“控制接口 + 状态回读 + 安全限位”。常见方案包括 ROS/ROS2 话题、SDK 直连或 EtherCAT。采集前必须确认:关节状态回读频率与动作下发频率一致;相机触发与动作时间戳对齐;急停与限位保护生效。
- 状态回读:关节角、夹爪开合、末端位姿,频率建议 ≥ 30Hz。
- 动作下发:位置/速度/力矩模式需与训练动作空间一致。
- 时间同步:使用统一时钟源,图像与状态时间戳误差控制在 10ms 内。
- 安全策略:软限位、速度上限、碰撞检测、急停按钮。
四、数据采集与格式规范
ACT 官方实现常用 HDF5 存储每条 episode,内部包含观测、动作、时间戳等数据集。推荐目录结构如下:
dataset/
├── episode_0000.hdf5
├── episode_0001.hdf5
└── meta.json
# 单个 hdf5 内部结构
/observations/images/top (T, H, W, 3) uint8
/observations/images/wrist (T, H, W, 3) uint8
/observations/qpos (T, 7) float32
/action (T, 7) float32
/timestamps (T,) float64
采集时需记录任务描述、成功标志、操作者、环境参数等元信息,便于后续筛选与复现。下表给出数据字段的规范清单:
| 字段 | 维度/类型 | 说明 | 常见错误 |
|---|---|---|---|
| images/top | (T,H,W,3) uint8 | 顶部相机 RGB | 分辨率不一致、BGR 顺序 |
| images/wrist | (T,H,W,3) uint8 | 腕部相机 RGB | 与 top 时间戳错位 |
| qpos | (T,7) float32 | 关节角+夹爪 | 单位混用(度/弧度) |
| action | (T,7) float32 | 目标动作 | 与 qpos 顺序不一致 |
| timestamps | (T,) float64 | 统一时钟 | 使用本地时间导致漂移 |
五、预处理流程:从原始数据到训练张量
预处理的目标是“对齐、归一化、增强、切分”。典型流程为:时间对齐 → 缺失值处理 → 图像缩放与归一化 → 动作归一化 → 动作分块(chunk)→ 数据集切分。ACT 训练时通常将动作归一化到 [-1,1],图像归一化到 [0,1] 或使用 ImageNet 均值方差。
# 预处理伪代码
for ep in episodes:
sync = align(ep.images, ep.qpos, ep.action, tol=0.01)
sync = drop_invalid(sync)
imgs = resize(sync.images, (224,224)) / 255.0
acts = normalize(sync.action, mean, std)
chunks = make_chunk(acts, chunk_size=100)
save(chunks)
下图展示了从仿真/真机到训练数据集的完整数据流与关键检查点:
六、常见误区与复盘
误区二:动作与观测时间戳错位。复盘:使用硬件触发或统一时钟,采集后做互相关对齐检查。
误区三:动作归一化参数仅用单条轨迹统计。复盘:应在全数据集上统计均值与标准差,并保存到 meta.json。
误区四:忽略失败轨迹。复盘:保留少量失败数据,有助于策略学习恢复行为。
完成上述环境与数据准备后,即可进入 ACT 模型训练阶段。建议在训练前运行一次“数据体检”脚本,检查 episode 数量、字段维度、时间戳单调性、动作范围与图像亮度分布,确保数据可直接用于训练。