跳到主要内容

robolab_codex

这篇笔记记录一次关于 RoboLab 任务类型、场景绑定、机械臂和 stereo 训练数据生成规模的讨论。

训练数据规模问题

问题

主要我想弄清楚大概能搓多少条训练数据:

  • 当前有多少个任务?
  • 当前桌面的环境,不是周围的墙壁那种背景,是不是和任务绑定的?
  • 当前场景有多少个可以选择?
  • 物体的种类又多少?
  • 如果我想生成数据,每个数据大概 300 帧,最后生成的数据不要太重复,应该如何搭配,大概能搓多少条数据出来?

回答

大概可以这样理解。

当前 RoboLab 里大致是:

项目规模
正式任务 metadata约 120 个
任务文件粗略扫描132 个 task class / 136 个 py 文件
任务实际用到的 tabletop scene约 49 个
assets/scenes 里可用 scene USD约 68-71 个
assets/objects 里 USD 物体资产约 312 个
任务 contact_object 名称约 149 种

所以“全库资源”不小,但不是所有东西都能自由排列组合。

桌面环境是否和任务绑定

是的,当前 RoboLab 的任务基本和 scene 绑定。

任务文件里通常是这种结构:

scene = import_scene("clutter_fruit_bottle_bluebin.usda", contact_object_list)

也就是说:

Task -> 固定 scene -> 固定桌面/桌上物体集合/容器/任务目标

现在可以随机的是:

  • 随机背景
  • 随机光照
  • 随机物体位姿
  • 随机 distractor
  • 随机相机轨迹

这些是在“任务绑定的桌面场景”上做扰动。周围墙壁或环境背景可以随机,但桌面本身、基础场景布局默认还是跟任务绑定。

如果想“同一个任务换不同桌面环境”,那不是简单参数能换,需要新建或复制 task,让它 import_scene() 到另一个 scene,并重新定义 contact objects / success condition。

当前批量脚本实际用了多少

当前 generate_random_complex_series.sh 只用了 8 个复杂任务:

  • ClutterPlasticTask
  • ClearOrganicObjectsTask
  • ElectronicsInBinTask
  • BlackItemsInBinTask
  • CondimentsInBinTask
  • DishesInBinTask
  • RubiksCubesInBinTask
  • FruitsOnPlateTask

这 8 个任务对应的 tabletop scene 约 6 个:

  • clutter_fruit_bottle_bluebin.usda
  • workdesk_bin.usda
  • bin_condiments.usda
  • mugs2_bananas2_ketchup_rubiks3_bin.usda
  • toys_cleanup.usda
  • fruits_out_of_basket.usda

其中有复用:

  • ClutterPlasticTask / ClearOrganicObjectsTask -> 同一个 scene
  • ElectronicsInBinTask / BlackItemsInBinTask -> 同一个 scene

所以当前脚本不是在用全库 120 个任务,而是在用“8 个适合复杂桌面整理的任务”。

每条数据有多少帧

当前默认:

STEPS=300
RECORD_EVERY=2

RoboLab 环境 step 约 15Hz,record_every=2 后记录约 7.5Hz。

所以每条 HDF5:

300 env steps -> 150 recorded frames
约 20 秒仿真时间
约 10 秒视频预览

如果真的要每条数据 300 帧,需要:

STEPS=600 RECORD_EVERY=2

或者:

STEPS=300 RECORD_EVERY=1

但文件会接近翻倍。

不要太重复时怎么搭配

建议把“一条数据”看成下面这些维度的组合:

  • 任务 task
  • scene / tabletop
  • 相机轨迹 seed
  • 背景 seed
  • 光照 preset
  • 已有物体位姿 seed / range
  • 真实 distractor seed / 数量 / 资产
  • policy rollout stochasticity / 初始状态

当前脚本里已经随机了:

  • 8 tasks
  • 7 lighting
  • background seed
  • camera orbit seed
  • object pose
  • real distractors

保守估算,不太重复的数据量:

范围估计
当前 8-task 脚本每个 task 50-150 条比较稳
总计400-1200 条
更激进每个 task 200-300 条
更激进总计1600-2400 条

但后面会开始出现“同一个桌面、同一类任务、只是物体微动”的相似性。对三维重建训练还可以,对泛化训练就会有重复感。

如果扩展到更多 RoboLab 任务,比如从 120 个正式任务里筛出 30-50 个适合桌面操作、policy 能跑的任务:

