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 个复杂任务:
ClutterPlasticTaskClearOrganicObjectsTaskElectronicsInBinTaskBlackItemsInBinTaskCondimentsInBinTaskDishesInBinTaskRubiksCubesInBinTaskFruitsOnPlateTask
这 8 个任务对应的 tabletop scene 约 6 个:
clutter_fruit_bottle_bluebin.usdaworkdesk_bin.usdabin_condiments.usdamugs2_bananas2_ketchup_rubiks3_bin.usdatoys_cleanup.usdafruits_out_of_basket.usda
其中有复用:
ClutterPlasticTask/ClearOrganicObjectsTask-> 同一个 sceneElectronicsInBinTask/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 条 |
建议路线:
- 第一阶段:8 个复杂任务 x 50 条 = 400 条,每条 150 帧。
- 第二阶段:20-30 个任务 x 50-100 条 = 1000-3000 条。
- 如果目标是三维重建,优先保证相机轨迹变化、视角覆盖、物体位置、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
它会保存:
terminatedtruncated
但不会因为 success=True 就 break。
所以如果设置:
--num-steps 300
它会尽量录满 300 env steps。配合:
--record-every 2
最后约 150 帧。
如果真的想“成功后提前停止”,需要额外加一个参数,比如:
--stop-on-success
但现在默认不是这样。
100 多个任务的大体类型
这 100 多个任务大体可以分成下面这些类型。RoboLab 更像“桌面整理 / 桌面操作 benchmark”,不是纯随机场景库。
1. 放进容器类
这是最多的一类,也最适合当前造数据。
典型任务:
BananaInBowlTaskRubiksCubeTaskAnimalsInBinTaskToyInBinTaskSmartphoneInBinTaskElectronicsInBinTaskBlackItemsInBinTaskCondimentsInBinTaskDishesInBinTaskClutterPlasticTaskClearOrganicObjectsTaskRubiksCubesInBinTaskWhiteMugsInBinTaskYellowAndWhiteObjectsInBinTask
特点:桌上很多东西,目标是把某类东西放进 bin / bowl / crate / pail / mug / pot,适合做复杂前景、多物体、机械臂运动数据。
2. 按语义类别整理
任务不是指定一个具体物体,而是按类别选物体。
典型任务:
ClearOrganicObjectsTaskElectronicsInBinTaskCondimentsInBinTaskDishesInBinTaskRubiksCubesInBinTaskPlasticBottlesInSquarePailTaskToolsPickingAllHammersTask
特点:需要识别“类别”,场景通常比较复杂,适合训练泛化视觉表征。
3. 按颜色筛选
典型任务:
BlackItemsInBinTaskRedItemsInBinTaskRedDishesInBinTaskFruitsGreenLimesOnPlateTaskPickUpBluePitcherTaskPickUpGreenObjectTaskGreenSpoonsInPotTaskPinkSpoonInPotTaskWhiteMugsInBinTaskYellowAndWhiteObjectsInBinTask
特点:视觉区分明显,适合做颜色、材质、物体识别相关训练。
4. 空间关系类
目标是“放到左边/右边/前面/后面/上面/架子上”。
典型任务:
RubiksCubeLeftOfBowlTaskRubiksCubeRightOfBowlTaskRubiksCubeInFrontOfBowlTaskRubiksCubeBehindBowlTaskButterAboveRaisinTaskMustardAboveRaisinTaskPutBowlOnShelfTopTaskPutMugsOnShelfTaskTakeSpatulaOffShelfTaskKeyboardOutOfBinTaskWhiteMugInCenterOfTableTask
特点:相机 pose / depth / 3D 几何更重要,适合三维空间理解。
5. 计数类
目标里有数量要求。
典型任务:
BananasInBinOneMoreTaskBananasInBinThreeTotalTaskBananasInCrateTaskFruitsOnPlate3TaskPutTwoMugsOnShelfTask
特点:需要数物体,场景通常有多个同类物体。
6. 顺序任务 / 组合任务
任务里有“先 A 再 B”或“A 和 B 都要做”。
典型任务:
BananaThenRubiksCubeTaskRubiksCubeThenBananaTaskRubiksCubeAndBananaTaskRubiksCubeOrBananaTaskAppleAndYogurtInBowlTaskFoodPackingByColorTaskToolOrganizationBothTask
特点:轨迹更长,动作阶段更多,更适合训练长序列,但 policy 成功率可能更不稳定。
7. 堆叠 / 反堆叠
典型任务:
BlockStackingOrderAgnosticTaskBlockStackingSpecifiedOrderTaskStack3RubiksCubeTaskStackWhiteMugsTaskStackYellowOnRedTaskUnstackRubiksCubeTaskBowlStackingLeftOnRightTaskBowlStackingRightOnLeftTask
特点:很适合三维重建和接触几何,但 policy 难度更高。
8. 重定向 / 摆正物体
典型任务:
ReorientAllMugsTaskReorientRedMugTaskReorientWhiteMugsTaskReorientJugTaskSpoonsInPotTaskGreenSpoonsInPotTaskPinkSpoonInPotTask
特点:姿态变化明显,适合训练 pose / orientation / manipulation。
9. 取出 / 拿起 / 选择类
典型任务:
GrabABagelTaskGrabAFruitTaskPickDrillTaskPickGlassesTaskPickOrangeObjectTaskToolsPickingDrillTaskToolsPickingHammerTaskTakeMugsOffOfShelfTaskTakeMeasuringSpoonOutTaskKeyboardOutOfBinTaskBananasOutOfBinTask
特点:轨迹比较直接,机械臂运动清晰,适合做手眼数据。
10. 食物 / 厨房 / 早餐桌类
Breakfast table:
GrabABagelTaskGrabAFruitTaskMoveBananaToBagelPlateTaskUtensilsInMugTaskYogurtInBowlTask
Fruit scenes:
FruitsOnPlateTaskFruitsOnPlate3TaskFruitsOrangesOnPlateTaskFruitsMovingTaskFruitsOnionTaskWoodSpatulaToBowlTask
Cooking table:
CookingClearPlateTaskCookingPickPastaToolTaskPickOrangeObjectTask
特点:颜色丰富,物体多,适合做视觉多样性。
11. 办公桌 / 电子设备类
典型任务:
ElectronicsInBinTaskBlackItemsInBinTaskSmartphoneInBinTaskPhoneOrRemoteInBinTaskMouseOnKeyboardTaskMarkerInMugTaskPickGlassesTaskSpoonInMugTask
特点:桌面复杂,物体纹理比较真实,很适合“前景复杂”。
12. 工具整理类
典型任务:
ToolOrganizationTaskToolOrganizationBothTaskHammersInLeftBinTaskNonHammerToolsInRightBinTaskClampInRightBinTaskPickDrillTaskToolsPickingHammerTaskToolsPickingDrillTaskToolsPickingAllHammersTask
特点:物体形状差异大,适合几何和实例识别。
13. 货架 / 清洁用品类
典型任务:
JugsOnShelfTaskOneBottleInSquarePailTaskOneBottleOnShelfTaskPlasticBottlesInSquarePailTaskReorientJugTaskPutBowlOnShelfTopTaskPutMugsOnShelfTaskTakeMugsOffOfShelfTask
特点:有 shelf / pail / jug,场景和普通平桌不同,可以增加场景多样性。
14. 包装 / 回收类
典型任务:
FoodPacking1BoxesTaskFoodPacking1CansTaskFoodPacking2BoxesTaskFoodPacking2CansTaskFoodPacking3BoxesTaskFoodPacking3CansTaskFoodPackingByColorTaskRecycleCartonTaskRecycleCartonsOnBoxTaskRecycleCartonsVerticalCrateTask
特点:容器、箱子、纸盒多,适合增加非圆形、非水果类物体。
最适合当前目标的任务类型
当前需求是:
- stereo RGB
- depth
- camera pose
- 复杂前景
- 有运动机械臂 / 物体
- 不要太重复
优先选择这些类型:
- 复杂整理类
- 语义分类类
- 办公桌类
- 水果 / 厨房类
- 工具类
- 货架 / 瓶子类
优先任务:
ClutterPlasticTaskClearOrganicObjectsTaskElectronicsInBinTaskBlackItemsInBinTaskCondimentsInBinTaskDishesInBinTaskRubiksCubesInBinTaskFruitsOnPlateTaskToolsPickingAllHammersTaskToolsPickingDrillTaskToolOrganizationTaskPlasticBottlesInSquarePailTaskJugsOnShelfTaskFoodPackingByColorTaskRecycleCartonTask
不建议第一批大量使用:
- 单 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:办公桌上的电子物品 + binClutterPlasticTask:一堆水果 / 瓶子 / 塑料物 + binCondimentsInBinTask:调料瓶 + bin
动作类型主要是桌面机械臂操作
包括:
- 抓取
- 放入容器
- 分类
- 清理桌面
- 按颜色 / 类别挑选
- 堆叠
- 摆正
- 移动到指定位置
机械臂能不能换样式
理论上可以换成 UR5、Kinova、ALOHA 等,但这不是简单改一个参数。
因为以下内容都和 Franka 绑定得比较深:
- policy
- IK
- 关节数
- 末端执行器
- 相机挂载点
- 动作维度
- 控制器配置
如果只是为了“造视觉数据”,可以优先不换机械臂,通过随机相机、桌面物体、背景、光照、distractor 来扩展多样性。
如果为了训练另一个机器人 policy,才需要系统性更换:
- robot asset
- controller
- action mapping
- policy 适配
- 相机挂载和外参
一句话总结
RoboLab 不是:
一个桌面 + 一个机械臂 + 换物体做任务
而是:
同一个默认机械臂,在多个预设桌面场景里,对不同物体集合执行不同桌面操作
当前数据生成脚本已经可以在这些任务上额外加入:
- 随机物体
- 随机位姿
- 随机背景
- 随机相机轨迹
- wrist 双目