日报 — 2026-03-13
今日概览
- 做了什么: 在 RoboTwin 仿真平台 Place Dual Shoes 任务中新增操作进度与目标位姿等五个每帧变量,移除 critical_region
- 怎么做的: 采用后处理方案:在每次 move() 完成后从仿真器获取终点状态,回溯 patch 对应帧的 pickle 文件,避免在线收集无法获知未来状态的问题
- 有什么用: 为 VLA 模型训练提供了操作进度和目标末端位姿等更丰富的监督信号,推动数据集质量和模型学习能力的提升
为 RoboTwin Place Dual Shoes 机器人任务添加五个新的每帧数据变量,并修复了两个数据收集质量 bug
今日任务
架构与策略
- ✅ 设计新变量数据收集架构方案 — 分析代码库后确定后处理方案:因 target_endpose/target_joint 需要 move() 完成时的终点状态,采用 move() 执行完毕后回溯 patch pkl 文件的方式,pkl2hdf5.py 的通用递归设计无需修改
实现与修复
- ✅ 实现 target_endpose 和 target_joint 变量 — 在每次 move() 完成时从仿真器读取左右手末端执行器位姿和关节状态,作为本次 move 目标状态写入所有对应帧
- ✅ 实现 manip_progress_distance_left/right 变量 — 基于公式 1 - |current-final| / |start-final| 计算左右手操作进度,并 clamp 到 [0,1] 避免曲线路径导致的越界
- ✅ 实现 manip_progress_time 变量 — 在每次 move() 期间按帧数线性插值生成 0→1 的时间进度变量,在 move 开始时置 0,结束时置 1
- ✅ 移除 critical_region 变量 — 最终通过在 pickle patch 阶段显式 pkl_data.pop(‘critical_region’, None) 实现,仅删除子类 override 不够因为基类 get_obs() 无条件写入该字段
问题与解决方案
关键问题
1. target_endpose/target_joint 等变量需要 move() 完成时才能获得的终点状态,在帧收集时无法获知
解决方案: 采用后处理架构:执行 move() 后从仿真器读取终点状态,回溯 patch 该 move 期间所有帧的 pickle 文件
关键洞察: 帧级数据收集与动作执行是流水线关系,依赖未来状态的变量必须 post-process 而非在线收集;pkl2hdf5.py 通用递归设计天然兼容新 key 无需修改
一般问题
2. 删除子类 get_critical_region_label() override 后,HDF5 中仍出现 critical_region 字段
解决方案: 在 move() 的 pickle patch 阶段显式调用 pkl_data.pop(‘critical_region’, None) 删除该字段
关键洞察: 基类 _base_task.py 的 get_obs() 第 510 行无条件调用 get_critical_region_label() 并写入,子类方法重写与否不影响字段出现;必须在数据写出后主动删除
3. manip_progress_distance_left/right 在部分帧出现负值
解决方案: 使用 np.clip 将计算结果强制限制在 [0.0, 1.0]
关键洞察: 机器人末端执行器沿曲线路径运动时,中间帧与终点的距离可能大于起始帧与终点距离,导致进度公式产生负值;基于欧式距离的线性进度指标对非直线路径存在根本局限
人类思路 vs AI 思路
战略层面
新变量的语义定义与计算公式
| 角色 | 思路 |
|---|---|
| 人类 | 人类明确指定了5个变量的名称、语义和精确计算公式,包括 manip_progress_distance 的 1- |
| AI | AI 负责技术落地,识别了’未来知识’问题,提出后处理架构方案,并分析 pkl2hdf5.py 的通用性以确认最小修改范围(仅改一个文件) |
差异分析: 变量语义和公式完全由人类设计,AI 的贡献在于架构选型和工程实现;AI 预判了实现障碍并找到了优雅的绕过方案
实现层面
发现 critical_region 残留 bug
| 角色 | 思路 |
|---|---|
| 人类 | 人类通过实际运行数据收集并检查 HDF5 文件,黑盒发现 critical_region 仍然存在 |
| AI | AI 通过阅读基类源码定位到根因(get_obs() 第 510 行),并给出了确定性的修复方案 |
差异分析: 人类依赖实验验证发现问题,AI 依赖代码分析找到根因;初始设计时 AI 未意识到基类无条件写入行为
发现 manip_progress_distance 负值 bug
| 角色 | 思路 |
|---|---|
| 人类 | 人类通过查看实际收集的数据内容,观察到负值异常 |
| AI | AI 解释了曲线路径导致负值的几何原因,提出 clamp 修复方案 |
差异分析: 人类通过数据检查发现边界情况,AI 提供理论解释;AI 在初始设计时遗漏了非直线路径的边界情况分析
AI 局限性
一般局限
- 未预见到基类 get_obs() 无条件写入 critical_region,误认为删除子类 override 即可移除该字段,导致需要二次修复
- 设计 manip_progress_distance 计算公式时未考虑曲线路径导致中间帧距离超过起始距离的边界情况,遗漏了 [0,1] clamp 处理
今日收获
核心收获
- 当数据变量依赖动作序列完成后的终点状态时,后处理(post-process pickle files)是比在线收集更可靠的架构选择,只要下游 HDF5 转换器足够通用
实践收获
- 修改数据输出前需检查基类是否无条件调用/写入相关字段,仅覆写子类方法可能不足以阻止字段出现在输出中
- 基于欧式距离比值计算的进度指标(1 - dist_current/dist_start)在非直线路径下会产生越界值,需显式 clamp 到有效范围
会话摘要
✅ 设计并实现 Place Dual Shoes 任务新增每帧变量方案 03:39:55.636 | claude_code 用户要求新增 manip_progress_time、manip_progress_distance_left/right、target_endpose、target_joint 五个变量并移除 critical_region。AI 通过深度探索代码库,识别出’未来知识’问题,设计了后处理架构方案(每次 move 完成后 patch pickle 文件)。最终仅修改 envs/place_dual_shoes.py 一个文件完成实现,并验证 pkl2hdf5.py 通用性无需额外改动。
✅ 修复 critical_region 残留与进度值负数两个数据质量 bug 15:34:27.123 | claude_code 用户运行数据收集后发现两个问题:HDF5 中仍含 critical_region 字段,以及 manip_progress_distance 出现负值。AI 分别查明根因:前者是基类 get_obs() 无条件写入(需在 patch 阶段 pop),后者是曲线轨迹导致的边界情况(需 clamp 到 [0,1])。两个修复均通过 Edit 工具直接完成。
❌ 激活 conda 环境(中断) 03:18:46.380 | claude_code 用户尝试激活 RefineVLA conda 环境,立即中断,未产生实质性工作内容。
Token 用量
总览
| 指标 | 数值 |
|---|---|
| 总 Token | 2,990,494 |
| 输入 Token | 8,194 |
| 输出 Token | 18,379 |
| Cache 创建 | 220,846 |
| Cache 读取 | 2,743,075 |
| Cache 命中率 | 92.5% |
| 总费用 (USD) | $2.2262 |
模型明细
| 模型 | 输入 | 输出 | Cache 创建 | Cache 读取 | 费用 | 占比 |
|---|---|---|---|---|---|---|
| claude-opus-4-6 | 7,249 | 11,250 | 122,108 | 1,777,939 | $1.9696 | 88.5% |
| claude-haiku-4-5-20251001 | 945 | 7,129 | 98,738 | 965,136 | $0.2565 | 11.5% |