配置数据量
30 tasks x 50 条1500 条
50 tasks x 50 条2500 条
50 tasks x 100 条5000 条

建议路线:

  1. 第一阶段:8 个复杂任务 x 50 条 = 400 条,每条 150 帧。
  2. 第二阶段:20-30 个任务 x 50-100 条 = 1000-3000 条。
  3. 如果目标是三维重建,优先保证相机轨迹变化、视角覆盖、物体位置、distractor 和光照变化。

任务成功率反而不是第一优先级。三维重建数据可以允许机械臂不一定每次成功完成任务,但画面里最好有足够的运动、遮挡、视角变化和复杂前景。

132 个任务分别是什么

导出了完整清单:

/autodl-fs/data/robolab/output/stereo_dataset/random_complex_series/task_scene_inventory.csv

里面每行是:

task_name, scene, object_count, objects, file

任务数量粗扫:

  • task class:132 个
  • metadata 正式任务:约 120 个

里面包含:

  • benchmark 正式任务
  • randomize_initial_pose 变体任务
  • test_tasks 测试任务

更建议以 metadata 里的正式任务为准。

桌面物体能不能改

可以,但分三层。

第一层:改位置和朝向

已经支持:

--randomize-object-pose
--randomize-objects obj1 obj2 obj3
--object-xy-range 0.04
--object-yaw-range 0.8

这会随机已有物体的位置和 yaw。

第二层:额外添加真实 distractor

已经支持:

--add-random-distractors
--distractor-mode real
--num-distractors 12
--distractor-seed 123

这会往桌面上加额外物体,适合增加视觉复杂度。它们一般不参与任务成功条件。

第三层:改 task / scene

如果要改变任务物体集合、数量、目标容器、成功条件,就需要改 task 或 scene。

例如想让 ClutterPlasticTask 里多几个“必须放进 bin 的瓶子”,不能只加 distractor,还要改:

  • contact_object_list
  • scene 或 spawn 逻辑
  • termination / success condition
  • instruction
  • subtasks

否则 policy 和任务判定并不知道这些新物体是任务目标。

policy 会不会成功后提前停止录制

当前 generate_stereo_dataset.py 不会。

现在逻辑是固定循环:

for step in range(num_steps):
...
obs, _, term, trunc, _ = env.step(actions)
...
# 写入 rgb/depth/pose/action/terminated/truncated

它会保存:

  • terminated
  • truncated

但不会因为 success=Truebreak

所以如果设置:

--num-steps 300

它会尽量录满 300 env steps。配合:

--record-every 2

最后约 150 帧。

如果真的想“成功后提前停止”,需要额外加一个参数,比如:

--stop-on-success

但现在默认不是这样。

100 多个任务的大体类型

这 100 多个任务大体可以分成下面这些类型。RoboLab 更像“桌面整理 / 桌面操作 benchmark”,不是纯随机场景库。

1. 放进容器类

这是最多的一类,也最适合当前造数据。

典型任务:

  • BananaInBowlTask
  • RubiksCubeTask
  • AnimalsInBinTask
  • ToyInBinTask
  • SmartphoneInBinTask
  • ElectronicsInBinTask
  • BlackItemsInBinTask
  • CondimentsInBinTask
  • DishesInBinTask
  • ClutterPlasticTask
  • ClearOrganicObjectsTask
  • RubiksCubesInBinTask
  • WhiteMugsInBinTask
  • YellowAndWhiteObjectsInBinTask

特点:桌上很多东西,目标是把某类东西放进 bin / bowl / crate / pail / mug / pot,适合做复杂前景、多物体、机械臂运动数据。

2. 按语义类别整理

任务不是指定一个具体物体,而是按类别选物体。

典型任务:

  • ClearOrganicObjectsTask
  • ElectronicsInBinTask
  • CondimentsInBinTask
  • DishesInBinTask
  • RubiksCubesInBinTask
  • PlasticBottlesInSquarePailTask
  • ToolsPickingAllHammersTask

特点:需要识别“类别”,场景通常比较复杂,适合训练泛化视觉表征。

3. 按颜色筛选

典型任务:

  • BlackItemsInBinTask
  • RedItemsInBinTask
  • RedDishesInBinTask
  • FruitsGreenLimesOnPlateTask
  • PickUpBluePitcherTask
  • PickUpGreenObjectTask
  • GreenSpoonsInPotTask
  • PinkSpoonInPotTask
  • WhiteMugsInBinTask
  • YellowAndWhiteObjectsInBinTask

特点:视觉区分明显,适合做颜色、材质、物体识别相关训练。

4. 空间关系类

目标是“放到左边/右边/前面/后面/上面/架子上”。

典型任务:

  • RubiksCubeLeftOfBowlTask
  • RubiksCubeRightOfBowlTask
  • RubiksCubeInFrontOfBowlTask
  • RubiksCubeBehindBowlTask
  • ButterAboveRaisinTask
  • MustardAboveRaisinTask
  • PutBowlOnShelfTopTask
  • PutMugsOnShelfTask
  • TakeSpatulaOffShelfTask
  • KeyboardOutOfBinTask
  • WhiteMugInCenterOfTableTask

特点:相机 pose / depth / 3D 几何更重要,适合三维空间理解。

5. 计数类

目标里有数量要求。

典型任务:

  • BananasInBinOneMoreTask
  • BananasInBinThreeTotalTask
  • BananasInCrateTask
  • FruitsOnPlate3Task
  • PutTwoMugsOnShelfTask

特点:需要数物体,场景通常有多个同类物体。

6. 顺序任务 / 组合任务

任务里有“先 A 再 B”或“A 和 B 都要做”。

典型任务:

  • BananaThenRubiksCubeTask
  • RubiksCubeThenBananaTask
  • RubiksCubeAndBananaTask
  • RubiksCubeOrBananaTask
  • AppleAndYogurtInBowlTask
  • FoodPackingByColorTask
  • ToolOrganizationBothTask

特点:轨迹更长,动作阶段更多,更适合训练长序列,但 policy 成功率可能更不稳定。

7. 堆叠 / 反堆叠

典型任务:

  • BlockStackingOrderAgnosticTask
  • BlockStackingSpecifiedOrderTask
  • Stack3RubiksCubeTask
  • StackWhiteMugsTask
  • StackYellowOnRedTask
  • UnstackRubiksCubeTask
  • BowlStackingLeftOnRightTask
  • BowlStackingRightOnLeftTask

特点:很适合三维重建和接触几何,但 policy 难度更高。

8. 重定向 / 摆正物体

典型任务:

  • ReorientAllMugsTask
  • ReorientRedMugTask
  • ReorientWhiteMugsTask
  • ReorientJugTask
  • SpoonsInPotTask
  • GreenSpoonsInPotTask
  • PinkSpoonInPotTask

特点:姿态变化明显,适合训练 pose / orientation / manipulation。

9. 取出 / 拿起 / 选择类

典型任务:

  • GrabABagelTask
  • GrabAFruitTask
  • PickDrillTask
  • PickGlassesTask
  • PickOrangeObjectTask
  • ToolsPickingDrillTask
  • ToolsPickingHammerTask
  • TakeMugsOffOfShelfTask
  • TakeMeasuringSpoonOutTask
  • KeyboardOutOfBinTask
  • BananasOutOfBinTask

特点:轨迹比较直接,机械臂运动清晰,适合做手眼数据。

10. 食物 / 厨房 / 早餐桌类

Breakfast table:

  • GrabABagelTask
  • GrabAFruitTask
  • MoveBananaToBagelPlateTask
  • UtensilsInMugTask
  • YogurtInBowlTask

Fruit scenes:

  • FruitsOnPlateTask
  • FruitsOnPlate3Task
  • FruitsOrangesOnPlateTask
  • FruitsMovingTask
  • FruitsOnionTask
  • WoodSpatulaToBowlTask

Cooking table:

  • CookingClearPlateTask
  • CookingPickPastaToolTask
  • PickOrangeObjectTask

特点:颜色丰富,物体多,适合做视觉多样性。

11. 办公桌 / 电子设备类

典型任务:

  • ElectronicsInBinTask
  • BlackItemsInBinTask
  • SmartphoneInBinTask
  • PhoneOrRemoteInBinTask
  • MouseOnKeyboardTask
  • MarkerInMugTask
  • PickGlassesTask
  • SpoonInMugTask

特点:桌面复杂,物体纹理比较真实,很适合“前景复杂”。

12. 工具整理类

典型任务:

  • ToolOrganizationTask
  • ToolOrganizationBothTask
  • HammersInLeftBinTask
  • NonHammerToolsInRightBinTask
  • ClampInRightBinTask
  • PickDrillTask
  • ToolsPickingHammerTask
  • ToolsPickingDrillTask
  • ToolsPickingAllHammersTask

特点:物体形状差异大,适合几何和实例识别。

13. 货架 / 清洁用品类

典型任务:

  • JugsOnShelfTask
  • OneBottleInSquarePailTask
  • OneBottleOnShelfTask
  • PlasticBottlesInSquarePailTask
  • ReorientJugTask
  • PutBowlOnShelfTopTask
  • PutMugsOnShelfTask
  • TakeMugsOffOfShelfTask

特点:有 shelf / pail / jug,场景和普通平桌不同,可以增加场景多样性。

14. 包装 / 回收类

典型任务:

  • FoodPacking1BoxesTask
  • FoodPacking1CansTask
  • FoodPacking2BoxesTask
  • FoodPacking2CansTask
  • FoodPacking3BoxesTask
  • FoodPacking3CansTask
  • FoodPackingByColorTask
  • RecycleCartonTask
  • RecycleCartonsOnBoxTask
  • RecycleCartonsVerticalCrateTask

特点:容器、箱子、纸盒多,适合增加非圆形、非水果类物体。

最适合当前目标的任务类型

当前需求是:

  • stereo RGB
  • depth
  • camera pose
  • 复杂前景
  • 有运动机械臂 / 物体
  • 不要太重复

优先选择这些类型:

  • 复杂整理类
  • 语义分类类
  • 办公桌类
  • 水果 / 厨房类
  • 工具类
  • 货架 / 瓶子类

优先任务:

  • ClutterPlasticTask
  • ClearOrganicObjectsTask
  • ElectronicsInBinTask
  • BlackItemsInBinTask
  • CondimentsInBinTask
  • DishesInBinTask
  • RubiksCubesInBinTask
  • FruitsOnPlateTask
  • ToolsPickingAllHammersTask
  • ToolsPickingDrillTask
  • ToolOrganizationTask
  • PlasticBottlesInSquarePailTask
  • JugsOnShelfTask
  • FoodPackingByColorTask
  • RecycleCartonTask

不建议第一批大量使用:

  • 单 banana / rubiks / bowl 简单任务
  • 纯空间关系小场景
  • 纯测试任务

它们数据会比较单调。

是否是同一个桌面、同一个机械臂

不是完全“同一个桌面”。更准确地说,RoboLab 这批任务大体是:

同一种默认机械臂

现在默认是 Franka + Robotiq 2F-85 夹爪,资产在:

/autodl-fs/data/robolab/assets/robots/franka_robotiq_2f_85_flattened.usd

多个固定桌面场景

每个 Task 通常绑定一个固定 scene .usda

所以不是所有 132 个任务都在同一张桌子上,而是大约几十个不同桌面、货架、厨房、工作台场景反复被不同任务使用。

每个任务有自己的目标物体集合

例如:

  • BananaInBowlTask:香蕉、碗
  • ElectronicsInBinTask:办公桌上的电子物品 + bin
  • ClutterPlasticTask:一堆水果 / 瓶子 / 塑料物 + bin
  • CondimentsInBinTask:调料瓶 + bin

动作类型主要是桌面机械臂操作

包括:

  • 抓取
  • 放入容器
  • 分类
  • 清理桌面
  • 按颜色 / 类别挑选
  • 堆叠
  • 摆正
  • 移动到指定位置

机械臂能不能换样式

理论上可以换成 UR5、Kinova、ALOHA 等,但这不是简单改一个参数。

因为以下内容都和 Franka 绑定得比较深:

  • policy
  • IK
  • 关节数
  • 末端执行器
  • 相机挂载点
  • 动作维度
  • 控制器配置

如果只是为了“造视觉数据”,可以优先不换机械臂,通过随机相机、桌面物体、背景、光照、distractor 来扩展多样性。

如果为了训练另一个机器人 policy,才需要系统性更换:

  • robot asset
  • controller
  • action mapping
  • policy 适配
  • 相机挂载和外参

一句话总结

RoboLab 不是:

一个桌面 + 一个机械臂 + 换物体做任务

而是:

同一个默认机械臂,在多个预设桌面场景里,对不同物体集合执行不同桌面操作

当前数据生成脚本已经可以在这些任务上额外加入:

  • 随机物体
  • 随机位姿
  • 随机背景
  • 随机相机轨迹
  • wrist 双目