lsnu commited on
Commit
a9e0685
·
verified ·
1 Parent(s): ddc5223

Add files using upload-large-folder tool

Browse files
Files changed (50) hide show
  1. FILE_MANIFEST.txt +65 -0
  2. MODEL_INDEX.md +25 -0
  3. README.md +72 -6
  4. artifacts/outputs/interaction_debug/peract2_13_rollout_noplan_split/bimanual_lift_ball/rollout_eval.json +31 -0
  5. artifacts/outputs/interaction_debug/peract2_13_rollout_noplan_split/bimanual_lift_ball/rollout_eval.md +11 -0
  6. artifacts/outputs/interaction_debug/peract2_13_rollout_noplan_split/bimanual_push_box/rollout_eval.json +31 -0
  7. artifacts/outputs/interaction_debug/peract2_13_rollout_noplan_split/bimanual_push_box/rollout_eval.md +11 -0
  8. artifacts/outputs/interaction_debug/peract2_13_rollout_plan_split/bimanual_handover_item/rollout_eval.json +31 -0
  9. artifacts/outputs/interaction_debug/peract2_13_rollout_plan_split/bimanual_handover_item/rollout_eval.md +11 -0
  10. artifacts/outputs/interaction_debug/peract2_13_rollout_plan_split/bimanual_handover_item_easy/rollout_eval.json +31 -0
  11. artifacts/outputs/interaction_debug/peract2_13_rollout_plan_split/bimanual_handover_item_easy/rollout_eval.md +11 -0
  12. artifacts/outputs/interaction_debug/peract2_13_rollout_plan_split/bimanual_lift_tray/rollout_eval.json +31 -0
  13. artifacts/outputs/interaction_debug/peract2_13_rollout_plan_split/bimanual_lift_tray/rollout_eval.md +11 -0
  14. artifacts/outputs/interaction_debug/peract2_13_rollout_plan_split/bimanual_pick_laptop/rollout_eval.json +31 -0
  15. artifacts/outputs/interaction_debug/peract2_13_rollout_plan_split/bimanual_pick_laptop/rollout_eval.md +11 -0
  16. artifacts/outputs/interaction_debug/peract2_13_rollout_plan_split/bimanual_pick_plate/rollout_eval.md +11 -0
  17. artifacts/outputs/interaction_debug/peract2_13_rollout_plan_split/bimanual_put_bottle_in_fridge/rollout_eval.json +31 -0
  18. artifacts/outputs/interaction_debug/peract2_13_rollout_plan_split/bimanual_put_bottle_in_fridge/rollout_eval.md +11 -0
  19. artifacts/outputs/interaction_debug/peract2_13_rollout_plan_split/bimanual_put_item_in_drawer/rollout_eval.json +31 -0
  20. artifacts/outputs/interaction_debug/peract2_13_rollout_plan_split/bimanual_put_item_in_drawer/rollout_eval.md +11 -0
  21. artifacts/outputs/interaction_debug/peract2_13_rollout_plan_split/bimanual_straighten_rope/rollout_eval.json +31 -0
  22. artifacts/outputs/interaction_debug/peract2_13_rollout_plan_split/bimanual_straighten_rope/rollout_eval.md +11 -0
  23. artifacts/outputs/interaction_debug/peract2_13_rollout_plan_split/bimanual_sweep_to_dustpan/rollout_eval.json +31 -0
  24. artifacts/outputs/interaction_debug/peract2_13_rollout_plan_split/bimanual_sweep_to_dustpan/rollout_eval.md +11 -0
  25. artifacts/outputs/interaction_debug/peract2_13_rollout_plan_split/bimanual_take_tray_out_of_oven/rollout_eval.json +31 -0
  26. artifacts/outputs/interaction_debug/peract2_13_rollout_plan_split/bimanual_take_tray_out_of_oven/rollout_eval.md +11 -0
  27. artifacts/outputs/interaction_debug/peract2_13_rollout_plan_split/rollout_eval.json +185 -0
  28. artifacts/outputs/interaction_debug/peract2_13_rollout_plan_split/rollout_eval.md +22 -0
  29. artifacts/outputs/interaction_debug/peract2_bimanual_push_box_launch_smoke.json +35 -0
  30. artifacts/outputs/interaction_debug/peract2_import_smoke.json +18 -0
  31. artifacts/outputs/interaction_debug/peract2_import_train_command.txt +1 -0
  32. artifacts/outputs/interaction_debug/peract2_smoke_push_box_plan/rollout_eval.json +31 -0
  33. artifacts/outputs/interaction_debug/peract2_smoke_push_box_plan/rollout_eval.md +11 -0
  34. code/reveal_vla_bimanual/eval/run_peract2_task_sweep.py +210 -0
  35. code/reveal_vla_bimanual/eval/run_rlbench_rollout_eval.py +53 -73
  36. code/reveal_vla_bimanual/models/backbones.py +29 -2
  37. code/reveal_vla_bimanual/scripts/setup_env_a_rlbench.sh +15 -4
  38. code/reveal_vla_bimanual/sim_rlbench/camera_spec.py +17 -4
  39. code/reveal_vla_bimanual/sim_rlbench/dataset.py +16 -16
  40. code/reveal_vla_bimanual/sim_rlbench/generate_smoke_dataset.py +15 -21
  41. code/reveal_vla_bimanual/sim_rlbench/launch_smoke.py +49 -34
  42. code/reveal_vla_bimanual/sim_rlbench/obs_adapter.py +18 -24
  43. code/reveal_vla_bimanual/sim_rlbench/obs_config.py +40 -0
  44. code/reveal_vla_bimanual/sim_rlbench/peract2_runner.py +1 -1
  45. code/reveal_vla_bimanual/sim_rlbench/smoke_test.py +1 -1
  46. code/reveal_vla_bimanual/sim_rlbench/task_resolver.py +11 -0
  47. environment/run_peract2_13_rollouts.sh +57 -0
  48. environment/setup_same_machine.sh +13 -5
  49. environment/upstream_revisions.txt +18 -2
  50. environment/validate_same_machine.sh +3 -3
FILE_MANIFEST.txt CHANGED
@@ -117,6 +117,67 @@
117
  ./artifacts/outputs/interaction_debug/ablation_short_history_actionhist/reveal_benchmark.json
118
  ./artifacts/outputs/interaction_debug/ablation_short_history_actionhist/reveal_benchmark.md
119
  ./artifacts/outputs/interaction_debug/chunk_debug_trace.json
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
120
  ./artifacts/outputs/interaction_debug/proxy_interaction_state_actionhist/checkpoint_best.pt
121
  ./artifacts/outputs/interaction_debug/proxy_interaction_state_actionhist/config_resolved.yaml
122
  ./artifacts/outputs/interaction_debug/proxy_interaction_state_actionhist/diagnostics/proxy_diagnostics.json
@@ -268,6 +329,7 @@
268
  ./code/reveal_vla_bimanual/eval/metrics.py
269
  ./code/reveal_vla_bimanual/eval/report.py
270
  ./code/reveal_vla_bimanual/eval/run_ablations.py
 
271
  ./code/reveal_vla_bimanual/eval/run_proxy_diagnostics.py
272
  ./code/reveal_vla_bimanual/eval/run_reveal_benchmark.py
273
  ./code/reveal_vla_bimanual/eval/run_rlbench_rollout_eval.py
@@ -311,8 +373,10 @@
311
  ./code/reveal_vla_bimanual/sim_rlbench/generate_smoke_dataset.py
312
  ./code/reveal_vla_bimanual/sim_rlbench/launch_smoke.py
313
  ./code/reveal_vla_bimanual/sim_rlbench/obs_adapter.py
 
314
  ./code/reveal_vla_bimanual/sim_rlbench/peract2_runner.py
315
  ./code/reveal_vla_bimanual/sim_rlbench/smoke_test.py
 
316
  ./code/reveal_vla_bimanual/sim_rlbench/task_splits.py
317
  ./code/reveal_vla_bimanual/train/__init__.py
318
  ./code/reveal_vla_bimanual/train/configs/base.yaml
@@ -355,6 +419,7 @@
355
  ./environment/rlbench_env_explicit.txt
356
  ./environment/rlbench_env_export.yaml
357
  ./environment/rlbench_pip_freeze.txt
 
358
  ./environment/setup_same_machine.sh
359
  ./environment/system_packages_same_machine.txt
360
  ./environment/upstream_revisions.txt
 
117
  ./artifacts/outputs/interaction_debug/ablation_short_history_actionhist/reveal_benchmark.json
118
  ./artifacts/outputs/interaction_debug/ablation_short_history_actionhist/reveal_benchmark.md
119
  ./artifacts/outputs/interaction_debug/chunk_debug_trace.json
120
+ ./artifacts/outputs/interaction_debug/peract2_13_rollout_noplan_split/bimanual_dual_push_buttons/rollout_eval.json
121
+ ./artifacts/outputs/interaction_debug/peract2_13_rollout_noplan_split/bimanual_dual_push_buttons/rollout_eval.md
122
+ ./artifacts/outputs/interaction_debug/peract2_13_rollout_noplan_split/bimanual_handover_item/rollout_eval.json
123
+ ./artifacts/outputs/interaction_debug/peract2_13_rollout_noplan_split/bimanual_handover_item/rollout_eval.md
124
+ ./artifacts/outputs/interaction_debug/peract2_13_rollout_noplan_split/bimanual_handover_item_easy/rollout_eval.json
125
+ ./artifacts/outputs/interaction_debug/peract2_13_rollout_noplan_split/bimanual_handover_item_easy/rollout_eval.md
126
+ ./artifacts/outputs/interaction_debug/peract2_13_rollout_noplan_split/bimanual_lift_ball/rollout_eval.json
127
+ ./artifacts/outputs/interaction_debug/peract2_13_rollout_noplan_split/bimanual_lift_ball/rollout_eval.md
128
+ ./artifacts/outputs/interaction_debug/peract2_13_rollout_noplan_split/bimanual_lift_tray/rollout_eval.json
129
+ ./artifacts/outputs/interaction_debug/peract2_13_rollout_noplan_split/bimanual_lift_tray/rollout_eval.md
130
+ ./artifacts/outputs/interaction_debug/peract2_13_rollout_noplan_split/bimanual_pick_laptop/rollout_eval.json
131
+ ./artifacts/outputs/interaction_debug/peract2_13_rollout_noplan_split/bimanual_pick_laptop/rollout_eval.md
132
+ ./artifacts/outputs/interaction_debug/peract2_13_rollout_noplan_split/bimanual_pick_plate/rollout_eval.json
133
+ ./artifacts/outputs/interaction_debug/peract2_13_rollout_noplan_split/bimanual_pick_plate/rollout_eval.md
134
+ ./artifacts/outputs/interaction_debug/peract2_13_rollout_noplan_split/bimanual_push_box/rollout_eval.json
135
+ ./artifacts/outputs/interaction_debug/peract2_13_rollout_noplan_split/bimanual_push_box/rollout_eval.md
136
+ ./artifacts/outputs/interaction_debug/peract2_13_rollout_noplan_split/bimanual_put_bottle_in_fridge/rollout_eval.json
137
+ ./artifacts/outputs/interaction_debug/peract2_13_rollout_noplan_split/bimanual_put_bottle_in_fridge/rollout_eval.md
138
+ ./artifacts/outputs/interaction_debug/peract2_13_rollout_noplan_split/bimanual_put_item_in_drawer/rollout_eval.json
139
+ ./artifacts/outputs/interaction_debug/peract2_13_rollout_noplan_split/bimanual_put_item_in_drawer/rollout_eval.md
140
+ ./artifacts/outputs/interaction_debug/peract2_13_rollout_noplan_split/bimanual_straighten_rope/rollout_eval.json
141
+ ./artifacts/outputs/interaction_debug/peract2_13_rollout_noplan_split/bimanual_straighten_rope/rollout_eval.md
142
+ ./artifacts/outputs/interaction_debug/peract2_13_rollout_noplan_split/bimanual_sweep_to_dustpan/rollout_eval.json
143
+ ./artifacts/outputs/interaction_debug/peract2_13_rollout_noplan_split/bimanual_sweep_to_dustpan/rollout_eval.md
144
+ ./artifacts/outputs/interaction_debug/peract2_13_rollout_noplan_split/bimanual_take_tray_out_of_oven/rollout_eval.json
145
+ ./artifacts/outputs/interaction_debug/peract2_13_rollout_noplan_split/bimanual_take_tray_out_of_oven/rollout_eval.md
146
+ ./artifacts/outputs/interaction_debug/peract2_13_rollout_noplan_split/rollout_eval.json
147
+ ./artifacts/outputs/interaction_debug/peract2_13_rollout_noplan_split/rollout_eval.md
148
+ ./artifacts/outputs/interaction_debug/peract2_13_rollout_plan_split/bimanual_dual_push_buttons/rollout_eval.json
149
+ ./artifacts/outputs/interaction_debug/peract2_13_rollout_plan_split/bimanual_dual_push_buttons/rollout_eval.md
150
+ ./artifacts/outputs/interaction_debug/peract2_13_rollout_plan_split/bimanual_handover_item/rollout_eval.json
151
+ ./artifacts/outputs/interaction_debug/peract2_13_rollout_plan_split/bimanual_handover_item/rollout_eval.md
152
+ ./artifacts/outputs/interaction_debug/peract2_13_rollout_plan_split/bimanual_handover_item_easy/rollout_eval.json
153
+ ./artifacts/outputs/interaction_debug/peract2_13_rollout_plan_split/bimanual_handover_item_easy/rollout_eval.md
154
+ ./artifacts/outputs/interaction_debug/peract2_13_rollout_plan_split/bimanual_lift_ball/rollout_eval.json
155
+ ./artifacts/outputs/interaction_debug/peract2_13_rollout_plan_split/bimanual_lift_ball/rollout_eval.md
156
+ ./artifacts/outputs/interaction_debug/peract2_13_rollout_plan_split/bimanual_lift_tray/rollout_eval.json
157
+ ./artifacts/outputs/interaction_debug/peract2_13_rollout_plan_split/bimanual_lift_tray/rollout_eval.md
158
+ ./artifacts/outputs/interaction_debug/peract2_13_rollout_plan_split/bimanual_pick_laptop/rollout_eval.json
159
+ ./artifacts/outputs/interaction_debug/peract2_13_rollout_plan_split/bimanual_pick_laptop/rollout_eval.md
160
+ ./artifacts/outputs/interaction_debug/peract2_13_rollout_plan_split/bimanual_pick_plate/rollout_eval.json
161
+ ./artifacts/outputs/interaction_debug/peract2_13_rollout_plan_split/bimanual_pick_plate/rollout_eval.md
162
+ ./artifacts/outputs/interaction_debug/peract2_13_rollout_plan_split/bimanual_push_box/rollout_eval.json
163
+ ./artifacts/outputs/interaction_debug/peract2_13_rollout_plan_split/bimanual_push_box/rollout_eval.md
164
+ ./artifacts/outputs/interaction_debug/peract2_13_rollout_plan_split/bimanual_put_bottle_in_fridge/rollout_eval.json
165
+ ./artifacts/outputs/interaction_debug/peract2_13_rollout_plan_split/bimanual_put_bottle_in_fridge/rollout_eval.md
166
+ ./artifacts/outputs/interaction_debug/peract2_13_rollout_plan_split/bimanual_put_item_in_drawer/rollout_eval.json
167
+ ./artifacts/outputs/interaction_debug/peract2_13_rollout_plan_split/bimanual_put_item_in_drawer/rollout_eval.md
168
+ ./artifacts/outputs/interaction_debug/peract2_13_rollout_plan_split/bimanual_straighten_rope/rollout_eval.json
169
+ ./artifacts/outputs/interaction_debug/peract2_13_rollout_plan_split/bimanual_straighten_rope/rollout_eval.md
170
+ ./artifacts/outputs/interaction_debug/peract2_13_rollout_plan_split/bimanual_sweep_to_dustpan/rollout_eval.json
171
+ ./artifacts/outputs/interaction_debug/peract2_13_rollout_plan_split/bimanual_sweep_to_dustpan/rollout_eval.md
172
+ ./artifacts/outputs/interaction_debug/peract2_13_rollout_plan_split/bimanual_take_tray_out_of_oven/rollout_eval.json
173
+ ./artifacts/outputs/interaction_debug/peract2_13_rollout_plan_split/bimanual_take_tray_out_of_oven/rollout_eval.md
174
+ ./artifacts/outputs/interaction_debug/peract2_13_rollout_plan_split/rollout_eval.json
175
+ ./artifacts/outputs/interaction_debug/peract2_13_rollout_plan_split/rollout_eval.md
176
+ ./artifacts/outputs/interaction_debug/peract2_bimanual_push_box_launch_smoke.json
177
+ ./artifacts/outputs/interaction_debug/peract2_import_smoke.json
178
+ ./artifacts/outputs/interaction_debug/peract2_import_train_command.txt
179
+ ./artifacts/outputs/interaction_debug/peract2_smoke_push_box_plan/rollout_eval.json
180
+ ./artifacts/outputs/interaction_debug/peract2_smoke_push_box_plan/rollout_eval.md
181
  ./artifacts/outputs/interaction_debug/proxy_interaction_state_actionhist/checkpoint_best.pt
182
  ./artifacts/outputs/interaction_debug/proxy_interaction_state_actionhist/config_resolved.yaml
183
  ./artifacts/outputs/interaction_debug/proxy_interaction_state_actionhist/diagnostics/proxy_diagnostics.json
 
329
  ./code/reveal_vla_bimanual/eval/metrics.py
330
  ./code/reveal_vla_bimanual/eval/report.py
331
  ./code/reveal_vla_bimanual/eval/run_ablations.py
332
+ ./code/reveal_vla_bimanual/eval/run_peract2_task_sweep.py
333
  ./code/reveal_vla_bimanual/eval/run_proxy_diagnostics.py
334
  ./code/reveal_vla_bimanual/eval/run_reveal_benchmark.py
335
  ./code/reveal_vla_bimanual/eval/run_rlbench_rollout_eval.py
 
373
  ./code/reveal_vla_bimanual/sim_rlbench/generate_smoke_dataset.py
374
  ./code/reveal_vla_bimanual/sim_rlbench/launch_smoke.py
375
  ./code/reveal_vla_bimanual/sim_rlbench/obs_adapter.py
376
+ ./code/reveal_vla_bimanual/sim_rlbench/obs_config.py
377
  ./code/reveal_vla_bimanual/sim_rlbench/peract2_runner.py
378
  ./code/reveal_vla_bimanual/sim_rlbench/smoke_test.py
379
+ ./code/reveal_vla_bimanual/sim_rlbench/task_resolver.py
380
  ./code/reveal_vla_bimanual/sim_rlbench/task_splits.py
381
  ./code/reveal_vla_bimanual/train/__init__.py
382
  ./code/reveal_vla_bimanual/train/configs/base.yaml
 
419
  ./environment/rlbench_env_explicit.txt
420
  ./environment/rlbench_env_export.yaml
421
  ./environment/rlbench_pip_freeze.txt
422
+ ./environment/run_peract2_13_rollouts.sh
423
  ./environment/setup_same_machine.sh
424
  ./environment/system_packages_same_machine.txt
425
  ./environment/upstream_revisions.txt
MODEL_INDEX.md CHANGED
@@ -193,6 +193,27 @@ This file lists the uploaded checkpoints, datasets, and raw report files referen
193
  - RLBench smoke dataset root
194
  - `artifacts/data/rlbench_smoke_open_drawer/`
195
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
196
  ## Smoke Artifacts
197
 
198
  - proxy backbone-only smoke checkpoint
@@ -220,3 +241,7 @@ This file lists the uploaded checkpoints, datasets, and raw report files referen
220
  - `environment/setup_same_machine.sh`
221
  - same-machine validation helper
222
  - `environment/validate_same_machine.sh`
 
 
 
 
 
193
  - RLBench smoke dataset root
194
  - `artifacts/data/rlbench_smoke_open_drawer/`
195
 
196
+ ## RLBench PerAct2 13-Task Outputs
197
+
198
+ - PerAct2 import smoke JSON
199
+ - `artifacts/outputs/interaction_debug/peract2_import_smoke.json`
200
+ - PerAct2 train command export
201
+ - `artifacts/outputs/interaction_debug/peract2_import_train_command.txt`
202
+ - PerAct2 bimanual_push_box launch smoke JSON
203
+ - `artifacts/outputs/interaction_debug/peract2_bimanual_push_box_launch_smoke.json`
204
+ - PerAct2 no-plan 13-task combined rollout JSON
205
+ - `artifacts/outputs/interaction_debug/peract2_13_rollout_noplan_split/rollout_eval.json`
206
+ - PerAct2 no-plan 13-task combined rollout Markdown
207
+ - `artifacts/outputs/interaction_debug/peract2_13_rollout_noplan_split/rollout_eval.md`
208
+ - PerAct2 planner-enabled 13-task combined rollout JSON
209
+ - `artifacts/outputs/interaction_debug/peract2_13_rollout_plan_split/rollout_eval.json`
210
+ - PerAct2 planner-enabled 13-task combined rollout Markdown
211
+ - `artifacts/outputs/interaction_debug/peract2_13_rollout_plan_split/rollout_eval.md`
212
+ - PerAct2 no-plan per-task rollout root
213
+ - `artifacts/outputs/interaction_debug/peract2_13_rollout_noplan_split/`
214
+ - PerAct2 planner-enabled per-task rollout root
215
+ - `artifacts/outputs/interaction_debug/peract2_13_rollout_plan_split/`
216
+
217
  ## Smoke Artifacts
218
 
219
  - proxy backbone-only smoke checkpoint
 
241
  - `environment/setup_same_machine.sh`
242
  - same-machine validation helper
243
  - `environment/validate_same_machine.sh`
244
+ - same-machine PerAct2 rollout helper
245
+ - `environment/run_peract2_13_rollouts.sh`
246
+ - PerAct2 isolated sweep helper
247
+ - `code/reveal_vla_bimanual/eval/run_peract2_task_sweep.py`
README.md CHANGED
@@ -35,6 +35,7 @@ Raw machine outputs are in:
35
 
36
  - `environment/setup_same_machine.sh`
37
  - `environment/validate_same_machine.sh`
 
38
  - `environment/system_packages_same_machine.txt`
39
  - `environment/upstream_revisions.txt`
40
  - `environment/rlbench_env_export.yaml`
@@ -44,6 +45,37 @@ Raw machine outputs are in:
44
  - `environment/reveal_env_explicit.txt`
45
  - `environment/reveal_pip_freeze.txt`
46
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
47
  ## Raw Training Endpoints
48
 
49
  | Run | Checkpoint | Final train total | Final val total | Metrics |
@@ -130,9 +162,9 @@ Source: `artifacts/outputs/interaction/reveal_ablation_interaction_ep1/ablations
130
  | no_role_tokens | 0.0 | 0.0 | 0.0 | 0.0 | 67.39010111490886 | 0.9835391044616699 | 0.0 | 2.8990648205081624 | 0.7544853488604227 |
131
  | short_history | 0.0 | 0.0 | 0.0 | 0.0 | 67.46627298990886 | 0.9835391044616699 | 0.0 | 2.900133213897546 | 0.7520630160967509 |
132
 
133
- ## Raw RLBench Two-Robot Outputs
134
 
135
- ### Env Smoke
136
 
137
  | Output | Raw values | File |
138
  | --- | --- | --- |
@@ -140,13 +172,44 @@ Source: `artifacts/outputs/interaction/reveal_ablation_interaction_ep1/ablations
140
  | launch reset smoke | `description=\"hold the drawer with left hand and open the bottom drawer with right hand\"`, `front_rgb_shape=[128,128,3]`, `wrist_rgb_shape=[128,128,3]`, `wrist2_rgb_shape=[128,128,3]`, `right_pose_shape=[7]`, `left_pose_shape=[7]` | `artifacts/outputs/interaction/rlbench_env_smoke/launch_reset_smoke.json` |
141
  | launch step smoke | `description=\"hold the drawer with left hand and open the bottom drawer with right hand\"`, `reward=0.0`, `done=false`, `front_rgb_shape_after_step=[128,128,3]` | `artifacts/outputs/interaction/rlbench_env_smoke/launch_step_smoke.json` |
142
  | train command export | raw command text | `artifacts/outputs/interaction/rlbench_env_smoke/import_and_train_command.txt` |
 
 
143
 
144
- ### Offline Smoke And Rollout Eval
145
 
146
  | Output | Raw values | File |
147
  | --- | --- | --- |
148
- | offline RLBench smoke summary | `train_dataset.num_samples=1`, `val_dataset.num_samples=1`, `plan_enabled_for_eval=true`, `frozen_modules=[interaction_head, world_model, planner]` | `artifacts/outputs/interaction/rlbench_open_drawer_interaction_smoke/summary.json` |
149
- | rollout eval | `plan_requested=true`, `plan_applied=true`, `tasks.open_drawer.error=\"A path could not be found because the target is outside of workspace.\"`, `mean_success=0.0` | `artifacts/outputs/interaction/rlbench_open_drawer_rollout_eval/rollout_eval.json` |
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
150
 
151
  ## RLBench Headless Smoke
152
 
@@ -251,16 +314,19 @@ Use:
251
  ```bash
252
  /workspace/VLAarchtests/environment/setup_same_machine.sh
253
  /workspace/VLAarchtests/environment/validate_same_machine.sh
 
254
  ```
255
 
256
  That helper:
257
 
258
  - links the bundled code to `/workspace/reveal_vla_bimanual` if needed
259
- - clones the pinned third-party repos into `/workspace/third_party`
 
260
  - installs the RLBench env
261
  - installs the reveal env base
262
  - installs the RLBench headless X prerequisites
263
  - starts X on `:99`
 
264
 
265
  Raw setup metadata is in:
266
 
 
35
 
36
  - `environment/setup_same_machine.sh`
37
  - `environment/validate_same_machine.sh`
38
+ - `environment/run_peract2_13_rollouts.sh`
39
  - `environment/system_packages_same_machine.txt`
40
  - `environment/upstream_revisions.txt`
41
  - `environment/rlbench_env_export.yaml`
 
45
  - `environment/reveal_env_explicit.txt`
46
  - `environment/reveal_pip_freeze.txt`
47
 
48
+ ## Code Paths Updated In This Bundle
49
+
50
+ - interaction-state architecture and wiring
51
+ - `code/reveal_vla_bimanual/models/reveal_head.py`
52
+ - `code/reveal_vla_bimanual/models/world_model.py`
53
+ - `code/reveal_vla_bimanual/models/planner.py`
54
+ - `code/reveal_vla_bimanual/models/action_decoder.py`
55
+ - `code/reveal_vla_bimanual/models/observation_memory.py`
56
+ - `code/reveal_vla_bimanual/models/policy.py`
57
+ - proxy training, losses, and evaluator changes
58
+ - `code/reveal_vla_bimanual/train/losses.py`
59
+ - `code/reveal_vla_bimanual/train/smoke_checks.py`
60
+ - `code/reveal_vla_bimanual/eval/run_proxy_diagnostics.py`
61
+ - `code/reveal_vla_bimanual/eval/run_reveal_benchmark.py`
62
+ - RLBench and PerAct2 adapter changes
63
+ - `code/reveal_vla_bimanual/sim_rlbench/task_resolver.py`
64
+ - `code/reveal_vla_bimanual/sim_rlbench/camera_spec.py`
65
+ - `code/reveal_vla_bimanual/sim_rlbench/obs_config.py`
66
+ - `code/reveal_vla_bimanual/sim_rlbench/dataset.py`
67
+ - `code/reveal_vla_bimanual/sim_rlbench/obs_adapter.py`
68
+ - `code/reveal_vla_bimanual/sim_rlbench/peract2_runner.py`
69
+ - `code/reveal_vla_bimanual/sim_rlbench/smoke_test.py`
70
+ - `code/reveal_vla_bimanual/sim_rlbench/launch_smoke.py`
71
+ - `code/reveal_vla_bimanual/eval/run_rlbench_rollout_eval.py`
72
+ - `code/reveal_vla_bimanual/eval/run_peract2_task_sweep.py`
73
+ - same-machine bootstrap helpers
74
+ - `environment/setup_same_machine.sh`
75
+ - `environment/validate_same_machine.sh`
76
+ - `environment/run_peract2_13_rollouts.sh`
77
+ - `environment/upstream_revisions.txt`
78
+
79
  ## Raw Training Endpoints
80
 
81
  | Run | Checkpoint | Final train total | Final val total | Metrics |
 
162
  | no_role_tokens | 0.0 | 0.0 | 0.0 | 0.0 | 67.39010111490886 | 0.9835391044616699 | 0.0 | 2.8990648205081624 | 0.7544853488604227 |
163
  | short_history | 0.0 | 0.0 | 0.0 | 0.0 | 67.46627298990886 | 0.9835391044616699 | 0.0 | 2.900133213897546 | 0.7520630160967509 |
164
 
165
+ ## Raw RLBench Outputs
166
 
167
+ ### Legacy Open-Drawer Path
168
 
169
  | Output | Raw values | File |
170
  | --- | --- | --- |
 
172
  | launch reset smoke | `description=\"hold the drawer with left hand and open the bottom drawer with right hand\"`, `front_rgb_shape=[128,128,3]`, `wrist_rgb_shape=[128,128,3]`, `wrist2_rgb_shape=[128,128,3]`, `right_pose_shape=[7]`, `left_pose_shape=[7]` | `artifacts/outputs/interaction/rlbench_env_smoke/launch_reset_smoke.json` |
173
  | launch step smoke | `description=\"hold the drawer with left hand and open the bottom drawer with right hand\"`, `reward=0.0`, `done=false`, `front_rgb_shape_after_step=[128,128,3]` | `artifacts/outputs/interaction/rlbench_env_smoke/launch_step_smoke.json` |
174
  | train command export | raw command text | `artifacts/outputs/interaction/rlbench_env_smoke/import_and_train_command.txt` |
175
+ | offline RLBench smoke summary | `train_dataset.num_samples=1`, `val_dataset.num_samples=1`, `plan_enabled_for_eval=true`, `frozen_modules=[interaction_head, world_model, planner]` | `artifacts/outputs/interaction/rlbench_open_drawer_interaction_smoke/summary.json` |
176
+ | rollout eval | `plan_requested=true`, `plan_applied=true`, `tasks.open_drawer.error=\"A path could not be found because the target is outside of workspace.\"`, `mean_success=0.0` | `artifacts/outputs/interaction/rlbench_open_drawer_rollout_eval/rollout_eval.json` |
177
 
178
+ ### PerAct2 Import And Launch Smoke
179
 
180
  | Output | Raw values | File |
181
  | --- | --- | --- |
182
+ | PerAct2 import smoke | `resolved_upstream_root=/workspace/third_party/peract2_bimanual_probe_20260324`, `imports.rlbench=ok`, `imports.pyrep=ok`, `imports.yarr=ok` | `artifacts/outputs/interaction_debug/peract2_import_smoke.json` |
183
+ | PerAct2 train command export | raw command text | `artifacts/outputs/interaction_debug/peract2_import_train_command.txt` |
184
+ | PerAct2 `bimanual_push_box` launch smoke | `task=BimanualPushBox`, `description=\"push the box to the red area\"`, `front_rgb_shape=[128,128,3]`, `wrist_left_rgb_shape=[128,128,3]`, `wrist_right_rgb_shape=[128,128,3]`, `reward=0.0`, `done=false` | `artifacts/outputs/interaction_debug/peract2_bimanual_push_box_launch_smoke.json` |
185
+
186
+ ### PerAct2 13-Task Isolated Rollout Sweeps
187
+
188
+ | Mode | Plan requested | Plan applied | Mean success | Task count | Error tasks | Combined JSON | Combined Markdown |
189
+ | --- | --- | --- | ---: | ---: | --- | --- | --- |
190
+ | no-plan split | `false` | `false` | 0.0 | 13 | `[]` | `artifacts/outputs/interaction_debug/peract2_13_rollout_noplan_split/rollout_eval.json` | `artifacts/outputs/interaction_debug/peract2_13_rollout_noplan_split/rollout_eval.md` |
191
+ | planner-enabled split | `true` | `true` | 0.0 | 13 | `[]` | `artifacts/outputs/interaction_debug/peract2_13_rollout_plan_split/rollout_eval.json` | `artifacts/outputs/interaction_debug/peract2_13_rollout_plan_split/rollout_eval.md` |
192
+
193
+ Per-task rollout JSON roots:
194
+
195
+ - `artifacts/outputs/interaction_debug/peract2_13_rollout_noplan_split/`
196
+ - `artifacts/outputs/interaction_debug/peract2_13_rollout_plan_split/`
197
+
198
+ | Task | No-plan mean_success | Planner mean_success | No-plan JSON | Planner JSON |
199
+ | --- | ---: | ---: | --- | --- |
200
+ | bimanual_push_box | 0.0 | 0.0 | `artifacts/outputs/interaction_debug/peract2_13_rollout_noplan_split/bimanual_push_box/rollout_eval.json` | `artifacts/outputs/interaction_debug/peract2_13_rollout_plan_split/bimanual_push_box/rollout_eval.json` |
201
+ | bimanual_lift_ball | 0.0 | 0.0 | `artifacts/outputs/interaction_debug/peract2_13_rollout_noplan_split/bimanual_lift_ball/rollout_eval.json` | `artifacts/outputs/interaction_debug/peract2_13_rollout_plan_split/bimanual_lift_ball/rollout_eval.json` |
202
+ | bimanual_dual_push_buttons | 0.0 | 0.0 | `artifacts/outputs/interaction_debug/peract2_13_rollout_noplan_split/bimanual_dual_push_buttons/rollout_eval.json` | `artifacts/outputs/interaction_debug/peract2_13_rollout_plan_split/bimanual_dual_push_buttons/rollout_eval.json` |
203
+ | bimanual_pick_plate | 0.0 | 0.0 | `artifacts/outputs/interaction_debug/peract2_13_rollout_noplan_split/bimanual_pick_plate/rollout_eval.json` | `artifacts/outputs/interaction_debug/peract2_13_rollout_plan_split/bimanual_pick_plate/rollout_eval.json` |
204
+ | bimanual_put_item_in_drawer | 0.0 | 0.0 | `artifacts/outputs/interaction_debug/peract2_13_rollout_noplan_split/bimanual_put_item_in_drawer/rollout_eval.json` | `artifacts/outputs/interaction_debug/peract2_13_rollout_plan_split/bimanual_put_item_in_drawer/rollout_eval.json` |
205
+ | bimanual_put_bottle_in_fridge | 0.0 | 0.0 | `artifacts/outputs/interaction_debug/peract2_13_rollout_noplan_split/bimanual_put_bottle_in_fridge/rollout_eval.json` | `artifacts/outputs/interaction_debug/peract2_13_rollout_plan_split/bimanual_put_bottle_in_fridge/rollout_eval.json` |
206
+ | bimanual_handover_item | 0.0 | 0.0 | `artifacts/outputs/interaction_debug/peract2_13_rollout_noplan_split/bimanual_handover_item/rollout_eval.json` | `artifacts/outputs/interaction_debug/peract2_13_rollout_plan_split/bimanual_handover_item/rollout_eval.json` |
207
+ | bimanual_pick_laptop | 0.0 | 0.0 | `artifacts/outputs/interaction_debug/peract2_13_rollout_noplan_split/bimanual_pick_laptop/rollout_eval.json` | `artifacts/outputs/interaction_debug/peract2_13_rollout_plan_split/bimanual_pick_laptop/rollout_eval.json` |
208
+ | bimanual_straighten_rope | 0.0 | 0.0 | `artifacts/outputs/interaction_debug/peract2_13_rollout_noplan_split/bimanual_straighten_rope/rollout_eval.json` | `artifacts/outputs/interaction_debug/peract2_13_rollout_plan_split/bimanual_straighten_rope/rollout_eval.json` |
209
+ | bimanual_sweep_to_dustpan | 0.0 | 0.0 | `artifacts/outputs/interaction_debug/peract2_13_rollout_noplan_split/bimanual_sweep_to_dustpan/rollout_eval.json` | `artifacts/outputs/interaction_debug/peract2_13_rollout_plan_split/bimanual_sweep_to_dustpan/rollout_eval.json` |
210
+ | bimanual_lift_tray | 0.0 | 0.0 | `artifacts/outputs/interaction_debug/peract2_13_rollout_noplan_split/bimanual_lift_tray/rollout_eval.json` | `artifacts/outputs/interaction_debug/peract2_13_rollout_plan_split/bimanual_lift_tray/rollout_eval.json` |
211
+ | bimanual_handover_item_easy | 0.0 | 0.0 | `artifacts/outputs/interaction_debug/peract2_13_rollout_noplan_split/bimanual_handover_item_easy/rollout_eval.json` | `artifacts/outputs/interaction_debug/peract2_13_rollout_plan_split/bimanual_handover_item_easy/rollout_eval.json` |
212
+ | bimanual_take_tray_out_of_oven | 0.0 | 0.0 | `artifacts/outputs/interaction_debug/peract2_13_rollout_noplan_split/bimanual_take_tray_out_of_oven/rollout_eval.json` | `artifacts/outputs/interaction_debug/peract2_13_rollout_plan_split/bimanual_take_tray_out_of_oven/rollout_eval.json` |
213
 
214
  ## RLBench Headless Smoke
215
 
 
314
  ```bash
315
  /workspace/VLAarchtests/environment/setup_same_machine.sh
316
  /workspace/VLAarchtests/environment/validate_same_machine.sh
317
+ /workspace/VLAarchtests/environment/run_peract2_13_rollouts.sh
318
  ```
319
 
320
  That helper:
321
 
322
  - links the bundled code to `/workspace/reveal_vla_bimanual` if needed
323
+ - clones the pinned PerAct2 third-party repos into `/workspace/third_party`
324
+ - optionally clones the legacy two-robot repos when `INSTALL_LEGACY_LAYOUT=1`
325
  - installs the RLBench env
326
  - installs the reveal env base
327
  - installs the RLBench headless X prerequisites
328
  - starts X on `:99`
329
+ - exposes a one-command 13-task sweep helper through `environment/run_peract2_13_rollouts.sh`
330
 
331
  Raw setup metadata is in:
332
 
artifacts/outputs/interaction_debug/peract2_13_rollout_noplan_split/bimanual_lift_ball/rollout_eval.json ADDED
@@ -0,0 +1,31 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "checkpoint": "/workspace/VLAarchtests/artifacts/outputs/interaction_debug/proxy_interaction_state_clip_actionhist/checkpoint_best.pt",
3
+ "plan_requested": false,
4
+ "plan_applied": false,
5
+ "planner_mode": "trainable",
6
+ "support_mode_conditioning": true,
7
+ "episodes_per_task": 1,
8
+ "episode_length": 20,
9
+ "resolution": 224,
10
+ "cameras": [
11
+ "front",
12
+ "wrist_left",
13
+ "wrist_right"
14
+ ],
15
+ "tasks": {
16
+ "bimanual_lift_ball": {
17
+ "task_class": "BimanualLiftBall",
18
+ "successes": [
19
+ 0.0
20
+ ],
21
+ "returns": [
22
+ 0.0
23
+ ],
24
+ "path_recoveries": 0,
25
+ "noop_fallbacks": 0,
26
+ "mean_success": 0.0,
27
+ "mean_return": 0.0
28
+ }
29
+ },
30
+ "mean_success": 0.0
31
+ }
artifacts/outputs/interaction_debug/peract2_13_rollout_noplan_split/bimanual_lift_ball/rollout_eval.md ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # RLBench Rollout Eval
2
+
3
+ - Checkpoint: `/workspace/VLAarchtests/artifacts/outputs/interaction_debug/proxy_interaction_state_clip_actionhist/checkpoint_best.pt`
4
+ - Plan requested: `False`
5
+ - Plan applied: `False`
6
+ - Support-mode conditioning: `True`
7
+ - Mean success: `0.000`
8
+
9
+ ## Per-task
10
+
11
+ - `bimanual_lift_ball`: mean_success=0.000, returns=[0.0]
artifacts/outputs/interaction_debug/peract2_13_rollout_noplan_split/bimanual_push_box/rollout_eval.json ADDED
@@ -0,0 +1,31 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "checkpoint": "/workspace/VLAarchtests/artifacts/outputs/interaction_debug/proxy_interaction_state_clip_actionhist/checkpoint_best.pt",
3
+ "plan_requested": false,
4
+ "plan_applied": false,
5
+ "planner_mode": "trainable",
6
+ "support_mode_conditioning": true,
7
+ "episodes_per_task": 1,
8
+ "episode_length": 20,
9
+ "resolution": 224,
10
+ "cameras": [
11
+ "front",
12
+ "wrist_left",
13
+ "wrist_right"
14
+ ],
15
+ "tasks": {
16
+ "bimanual_push_box": {
17
+ "task_class": "BimanualPushBox",
18
+ "successes": [
19
+ 0.0
20
+ ],
21
+ "returns": [
22
+ 0.0
23
+ ],
24
+ "path_recoveries": 0,
25
+ "noop_fallbacks": 0,
26
+ "mean_success": 0.0,
27
+ "mean_return": 0.0
28
+ }
29
+ },
30
+ "mean_success": 0.0
31
+ }
artifacts/outputs/interaction_debug/peract2_13_rollout_noplan_split/bimanual_push_box/rollout_eval.md ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # RLBench Rollout Eval
2
+
3
+ - Checkpoint: `/workspace/VLAarchtests/artifacts/outputs/interaction_debug/proxy_interaction_state_clip_actionhist/checkpoint_best.pt`
4
+ - Plan requested: `False`
5
+ - Plan applied: `False`
6
+ - Support-mode conditioning: `True`
7
+ - Mean success: `0.000`
8
+
9
+ ## Per-task
10
+
11
+ - `bimanual_push_box`: mean_success=0.000, returns=[0.0]
artifacts/outputs/interaction_debug/peract2_13_rollout_plan_split/bimanual_handover_item/rollout_eval.json ADDED
@@ -0,0 +1,31 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "checkpoint": "/workspace/VLAarchtests/artifacts/outputs/interaction_debug/proxy_interaction_state_clip_actionhist/checkpoint_best.pt",
3
+ "plan_requested": true,
4
+ "plan_applied": true,
5
+ "planner_mode": "trainable",
6
+ "support_mode_conditioning": true,
7
+ "episodes_per_task": 1,
8
+ "episode_length": 20,
9
+ "resolution": 224,
10
+ "cameras": [
11
+ "front",
12
+ "wrist_left",
13
+ "wrist_right"
14
+ ],
15
+ "tasks": {
16
+ "bimanual_handover_item": {
17
+ "task_class": "BimanualHandoverItem",
18
+ "successes": [
19
+ 0.0
20
+ ],
21
+ "returns": [
22
+ 0.0
23
+ ],
24
+ "path_recoveries": 0,
25
+ "noop_fallbacks": 0,
26
+ "mean_success": 0.0,
27
+ "mean_return": 0.0
28
+ }
29
+ },
30
+ "mean_success": 0.0
31
+ }
artifacts/outputs/interaction_debug/peract2_13_rollout_plan_split/bimanual_handover_item/rollout_eval.md ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # RLBench Rollout Eval
2
+
3
+ - Checkpoint: `/workspace/VLAarchtests/artifacts/outputs/interaction_debug/proxy_interaction_state_clip_actionhist/checkpoint_best.pt`
4
+ - Plan requested: `True`
5
+ - Plan applied: `True`
6
+ - Support-mode conditioning: `True`
7
+ - Mean success: `0.000`
8
+
9
+ ## Per-task
10
+
11
+ - `bimanual_handover_item`: mean_success=0.000, returns=[0.0]
artifacts/outputs/interaction_debug/peract2_13_rollout_plan_split/bimanual_handover_item_easy/rollout_eval.json ADDED
@@ -0,0 +1,31 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "checkpoint": "/workspace/VLAarchtests/artifacts/outputs/interaction_debug/proxy_interaction_state_clip_actionhist/checkpoint_best.pt",
3
+ "plan_requested": true,
4
+ "plan_applied": true,
5
+ "planner_mode": "trainable",
6
+ "support_mode_conditioning": true,
7
+ "episodes_per_task": 1,
8
+ "episode_length": 20,
9
+ "resolution": 224,
10
+ "cameras": [
11
+ "front",
12
+ "wrist_left",
13
+ "wrist_right"
14
+ ],
15
+ "tasks": {
16
+ "bimanual_handover_item_easy": {
17
+ "task_class": "BimanualHandoverItemEasy",
18
+ "successes": [
19
+ 0.0
20
+ ],
21
+ "returns": [
22
+ 0.0
23
+ ],
24
+ "path_recoveries": 0,
25
+ "noop_fallbacks": 0,
26
+ "mean_success": 0.0,
27
+ "mean_return": 0.0
28
+ }
29
+ },
30
+ "mean_success": 0.0
31
+ }
artifacts/outputs/interaction_debug/peract2_13_rollout_plan_split/bimanual_handover_item_easy/rollout_eval.md ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # RLBench Rollout Eval
2
+
3
+ - Checkpoint: `/workspace/VLAarchtests/artifacts/outputs/interaction_debug/proxy_interaction_state_clip_actionhist/checkpoint_best.pt`
4
+ - Plan requested: `True`
5
+ - Plan applied: `True`
6
+ - Support-mode conditioning: `True`
7
+ - Mean success: `0.000`
8
+
9
+ ## Per-task
10
+
11
+ - `bimanual_handover_item_easy`: mean_success=0.000, returns=[0.0]
artifacts/outputs/interaction_debug/peract2_13_rollout_plan_split/bimanual_lift_tray/rollout_eval.json ADDED
@@ -0,0 +1,31 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "checkpoint": "/workspace/VLAarchtests/artifacts/outputs/interaction_debug/proxy_interaction_state_clip_actionhist/checkpoint_best.pt",
3
+ "plan_requested": true,
4
+ "plan_applied": true,
5
+ "planner_mode": "trainable",
6
+ "support_mode_conditioning": true,
7
+ "episodes_per_task": 1,
8
+ "episode_length": 20,
9
+ "resolution": 224,
10
+ "cameras": [
11
+ "front",
12
+ "wrist_left",
13
+ "wrist_right"
14
+ ],
15
+ "tasks": {
16
+ "bimanual_lift_tray": {
17
+ "task_class": "BimanualLiftTray",
18
+ "successes": [
19
+ 0.0
20
+ ],
21
+ "returns": [
22
+ 0.0
23
+ ],
24
+ "path_recoveries": 0,
25
+ "noop_fallbacks": 0,
26
+ "mean_success": 0.0,
27
+ "mean_return": 0.0
28
+ }
29
+ },
30
+ "mean_success": 0.0
31
+ }
artifacts/outputs/interaction_debug/peract2_13_rollout_plan_split/bimanual_lift_tray/rollout_eval.md ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # RLBench Rollout Eval
2
+
3
+ - Checkpoint: `/workspace/VLAarchtests/artifacts/outputs/interaction_debug/proxy_interaction_state_clip_actionhist/checkpoint_best.pt`
4
+ - Plan requested: `True`
5
+ - Plan applied: `True`
6
+ - Support-mode conditioning: `True`
7
+ - Mean success: `0.000`
8
+
9
+ ## Per-task
10
+
11
+ - `bimanual_lift_tray`: mean_success=0.000, returns=[0.0]
artifacts/outputs/interaction_debug/peract2_13_rollout_plan_split/bimanual_pick_laptop/rollout_eval.json ADDED
@@ -0,0 +1,31 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "checkpoint": "/workspace/VLAarchtests/artifacts/outputs/interaction_debug/proxy_interaction_state_clip_actionhist/checkpoint_best.pt",
3
+ "plan_requested": true,
4
+ "plan_applied": true,
5
+ "planner_mode": "trainable",
6
+ "support_mode_conditioning": true,
7
+ "episodes_per_task": 1,
8
+ "episode_length": 20,
9
+ "resolution": 224,
10
+ "cameras": [
11
+ "front",
12
+ "wrist_left",
13
+ "wrist_right"
14
+ ],
15
+ "tasks": {
16
+ "bimanual_pick_laptop": {
17
+ "task_class": "BimanualPickLaptop",
18
+ "successes": [
19
+ 0.0
20
+ ],
21
+ "returns": [
22
+ 0.0
23
+ ],
24
+ "path_recoveries": 0,
25
+ "noop_fallbacks": 0,
26
+ "mean_success": 0.0,
27
+ "mean_return": 0.0
28
+ }
29
+ },
30
+ "mean_success": 0.0
31
+ }
artifacts/outputs/interaction_debug/peract2_13_rollout_plan_split/bimanual_pick_laptop/rollout_eval.md ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # RLBench Rollout Eval
2
+
3
+ - Checkpoint: `/workspace/VLAarchtests/artifacts/outputs/interaction_debug/proxy_interaction_state_clip_actionhist/checkpoint_best.pt`
4
+ - Plan requested: `True`
5
+ - Plan applied: `True`
6
+ - Support-mode conditioning: `True`
7
+ - Mean success: `0.000`
8
+
9
+ ## Per-task
10
+
11
+ - `bimanual_pick_laptop`: mean_success=0.000, returns=[0.0]
artifacts/outputs/interaction_debug/peract2_13_rollout_plan_split/bimanual_pick_plate/rollout_eval.md ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # RLBench Rollout Eval
2
+
3
+ - Checkpoint: `/workspace/VLAarchtests/artifacts/outputs/interaction_debug/proxy_interaction_state_clip_actionhist/checkpoint_best.pt`
4
+ - Plan requested: `True`
5
+ - Plan applied: `True`
6
+ - Support-mode conditioning: `True`
7
+ - Mean success: `0.000`
8
+
9
+ ## Per-task
10
+
11
+ - `bimanual_pick_plate`: mean_success=0.000, returns=[0.0]
artifacts/outputs/interaction_debug/peract2_13_rollout_plan_split/bimanual_put_bottle_in_fridge/rollout_eval.json ADDED
@@ -0,0 +1,31 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "checkpoint": "/workspace/VLAarchtests/artifacts/outputs/interaction_debug/proxy_interaction_state_clip_actionhist/checkpoint_best.pt",
3
+ "plan_requested": true,
4
+ "plan_applied": true,
5
+ "planner_mode": "trainable",
6
+ "support_mode_conditioning": true,
7
+ "episodes_per_task": 1,
8
+ "episode_length": 20,
9
+ "resolution": 224,
10
+ "cameras": [
11
+ "front",
12
+ "wrist_left",
13
+ "wrist_right"
14
+ ],
15
+ "tasks": {
16
+ "bimanual_put_bottle_in_fridge": {
17
+ "task_class": "BimanualPutBottleInFridge",
18
+ "successes": [
19
+ 0.0
20
+ ],
21
+ "returns": [
22
+ 0.0
23
+ ],
24
+ "path_recoveries": 0,
25
+ "noop_fallbacks": 0,
26
+ "mean_success": 0.0,
27
+ "mean_return": 0.0
28
+ }
29
+ },
30
+ "mean_success": 0.0
31
+ }
artifacts/outputs/interaction_debug/peract2_13_rollout_plan_split/bimanual_put_bottle_in_fridge/rollout_eval.md ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # RLBench Rollout Eval
2
+
3
+ - Checkpoint: `/workspace/VLAarchtests/artifacts/outputs/interaction_debug/proxy_interaction_state_clip_actionhist/checkpoint_best.pt`
4
+ - Plan requested: `True`
5
+ - Plan applied: `True`
6
+ - Support-mode conditioning: `True`
7
+ - Mean success: `0.000`
8
+
9
+ ## Per-task
10
+
11
+ - `bimanual_put_bottle_in_fridge`: mean_success=0.000, returns=[0.0]
artifacts/outputs/interaction_debug/peract2_13_rollout_plan_split/bimanual_put_item_in_drawer/rollout_eval.json ADDED
@@ -0,0 +1,31 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "checkpoint": "/workspace/VLAarchtests/artifacts/outputs/interaction_debug/proxy_interaction_state_clip_actionhist/checkpoint_best.pt",
3
+ "plan_requested": true,
4
+ "plan_applied": true,
5
+ "planner_mode": "trainable",
6
+ "support_mode_conditioning": true,
7
+ "episodes_per_task": 1,
8
+ "episode_length": 20,
9
+ "resolution": 224,
10
+ "cameras": [
11
+ "front",
12
+ "wrist_left",
13
+ "wrist_right"
14
+ ],
15
+ "tasks": {
16
+ "bimanual_put_item_in_drawer": {
17
+ "task_class": "BimanualPutItemInDrawer",
18
+ "successes": [
19
+ 0.0
20
+ ],
21
+ "returns": [
22
+ 0.0
23
+ ],
24
+ "path_recoveries": 0,
25
+ "noop_fallbacks": 0,
26
+ "mean_success": 0.0,
27
+ "mean_return": 0.0
28
+ }
29
+ },
30
+ "mean_success": 0.0
31
+ }
artifacts/outputs/interaction_debug/peract2_13_rollout_plan_split/bimanual_put_item_in_drawer/rollout_eval.md ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # RLBench Rollout Eval
2
+
3
+ - Checkpoint: `/workspace/VLAarchtests/artifacts/outputs/interaction_debug/proxy_interaction_state_clip_actionhist/checkpoint_best.pt`
4
+ - Plan requested: `True`
5
+ - Plan applied: `True`
6
+ - Support-mode conditioning: `True`
7
+ - Mean success: `0.000`
8
+
9
+ ## Per-task
10
+
11
+ - `bimanual_put_item_in_drawer`: mean_success=0.000, returns=[0.0]
artifacts/outputs/interaction_debug/peract2_13_rollout_plan_split/bimanual_straighten_rope/rollout_eval.json ADDED
@@ -0,0 +1,31 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "checkpoint": "/workspace/VLAarchtests/artifacts/outputs/interaction_debug/proxy_interaction_state_clip_actionhist/checkpoint_best.pt",
3
+ "plan_requested": true,
4
+ "plan_applied": true,
5
+ "planner_mode": "trainable",
6
+ "support_mode_conditioning": true,
7
+ "episodes_per_task": 1,
8
+ "episode_length": 20,
9
+ "resolution": 224,
10
+ "cameras": [
11
+ "front",
12
+ "wrist_left",
13
+ "wrist_right"
14
+ ],
15
+ "tasks": {
16
+ "bimanual_straighten_rope": {
17
+ "task_class": "BimanualStraightenRope",
18
+ "successes": [
19
+ 0.0
20
+ ],
21
+ "returns": [
22
+ 0.0
23
+ ],
24
+ "path_recoveries": 0,
25
+ "noop_fallbacks": 0,
26
+ "mean_success": 0.0,
27
+ "mean_return": 0.0
28
+ }
29
+ },
30
+ "mean_success": 0.0
31
+ }
artifacts/outputs/interaction_debug/peract2_13_rollout_plan_split/bimanual_straighten_rope/rollout_eval.md ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # RLBench Rollout Eval
2
+
3
+ - Checkpoint: `/workspace/VLAarchtests/artifacts/outputs/interaction_debug/proxy_interaction_state_clip_actionhist/checkpoint_best.pt`
4
+ - Plan requested: `True`
5
+ - Plan applied: `True`
6
+ - Support-mode conditioning: `True`
7
+ - Mean success: `0.000`
8
+
9
+ ## Per-task
10
+
11
+ - `bimanual_straighten_rope`: mean_success=0.000, returns=[0.0]
artifacts/outputs/interaction_debug/peract2_13_rollout_plan_split/bimanual_sweep_to_dustpan/rollout_eval.json ADDED
@@ -0,0 +1,31 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "checkpoint": "/workspace/VLAarchtests/artifacts/outputs/interaction_debug/proxy_interaction_state_clip_actionhist/checkpoint_best.pt",
3
+ "plan_requested": true,
4
+ "plan_applied": true,
5
+ "planner_mode": "trainable",
6
+ "support_mode_conditioning": true,
7
+ "episodes_per_task": 1,
8
+ "episode_length": 20,
9
+ "resolution": 224,
10
+ "cameras": [
11
+ "front",
12
+ "wrist_left",
13
+ "wrist_right"
14
+ ],
15
+ "tasks": {
16
+ "bimanual_sweep_to_dustpan": {
17
+ "task_class": "BimanualSweepToDustpan",
18
+ "successes": [
19
+ 0.0
20
+ ],
21
+ "returns": [
22
+ 0.0
23
+ ],
24
+ "path_recoveries": 0,
25
+ "noop_fallbacks": 0,
26
+ "mean_success": 0.0,
27
+ "mean_return": 0.0
28
+ }
29
+ },
30
+ "mean_success": 0.0
31
+ }
artifacts/outputs/interaction_debug/peract2_13_rollout_plan_split/bimanual_sweep_to_dustpan/rollout_eval.md ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # RLBench Rollout Eval
2
+
3
+ - Checkpoint: `/workspace/VLAarchtests/artifacts/outputs/interaction_debug/proxy_interaction_state_clip_actionhist/checkpoint_best.pt`
4
+ - Plan requested: `True`
5
+ - Plan applied: `True`
6
+ - Support-mode conditioning: `True`
7
+ - Mean success: `0.000`
8
+
9
+ ## Per-task
10
+
11
+ - `bimanual_sweep_to_dustpan`: mean_success=0.000, returns=[0.0]
artifacts/outputs/interaction_debug/peract2_13_rollout_plan_split/bimanual_take_tray_out_of_oven/rollout_eval.json ADDED
@@ -0,0 +1,31 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "checkpoint": "/workspace/VLAarchtests/artifacts/outputs/interaction_debug/proxy_interaction_state_clip_actionhist/checkpoint_best.pt",
3
+ "plan_requested": true,
4
+ "plan_applied": true,
5
+ "planner_mode": "trainable",
6
+ "support_mode_conditioning": true,
7
+ "episodes_per_task": 1,
8
+ "episode_length": 20,
9
+ "resolution": 224,
10
+ "cameras": [
11
+ "front",
12
+ "wrist_left",
13
+ "wrist_right"
14
+ ],
15
+ "tasks": {
16
+ "bimanual_take_tray_out_of_oven": {
17
+ "task_class": "BimanualTakeTrayOutOfOven",
18
+ "successes": [
19
+ 0.0
20
+ ],
21
+ "returns": [
22
+ 0.0
23
+ ],
24
+ "path_recoveries": 0,
25
+ "noop_fallbacks": 0,
26
+ "mean_success": 0.0,
27
+ "mean_return": 0.0
28
+ }
29
+ },
30
+ "mean_success": 0.0
31
+ }
artifacts/outputs/interaction_debug/peract2_13_rollout_plan_split/bimanual_take_tray_out_of_oven/rollout_eval.md ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # RLBench Rollout Eval
2
+
3
+ - Checkpoint: `/workspace/VLAarchtests/artifacts/outputs/interaction_debug/proxy_interaction_state_clip_actionhist/checkpoint_best.pt`
4
+ - Plan requested: `True`
5
+ - Plan applied: `True`
6
+ - Support-mode conditioning: `True`
7
+ - Mean success: `0.000`
8
+
9
+ ## Per-task
10
+
11
+ - `bimanual_take_tray_out_of_oven`: mean_success=0.000, returns=[0.0]
artifacts/outputs/interaction_debug/peract2_13_rollout_plan_split/rollout_eval.json ADDED
@@ -0,0 +1,185 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "checkpoint": "/workspace/VLAarchtests/artifacts/outputs/interaction_debug/proxy_interaction_state_clip_actionhist/checkpoint_best.pt",
3
+ "plan_requested": true,
4
+ "plan_applied": true,
5
+ "episodes_per_task": 1,
6
+ "episode_length": 20,
7
+ "resolution": 224,
8
+ "cameras": [
9
+ "front",
10
+ "wrist_left",
11
+ "wrist_right"
12
+ ],
13
+ "tasks": {
14
+ "bimanual_push_box": {
15
+ "task_class": "BimanualPushBox",
16
+ "successes": [
17
+ 0.0
18
+ ],
19
+ "returns": [
20
+ 0.0
21
+ ],
22
+ "path_recoveries": 0,
23
+ "noop_fallbacks": 0,
24
+ "mean_success": 0.0,
25
+ "mean_return": 0.0
26
+ },
27
+ "bimanual_lift_ball": {
28
+ "task_class": "BimanualLiftBall",
29
+ "successes": [
30
+ 0.0
31
+ ],
32
+ "returns": [
33
+ 0.0
34
+ ],
35
+ "path_recoveries": 0,
36
+ "noop_fallbacks": 0,
37
+ "mean_success": 0.0,
38
+ "mean_return": 0.0
39
+ },
40
+ "bimanual_dual_push_buttons": {
41
+ "task_class": "BimanualDualPushButtons",
42
+ "successes": [
43
+ 0.0
44
+ ],
45
+ "returns": [
46
+ 0.0
47
+ ],
48
+ "path_recoveries": 0,
49
+ "noop_fallbacks": 0,
50
+ "mean_success": 0.0,
51
+ "mean_return": 0.0
52
+ },
53
+ "bimanual_pick_plate": {
54
+ "task_class": "BimanualPickPlate",
55
+ "successes": [
56
+ 0.0
57
+ ],
58
+ "returns": [
59
+ 0.0
60
+ ],
61
+ "path_recoveries": 0,
62
+ "noop_fallbacks": 0,
63
+ "mean_success": 0.0,
64
+ "mean_return": 0.0
65
+ },
66
+ "bimanual_put_item_in_drawer": {
67
+ "task_class": "BimanualPutItemInDrawer",
68
+ "successes": [
69
+ 0.0
70
+ ],
71
+ "returns": [
72
+ 0.0
73
+ ],
74
+ "path_recoveries": 0,
75
+ "noop_fallbacks": 0,
76
+ "mean_success": 0.0,
77
+ "mean_return": 0.0
78
+ },
79
+ "bimanual_put_bottle_in_fridge": {
80
+ "task_class": "BimanualPutBottleInFridge",
81
+ "successes": [
82
+ 0.0
83
+ ],
84
+ "returns": [
85
+ 0.0
86
+ ],
87
+ "path_recoveries": 0,
88
+ "noop_fallbacks": 0,
89
+ "mean_success": 0.0,
90
+ "mean_return": 0.0
91
+ },
92
+ "bimanual_handover_item": {
93
+ "task_class": "BimanualHandoverItem",
94
+ "successes": [
95
+ 0.0
96
+ ],
97
+ "returns": [
98
+ 0.0
99
+ ],
100
+ "path_recoveries": 0,
101
+ "noop_fallbacks": 0,
102
+ "mean_success": 0.0,
103
+ "mean_return": 0.0
104
+ },
105
+ "bimanual_pick_laptop": {
106
+ "task_class": "BimanualPickLaptop",
107
+ "successes": [
108
+ 0.0
109
+ ],
110
+ "returns": [
111
+ 0.0
112
+ ],
113
+ "path_recoveries": 0,
114
+ "noop_fallbacks": 0,
115
+ "mean_success": 0.0,
116
+ "mean_return": 0.0
117
+ },
118
+ "bimanual_straighten_rope": {
119
+ "task_class": "BimanualStraightenRope",
120
+ "successes": [
121
+ 0.0
122
+ ],
123
+ "returns": [
124
+ 0.0
125
+ ],
126
+ "path_recoveries": 0,
127
+ "noop_fallbacks": 0,
128
+ "mean_success": 0.0,
129
+ "mean_return": 0.0
130
+ },
131
+ "bimanual_sweep_to_dustpan": {
132
+ "task_class": "BimanualSweepToDustpan",
133
+ "successes": [
134
+ 0.0
135
+ ],
136
+ "returns": [
137
+ 0.0
138
+ ],
139
+ "path_recoveries": 0,
140
+ "noop_fallbacks": 0,
141
+ "mean_success": 0.0,
142
+ "mean_return": 0.0
143
+ },
144
+ "bimanual_lift_tray": {
145
+ "task_class": "BimanualLiftTray",
146
+ "successes": [
147
+ 0.0
148
+ ],
149
+ "returns": [
150
+ 0.0
151
+ ],
152
+ "path_recoveries": 0,
153
+ "noop_fallbacks": 0,
154
+ "mean_success": 0.0,
155
+ "mean_return": 0.0
156
+ },
157
+ "bimanual_handover_item_easy": {
158
+ "task_class": "BimanualHandoverItemEasy",
159
+ "successes": [
160
+ 0.0
161
+ ],
162
+ "returns": [
163
+ 0.0
164
+ ],
165
+ "path_recoveries": 0,
166
+ "noop_fallbacks": 0,
167
+ "mean_success": 0.0,
168
+ "mean_return": 0.0
169
+ },
170
+ "bimanual_take_tray_out_of_oven": {
171
+ "task_class": "BimanualTakeTrayOutOfOven",
172
+ "successes": [
173
+ 0.0
174
+ ],
175
+ "returns": [
176
+ 0.0
177
+ ],
178
+ "path_recoveries": 0,
179
+ "noop_fallbacks": 0,
180
+ "mean_success": 0.0,
181
+ "mean_return": 0.0
182
+ }
183
+ },
184
+ "mean_success": 0.0
185
+ }
artifacts/outputs/interaction_debug/peract2_13_rollout_plan_split/rollout_eval.md ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # RLBench Rollout Eval
2
+
3
+ - Checkpoint: `/workspace/VLAarchtests/artifacts/outputs/interaction_debug/proxy_interaction_state_clip_actionhist/checkpoint_best.pt`
4
+ - Plan requested: `True`
5
+ - Plan applied: `True`
6
+ - Mean success: `0.000`
7
+
8
+ ## Per-task
9
+
10
+ - `bimanual_push_box`: mean_success=0.000, returns=[0.0]
11
+ - `bimanual_lift_ball`: mean_success=0.000, returns=[0.0]
12
+ - `bimanual_dual_push_buttons`: mean_success=0.000, returns=[0.0]
13
+ - `bimanual_pick_plate`: mean_success=0.000, returns=[0.0]
14
+ - `bimanual_put_item_in_drawer`: mean_success=0.000, returns=[0.0]
15
+ - `bimanual_put_bottle_in_fridge`: mean_success=0.000, returns=[0.0]
16
+ - `bimanual_handover_item`: mean_success=0.000, returns=[0.0]
17
+ - `bimanual_pick_laptop`: mean_success=0.000, returns=[0.0]
18
+ - `bimanual_straighten_rope`: mean_success=0.000, returns=[0.0]
19
+ - `bimanual_sweep_to_dustpan`: mean_success=0.000, returns=[0.0]
20
+ - `bimanual_lift_tray`: mean_success=0.000, returns=[0.0]
21
+ - `bimanual_handover_item_easy`: mean_success=0.000, returns=[0.0]
22
+ - `bimanual_take_tray_out_of_oven`: mean_success=0.000, returns=[0.0]
artifacts/outputs/interaction_debug/peract2_bimanual_push_box_launch_smoke.json ADDED
@@ -0,0 +1,35 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "display": ":99",
3
+ "headless": true,
4
+ "task": "BimanualPushBox",
5
+ "description": "push the box to the red area",
6
+ "front_rgb_shape": [
7
+ 128,
8
+ 128,
9
+ 3
10
+ ],
11
+ "wrist_left_rgb_shape": [
12
+ 128,
13
+ 128,
14
+ 3
15
+ ],
16
+ "wrist_right_rgb_shape": [
17
+ 128,
18
+ 128,
19
+ 3
20
+ ],
21
+ "right_pose_shape": [
22
+ 7
23
+ ],
24
+ "left_pose_shape": [
25
+ 7
26
+ ],
27
+ "stepped_mode": "bimanual_noop",
28
+ "reward": 0.0,
29
+ "done": false,
30
+ "front_rgb_shape_after_step": [
31
+ 128,
32
+ 128,
33
+ 3
34
+ ]
35
+ }
artifacts/outputs/interaction_debug/peract2_import_smoke.json ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "camera_names": [
3
+ "front",
4
+ "wrist_left",
5
+ "wrist_right"
6
+ ],
7
+ "resolution": [
8
+ 224,
9
+ 224
10
+ ],
11
+ "global_camera": "front",
12
+ "resolved_upstream_root": "/workspace/third_party/peract2_bimanual_probe_20260324",
13
+ "imports": {
14
+ "rlbench": "ok",
15
+ "pyrep": "ok",
16
+ "yarr": "ok"
17
+ }
18
+ }
artifacts/outputs/interaction_debug/peract2_import_train_command.txt ADDED
@@ -0,0 +1 @@
 
 
1
+ xvfb-run -a -s '-screen 0 1280x1024x24' /workspace/envs/rlbench/bin/python train.py method=PERACT_BC rlbench.task_name=multi_3cam 'rlbench.tasks=[bimanual_push_box,bimanual_lift_ball,bimanual_dual_push_buttons,bimanual_pick_plate,bimanual_put_item_in_drawer,bimanual_put_bottle_in_fridge,bimanual_handover_item,bimanual_pick_laptop,bimanual_straighten_rope,bimanual_sweep_to_dustpan,bimanual_lift_tray,bimanual_handover_item_easy,bimanual_take_tray_out_of_oven]' rlbench.demos=100 rlbench.demo_path=/workspace/data/rlbench2 replay.path=/workspace/replays/rlbench2 framework.logdir=/workspace/logs/rlbench2 framework.training_iterations=40000 framework.gpu=0 framework.env_gpu=0 framework.start_seed=0 ddp.num_devices=1 'rlbench.cameras=[front,wrist_left,wrist_right]' 'rlbench.camera_resolution=[224,224]'
artifacts/outputs/interaction_debug/peract2_smoke_push_box_plan/rollout_eval.json ADDED
@@ -0,0 +1,31 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "checkpoint": "/workspace/VLAarchtests/artifacts/outputs/interaction_debug/proxy_interaction_state_clip_actionhist/checkpoint_best.pt",
3
+ "plan_requested": true,
4
+ "plan_applied": true,
5
+ "planner_mode": "trainable",
6
+ "support_mode_conditioning": true,
7
+ "episodes_per_task": 1,
8
+ "episode_length": 20,
9
+ "resolution": 224,
10
+ "cameras": [
11
+ "front",
12
+ "wrist_left",
13
+ "wrist_right"
14
+ ],
15
+ "tasks": {
16
+ "bimanual_push_box": {
17
+ "task_class": "BimanualPushBox",
18
+ "successes": [
19
+ 0.0
20
+ ],
21
+ "returns": [
22
+ 0.0
23
+ ],
24
+ "path_recoveries": 0,
25
+ "noop_fallbacks": 0,
26
+ "mean_success": 0.0,
27
+ "mean_return": 0.0
28
+ }
29
+ },
30
+ "mean_success": 0.0
31
+ }
artifacts/outputs/interaction_debug/peract2_smoke_push_box_plan/rollout_eval.md ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # RLBench Rollout Eval
2
+
3
+ - Checkpoint: `/workspace/VLAarchtests/artifacts/outputs/interaction_debug/proxy_interaction_state_clip_actionhist/checkpoint_best.pt`
4
+ - Plan requested: `True`
5
+ - Plan applied: `True`
6
+ - Support-mode conditioning: `True`
7
+ - Mean success: `0.000`
8
+
9
+ ## Per-task
10
+
11
+ - `bimanual_push_box`: mean_success=0.000, returns=[0.0]
code/reveal_vla_bimanual/eval/run_peract2_task_sweep.py ADDED
@@ -0,0 +1,210 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from __future__ import annotations
2
+
3
+ import argparse
4
+ import json
5
+ import subprocess
6
+ import sys
7
+ from pathlib import Path
8
+ from typing import Any
9
+
10
+ from sim_rlbench.task_splits import PERACT2_BIMANUAL_TASKS
11
+
12
+
13
+ def _run_task(
14
+ project_root: Path,
15
+ checkpoint: Path,
16
+ output_dir: Path,
17
+ task_name: str,
18
+ *,
19
+ plan: bool,
20
+ episodes_per_task: int,
21
+ episode_length: int,
22
+ resolution: int,
23
+ device: str,
24
+ headless: bool,
25
+ chunk_commit_steps: int,
26
+ allow_unsupervised_planning: bool,
27
+ disable_support_mode_conditioning: bool,
28
+ ) -> dict[str, Any]:
29
+ task_dir = output_dir / task_name
30
+ task_dir.mkdir(parents=True, exist_ok=True)
31
+ command = [
32
+ sys.executable,
33
+ "-m",
34
+ "eval.run_rlbench_rollout_eval",
35
+ "--checkpoint",
36
+ str(checkpoint),
37
+ "--output-dir",
38
+ str(task_dir),
39
+ "--tasks",
40
+ task_name,
41
+ "--episodes-per-task",
42
+ str(episodes_per_task),
43
+ "--episode-length",
44
+ str(episode_length),
45
+ "--resolution",
46
+ str(resolution),
47
+ "--device",
48
+ device,
49
+ "--chunk-commit-steps",
50
+ str(chunk_commit_steps),
51
+ ]
52
+ if headless:
53
+ command.append("--headless")
54
+ if plan:
55
+ command.append("--plan")
56
+ if allow_unsupervised_planning:
57
+ command.append("--allow-unsupervised-planning")
58
+ if disable_support_mode_conditioning:
59
+ command.append("--disable-support-mode-conditioning")
60
+
61
+ completed = subprocess.run(
62
+ command,
63
+ cwd=project_root,
64
+ text=True,
65
+ capture_output=True,
66
+ check=False,
67
+ )
68
+ (task_dir / "command.txt").write_text(" ".join(command) + "\n", encoding="utf-8")
69
+ (task_dir / "stdout.txt").write_text(completed.stdout, encoding="utf-8")
70
+ (task_dir / "stderr.txt").write_text(completed.stderr, encoding="utf-8")
71
+
72
+ rollout_path = task_dir / "rollout_eval.json"
73
+ if rollout_path.exists():
74
+ payload = json.loads(rollout_path.read_text(encoding="utf-8"))
75
+ task_payload = payload.get("tasks", {}).get(task_name, {})
76
+ else:
77
+ task_payload = {}
78
+
79
+ if completed.returncode != 0 and "error" not in task_payload:
80
+ task_payload["error"] = f"subprocess_exit_{completed.returncode}"
81
+ if "mean_success" not in task_payload:
82
+ task_payload["mean_success"] = 0.0
83
+ if "mean_return" not in task_payload:
84
+ task_payload["mean_return"] = 0.0
85
+ task_payload["subprocess_returncode"] = completed.returncode
86
+ task_payload["rollout_path"] = str(rollout_path)
87
+ return task_payload
88
+
89
+
90
+ def _mode_name(plan: bool) -> str:
91
+ return "plan" if plan else "noplan"
92
+
93
+
94
+ def _mode_output_dir(output_root: Path, run_name_prefix: str, plan: bool) -> Path:
95
+ return output_root / f"{run_name_prefix}_{_mode_name(plan)}_split"
96
+
97
+
98
+ def _write_summary_markdown(path: Path, payload: dict[str, Any]) -> None:
99
+ lines = [
100
+ "# PerAct2 13-Task Rollout Sweep",
101
+ "",
102
+ f"- Checkpoint: `{payload['checkpoint']}`",
103
+ f"- Plan requested: `{payload['plan_requested']}`",
104
+ f"- Plan applied: `{payload['plan_applied']}`",
105
+ f"- Episodes per task: `{payload['episodes_per_task']}`",
106
+ f"- Episode length: `{payload['episode_length']}`",
107
+ f"- Resolution: `{payload['resolution']}`",
108
+ f"- Task count: `{payload['task_count']}`",
109
+ f"- Error tasks: `{payload['error_tasks']}`",
110
+ f"- Mean success: `{payload['mean_success']:.3f}`",
111
+ "",
112
+ "## Per-task",
113
+ "",
114
+ ]
115
+ for task_name, task_payload in payload["tasks"].items():
116
+ if "error" in task_payload:
117
+ lines.append(
118
+ f"- `{task_name}`: mean_success={task_payload['mean_success']:.3f}, "
119
+ f"mean_return={task_payload['mean_return']:.3f}, "
120
+ f"error={task_payload['error']}, "
121
+ f"subprocess_returncode={task_payload['subprocess_returncode']}"
122
+ )
123
+ continue
124
+ lines.append(
125
+ f"- `{task_name}`: mean_success={task_payload['mean_success']:.3f}, "
126
+ f"mean_return={task_payload['mean_return']:.3f}, "
127
+ f"path_recoveries={task_payload.get('path_recoveries')}, "
128
+ f"noop_fallbacks={task_payload.get('noop_fallbacks')}"
129
+ )
130
+ path.write_text("\n".join(lines) + "\n", encoding="utf-8")
131
+
132
+
133
+ def _run_mode(args: argparse.Namespace, plan: bool) -> Path:
134
+ project_root = Path(__file__).resolve().parents[1]
135
+ checkpoint = Path(args.checkpoint).resolve()
136
+ output_dir = _mode_output_dir(Path(args.output_root).resolve(), args.run_name_prefix, plan)
137
+ output_dir.mkdir(parents=True, exist_ok=True)
138
+
139
+ summary: dict[str, Any] = {
140
+ "checkpoint": str(checkpoint),
141
+ "plan_requested": plan,
142
+ "plan_applied": plan,
143
+ "episodes_per_task": args.episodes_per_task,
144
+ "episode_length": args.episode_length,
145
+ "resolution": args.resolution,
146
+ "device": args.device,
147
+ "tasks": {},
148
+ "subprocess_mode": "isolated_per_task",
149
+ }
150
+
151
+ tasks = tuple(args.tasks) if args.tasks else PERACT2_BIMANUAL_TASKS
152
+ for task_name in tasks:
153
+ print(f"[peract2-sweep] running task={task_name} plan={plan}", flush=True)
154
+ summary["tasks"][task_name] = _run_task(
155
+ project_root,
156
+ checkpoint,
157
+ output_dir,
158
+ task_name,
159
+ plan=plan,
160
+ episodes_per_task=args.episodes_per_task,
161
+ episode_length=args.episode_length,
162
+ resolution=args.resolution,
163
+ device=args.device,
164
+ headless=args.headless,
165
+ chunk_commit_steps=args.chunk_commit_steps,
166
+ allow_unsupervised_planning=args.allow_unsupervised_planning,
167
+ disable_support_mode_conditioning=args.disable_support_mode_conditioning,
168
+ )
169
+
170
+ task_scores = [float(task_payload["mean_success"]) for task_payload in summary["tasks"].values()]
171
+ summary["task_count"] = len(summary["tasks"])
172
+ summary["error_tasks"] = sorted(
173
+ task_name for task_name, task_payload in summary["tasks"].items() if "error" in task_payload
174
+ )
175
+ summary["mean_success"] = float(sum(task_scores) / len(task_scores)) if task_scores else 0.0
176
+
177
+ summary_path = output_dir / "rollout_eval.json"
178
+ summary_path.write_text(json.dumps(summary, indent=2), encoding="utf-8")
179
+ _write_summary_markdown(output_dir / "rollout_eval.md", summary)
180
+ return summary_path
181
+
182
+
183
+ def main() -> None:
184
+ parser = argparse.ArgumentParser()
185
+ parser.add_argument("--checkpoint", required=True)
186
+ parser.add_argument("--output-root", required=True)
187
+ parser.add_argument("--run-name-prefix", default="peract2_13_rollout")
188
+ parser.add_argument("--tasks", nargs="*", default=list(PERACT2_BIMANUAL_TASKS))
189
+ parser.add_argument("--episodes-per-task", type=int, default=1)
190
+ parser.add_argument("--episode-length", type=int, default=20)
191
+ parser.add_argument("--resolution", type=int, default=224)
192
+ parser.add_argument("--device", default="cuda")
193
+ parser.add_argument("--headless", action="store_true", default=True)
194
+ parser.add_argument("--chunk-commit-steps", type=int, default=4)
195
+ parser.add_argument("--allow-unsupervised-planning", action="store_true")
196
+ parser.add_argument("--disable-support-mode-conditioning", action="store_true")
197
+ parser.add_argument("--skip-noplan", action="store_true")
198
+ parser.add_argument("--skip-plan", action="store_true")
199
+ args = parser.parse_args()
200
+
201
+ generated = []
202
+ if not args.skip_noplan:
203
+ generated.append(_run_mode(args, plan=False))
204
+ if not args.skip_plan:
205
+ generated.append(_run_mode(args, plan=True))
206
+ print(json.dumps({"generated": [str(path) for path in generated]}, indent=2))
207
+
208
+
209
+ if __name__ == "__main__":
210
+ main()
code/reveal_vla_bimanual/eval/run_rlbench_rollout_eval.py CHANGED
@@ -7,12 +7,10 @@ from typing import Any, Sequence
7
 
8
  import numpy as np
9
  import torch
10
- from helpers.utils import create_obs_config
11
- from rlbench.action_modes.action_mode import MoveArmThenGripper2Robots
12
- from rlbench.action_modes.arm_action_modes import EndEffectorPoseViaPlanning2Robots
13
- from rlbench.action_modes.gripper_action_modes import Discrete2Robots
14
- from rlbench.backend.utils import task_file_to_task_class
15
- from rlbench.environments_two_robots import Environment2Robots
16
 
17
  from models.action_decoder import ChunkDecoderConfig
18
  from models.backbones import FrozenVLBackboneConfig
@@ -24,10 +22,12 @@ from models.reveal_head import RevealHeadConfig
24
  from models.world_model import RevealWMConfig
25
  from sim_rlbench.camera_spec import default_three_camera_spec
26
  from sim_rlbench.dataset import (
 
27
  bimanual_proprio_from_obs,
28
- single_arm_absolute_action_from_delta,
29
  stack_live_rgb_obs,
30
  )
 
 
31
  from train.trainer import TrainerConfig, build_policy, planner_enabled, policy_supports_planning
32
 
33
 
@@ -52,66 +52,51 @@ def _episode_language_goal(descriptions: Sequence[str]) -> str:
52
  return str(descriptions[0]) if descriptions else ""
53
 
54
 
55
- def _noop_arm_action(obs: Any, arm_name: str) -> np.ndarray:
56
- if arm_name == "right":
57
- pose = np.asarray(obs.gripper_right_pose, dtype=np.float32)
58
- gripper_open = float(obs.gripper_right_open)
59
- elif arm_name == "left":
60
- pose = np.asarray(obs.gripper_left_pose, dtype=np.float32)
61
- gripper_open = float(obs.gripper_left_open)
62
- else: # pragma: no cover - defensive guard
63
- raise ValueError(f"Unsupported arm: {arm_name}")
64
- return np.concatenate([pose, np.array([gripper_open, 1.0], dtype=np.float32)], axis=0)
 
 
 
 
 
 
 
 
65
 
66
 
67
- def _scaled_single_arm_delta(delta_action: np.ndarray, arm_name: str, scale: float) -> np.ndarray:
68
  scaled = np.asarray(delta_action, dtype=np.float32).copy()
69
- arm_index = {"right": 0, "left": 1}[arm_name]
70
- offset = arm_index * 7
71
- scaled[offset : offset + 6] *= float(scale)
72
  return scaled
73
 
74
 
75
  def _step_bimanual_chunk(task: Any, obs: Any, delta_action: np.ndarray) -> tuple[Any, float, bool, int, int]:
76
- total_reward = 0.0
77
- done = False
78
- next_obs = obs
79
- recovered_steps = 0
80
- noop_fallbacks = 0
81
- for arm_name in ("right", "left"):
82
- reward = 0.0
83
- last_error: Exception | None = None
84
- stepped = False
85
- for scale in (1.0, 0.5, 0.25, 0.1):
86
- try:
87
- env_action = single_arm_absolute_action_from_delta(
88
- next_obs,
89
- _scaled_single_arm_delta(delta_action, arm_name, scale),
90
- arm_name,
91
- ignore_collisions=True,
92
- )
93
- next_obs, reward, done = task.step(env_action, arm_name)
94
- if scale < 1.0:
95
- recovered_steps += 1
96
- stepped = True
97
- break
98
- except Exception as exc: # pragma: no cover - live RLBench failure path
99
- last_error = exc
100
- if not stepped:
101
- try:
102
- next_obs, reward, done = task.step(_noop_arm_action(next_obs, arm_name), arm_name)
103
- noop_fallbacks += 1
104
- stepped = True
105
- except Exception as exc: # pragma: no cover - live RLBench failure path
106
- last_error = exc
107
- if not stepped:
108
- if last_error is not None:
109
- raise last_error
110
- raise RuntimeError(f"Failed to step arm '{arm_name}' for unknown reasons.")
111
- total_reward += float(reward)
112
- if reward >= 1.0 or done:
113
- break
114
- return next_obs, total_reward, done, recovered_steps, noop_fallbacks
115
 
116
 
117
  def main() -> None:
@@ -179,24 +164,19 @@ def main() -> None:
179
  for task_name in args.tasks:
180
  task_successes: list[float] = []
181
  task_returns: list[float] = []
182
- env: Environment2Robots | None = None
183
  try:
184
- task_class = task_file_to_task_class(task_name)
185
- obs_config = create_obs_config(
186
- list(camera_spec.upstream_cameras),
187
- [args.resolution, args.resolution],
188
- "PERACT_BC",
189
- )
190
- action_mode = MoveArmThenGripper2Robots(
191
- EndEffectorPoseViaPlanning2Robots(absolute_mode=True, frame="world", collision_checking=False),
192
- Discrete2Robots(),
193
  )
194
- env = Environment2Robots(
195
  action_mode=action_mode,
196
  obs_config=obs_config,
197
  headless=args.headless,
198
- robot_setup="panda",
199
- task_name=task_class.__name__,
200
  )
201
  env.launch()
202
  task = env.get_task(task_class)
 
7
 
8
  import numpy as np
9
  import torch
10
+ from rlbench.action_modes.action_mode import BimanualMoveArmThenGripper
11
+ from rlbench.action_modes.arm_action_modes import BimanualEndEffectorPoseViaPlanning
12
+ from rlbench.action_modes.gripper_action_modes import BimanualDiscrete
13
+ from rlbench.environment import Environment
 
 
14
 
15
  from models.action_decoder import ChunkDecoderConfig
16
  from models.backbones import FrozenVLBackboneConfig
 
22
  from models.world_model import RevealWMConfig
23
  from sim_rlbench.camera_spec import default_three_camera_spec
24
  from sim_rlbench.dataset import (
25
+ absolute_action_from_delta,
26
  bimanual_proprio_from_obs,
 
27
  stack_live_rgb_obs,
28
  )
29
+ from sim_rlbench.obs_config import build_obs_config
30
+ from sim_rlbench.task_resolver import resolve_task_class
31
  from train.trainer import TrainerConfig, build_policy, planner_enabled, policy_supports_planning
32
 
33
 
 
52
  return str(descriptions[0]) if descriptions else ""
53
 
54
 
55
+ def _noop_bimanual_action(obs: Any) -> np.ndarray:
56
+ right_obs = getattr(obs, "right", None)
57
+ left_obs = getattr(obs, "left", None)
58
+ right = np.concatenate(
59
+ [
60
+ np.asarray(right_obs.gripper_pose, dtype=np.float32),
61
+ np.array([float(right_obs.gripper_open), 1.0], dtype=np.float32),
62
+ ],
63
+ axis=0,
64
+ )
65
+ left = np.concatenate(
66
+ [
67
+ np.asarray(left_obs.gripper_pose, dtype=np.float32),
68
+ np.array([float(left_obs.gripper_open), 1.0], dtype=np.float32),
69
+ ],
70
+ axis=0,
71
+ )
72
+ return np.concatenate([right, left], axis=0)
73
 
74
 
75
+ def _scaled_bimanual_delta(delta_action: np.ndarray, scale: float) -> np.ndarray:
76
  scaled = np.asarray(delta_action, dtype=np.float32).copy()
77
+ scaled[0:6] *= float(scale)
78
+ scaled[7:13] *= float(scale)
 
79
  return scaled
80
 
81
 
82
  def _step_bimanual_chunk(task: Any, obs: Any, delta_action: np.ndarray) -> tuple[Any, float, bool, int, int]:
83
+ last_error: Exception | None = None
84
+ for scale in (1.0, 0.5, 0.25, 0.1):
85
+ try:
86
+ env_action = absolute_action_from_delta(obs, _scaled_bimanual_delta(delta_action, scale), ignore_collisions=True)
87
+ next_obs, reward, done = task.step(env_action)
88
+ recovered_steps = 1 if scale < 1.0 else 0
89
+ return next_obs, float(reward), bool(done), recovered_steps, 0
90
+ except Exception as exc: # pragma: no cover - live RLBench failure path
91
+ last_error = exc
92
+ try:
93
+ next_obs, reward, done = task.step(_noop_bimanual_action(obs))
94
+ return next_obs, float(reward), bool(done), 0, 1
95
+ except Exception as exc: # pragma: no cover - live RLBench failure path
96
+ last_error = exc
97
+ if last_error is not None:
98
+ raise last_error
99
+ raise RuntimeError("Failed to step bimanual action for unknown reasons.")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
100
 
101
 
102
  def main() -> None:
 
164
  for task_name in args.tasks:
165
  task_successes: list[float] = []
166
  task_returns: list[float] = []
167
+ env: Environment | None = None
168
  try:
169
+ task_class = resolve_task_class(task_name)
170
+ obs_config = build_obs_config(list(camera_spec.upstream_cameras), args.resolution)
171
+ action_mode = BimanualMoveArmThenGripper(
172
+ BimanualEndEffectorPoseViaPlanning(absolute_mode=True, frame="world", collision_checking=False),
173
+ BimanualDiscrete(),
 
 
 
 
174
  )
175
+ env = Environment(
176
  action_mode=action_mode,
177
  obs_config=obs_config,
178
  headless=args.headless,
179
+ robot_setup="dual_panda",
 
180
  )
181
  env.launch()
182
  task = env.get_task(task_class)
code/reveal_vla_bimanual/models/backbones.py CHANGED
@@ -2,6 +2,7 @@ from __future__ import annotations
2
 
3
  from dataclasses import dataclass
4
  import math
 
5
  from typing import Sequence
6
 
7
  import torch
@@ -48,12 +49,38 @@ class FrozenVLBackbone(nn.Module):
48
  else:
49
  from transformers import AutoTokenizer, CLIPModel
50
 
51
- clip_model = CLIPModel.from_pretrained(config.model_name, use_safetensors=True)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
52
  self.vision_model = clip_model.vision_model
53
  self.text_model = clip_model.text_model
54
  self.visual_projection = clip_model.visual_projection
55
  self.text_projection = clip_model.text_projection
56
- self.tokenizer = AutoTokenizer.from_pretrained(config.model_name)
 
 
 
 
 
 
57
  self.hidden_dim = clip_model.config.projection_dim
58
  if config.gradient_checkpointing:
59
  if hasattr(self.vision_model, "gradient_checkpointing_enable"):
 
2
 
3
  from dataclasses import dataclass
4
  import math
5
+ from pathlib import Path
6
  from typing import Sequence
7
 
8
  import torch
 
49
  else:
50
  from transformers import AutoTokenizer, CLIPModel
51
 
52
+ local_model_source: str | None = None
53
+ if config.model_name == "openai/clip-vit-base-patch32":
54
+ cache_root = Path("/workspace/.cache/huggingface/hub/models--openai--clip-vit-base-patch32")
55
+ ref_path = cache_root / "refs" / "main"
56
+ if ref_path.exists():
57
+ snapshot_id = ref_path.read_text(encoding="utf-8").strip()
58
+ snapshot_dir = cache_root / "snapshots" / snapshot_id
59
+ if (snapshot_dir / "config.json").exists():
60
+ local_model_source = str(snapshot_dir)
61
+ clip_model = None
62
+ if local_model_source is not None:
63
+ try:
64
+ clip_model = CLIPModel.from_pretrained(
65
+ local_model_source,
66
+ use_safetensors=True,
67
+ local_files_only=True,
68
+ )
69
+ except OSError:
70
+ clip_model = None
71
+ if clip_model is None:
72
+ clip_model = CLIPModel.from_pretrained(config.model_name, use_safetensors=True)
73
  self.vision_model = clip_model.vision_model
74
  self.text_model = clip_model.text_model
75
  self.visual_projection = clip_model.visual_projection
76
  self.text_projection = clip_model.text_projection
77
+ if local_model_source is not None:
78
+ try:
79
+ self.tokenizer = AutoTokenizer.from_pretrained(local_model_source, local_files_only=True)
80
+ except OSError:
81
+ self.tokenizer = AutoTokenizer.from_pretrained(config.model_name)
82
+ else:
83
+ self.tokenizer = AutoTokenizer.from_pretrained(config.model_name)
84
  self.hidden_dim = clip_model.config.projection_dim
85
  if config.gradient_checkpointing:
86
  if hasattr(self.vision_model, "gradient_checkpointing_enable"):
code/reveal_vla_bimanual/scripts/setup_env_a_rlbench.sh CHANGED
@@ -58,10 +58,21 @@ run_in_env python -m pip install --force-reinstall --no-deps numpy==1.26.4 Pillo
58
  run_in_env python -m pip install --no-deps moviepy==2.2.1 timeout-decorator==0.5.0 opencv-python==4.10.0.84 pyquaternion==0.9.9 click-prompt==0.5.1
59
  run_in_env python -m pip install --no-deps poetry-core
60
  run_in_env python -m pip install gymnasium==1.0.0a2 open3d==0.19.0 segment-anything==1.0 transforms3d==0.4.1 openai==0.28.1
61
- PERACT_ROOT="${ROOT_DIR}/third_party/peract_bimanual"
62
- YARR_ROOT="${ROOT_DIR}/third_party/YARR"
63
- PYREP_ROOT="${ROOT_DIR}/third_party/PyRep"
64
- RLBENCH_ROOT="${ROOT_DIR}/third_party/RLBench"
 
 
 
 
 
 
 
 
 
 
 
65
  if [[ -f "${PERACT_ROOT}/YARR/setup.py" ]]; then
66
  YARR_ROOT="${PERACT_ROOT}/YARR"
67
  fi
 
58
  run_in_env python -m pip install --no-deps moviepy==2.2.1 timeout-decorator==0.5.0 opencv-python==4.10.0.84 pyquaternion==0.9.9 click-prompt==0.5.1
59
  run_in_env python -m pip install --no-deps poetry-core
60
  run_in_env python -m pip install gymnasium==1.0.0a2 open3d==0.19.0 segment-anything==1.0 transforms3d==0.4.1 openai==0.28.1
61
+ first_existing_dir() {
62
+ local candidate=""
63
+ for candidate in "$@"; do
64
+ if [[ -d "${candidate}" ]]; then
65
+ printf '%s\n' "${candidate}"
66
+ return 0
67
+ fi
68
+ done
69
+ printf '%s\n' "$1"
70
+ }
71
+
72
+ PERACT_ROOT="$(first_existing_dir "${ROOT_DIR}/third_party/peract2_bimanual_probe_20260324" "${ROOT_DIR}/third_party/peract_bimanual")"
73
+ YARR_ROOT="$(first_existing_dir "${ROOT_DIR}/third_party/YARR_peract2_20260324" "${ROOT_DIR}/third_party/YARR")"
74
+ PYREP_ROOT="$(first_existing_dir "${ROOT_DIR}/third_party/PyRep_peract2_20260324" "${ROOT_DIR}/third_party/PyRep")"
75
+ RLBENCH_ROOT="$(first_existing_dir "${ROOT_DIR}/third_party/RLBench_peract2_20260324" "${ROOT_DIR}/third_party/RLBench")"
76
  if [[ -f "${PERACT_ROOT}/YARR/setup.py" ]]; then
77
  YARR_ROOT="${PERACT_ROOT}/YARR"
78
  fi
code/reveal_vla_bimanual/sim_rlbench/camera_spec.py CHANGED
@@ -4,16 +4,29 @@ from dataclasses import dataclass
4
 
5
  CANONICAL_TO_UPSTREAM_CAMERA = {
6
  "front": "front",
7
- "wrist_left": "wrist2",
8
- "wrist_right": "wrist",
 
 
 
 
 
 
 
 
 
 
9
  }
10
- UPSTREAM_TO_CANONICAL_CAMERA = {value: key for key, value in CANONICAL_TO_UPSTREAM_CAMERA.items()}
11
 
12
 
13
  def canonical_to_upstream_camera(camera_name: str) -> str:
14
  return CANONICAL_TO_UPSTREAM_CAMERA.get(camera_name, camera_name)
15
 
16
 
 
 
 
 
17
  def upstream_to_canonical_camera(camera_name: str) -> str:
18
  return UPSTREAM_TO_CANONICAL_CAMERA.get(camera_name, camera_name)
19
 
@@ -33,7 +46,7 @@ class RLBenchThreeCameraSpec:
33
 
34
  @property
35
  def upstream_cameras(self) -> tuple[str, str, str]:
36
- return tuple(CANONICAL_TO_UPSTREAM_CAMERA.get(camera, camera) for camera in self.cameras) # type: ignore[return-value]
37
 
38
  def hydra_overrides(self, prefix: str = "rlbench") -> list[str]:
39
  camera_list = ",".join(self.upstream_cameras)
 
4
 
5
  CANONICAL_TO_UPSTREAM_CAMERA = {
6
  "front": "front",
7
+ "wrist_left": "wrist_left",
8
+ "wrist_right": "wrist_right",
9
+ }
10
+ CANONICAL_CAMERA_ALIASES = {
11
+ "front": ("front",),
12
+ "wrist_left": ("wrist_left", "wrist2"),
13
+ "wrist_right": ("wrist_right", "wrist"),
14
+ }
15
+ UPSTREAM_TO_CANONICAL_CAMERA = {
16
+ alias: camera_name
17
+ for camera_name, aliases in CANONICAL_CAMERA_ALIASES.items()
18
+ for alias in aliases
19
  }
 
20
 
21
 
22
  def canonical_to_upstream_camera(camera_name: str) -> str:
23
  return CANONICAL_TO_UPSTREAM_CAMERA.get(camera_name, camera_name)
24
 
25
 
26
+ def camera_aliases(camera_name: str) -> tuple[str, ...]:
27
+ return CANONICAL_CAMERA_ALIASES.get(camera_name, (camera_name,))
28
+
29
+
30
  def upstream_to_canonical_camera(camera_name: str) -> str:
31
  return UPSTREAM_TO_CANONICAL_CAMERA.get(camera_name, camera_name)
32
 
 
46
 
47
  @property
48
  def upstream_cameras(self) -> tuple[str, str, str]:
49
+ return tuple(canonical_to_upstream_camera(camera) for camera in self.cameras) # type: ignore[return-value]
50
 
51
  def hydra_overrides(self, prefix: str = "rlbench") -> list[str]:
52
  camera_list = ",".join(self.upstream_cameras)
code/reveal_vla_bimanual/sim_rlbench/dataset.py CHANGED
@@ -10,7 +10,7 @@ import torch
10
  from PIL import Image
11
  from torch.utils.data import Dataset
12
 
13
- from sim_rlbench.camera_spec import canonical_to_upstream_camera
14
 
15
 
16
  THREE_CAMERAS: tuple[str, str, str] = ("front", "wrist_left", "wrist_right")
@@ -27,18 +27,12 @@ def _clip_vector_norm(vector: Sequence[float], max_norm: float) -> np.ndarray:
27
 
28
 
29
  def _camera_value(obs: Any, camera_name: str, suffix: str) -> Any:
30
- upstream_name = canonical_to_upstream_camera(camera_name)
31
- candidate_keys = [
32
- f"{upstream_name}_{suffix}",
33
- f"{camera_name}_{suffix}",
34
- ]
35
  if suffix == "point_cloud":
36
- candidate_keys.extend(
37
- [
38
- f"{upstream_name}_pointcloud",
39
- f"{camera_name}_pointcloud",
40
- ]
41
- )
42
  for key in candidate_keys:
43
  if hasattr(obs, key):
44
  return getattr(obs, key)
@@ -338,10 +332,16 @@ class RLBenchOfflineChunkDataset(Dataset[dict[str, Any]]):
338
  def _load_rgb_stack(self, episode_dir: Path, step_index: int) -> torch.Tensor:
339
  frames: list[np.ndarray] = []
340
  for camera_name in self.cameras:
341
- image_path = episode_dir / f"{camera_name}_rgb" / f"rgb_{step_index:04d}.png"
342
- if not image_path.exists():
343
- upstream_camera_name = canonical_to_upstream_camera(camera_name)
344
- image_path = episode_dir / f"{upstream_camera_name}_rgb" / f"rgb_{step_index:04d}.png"
 
 
 
 
 
 
345
  image = Image.open(image_path).convert("RGB")
346
  if image.size != (self.resolution, self.resolution):
347
  image = image.resize((self.resolution, self.resolution), Image.Resampling.BILINEAR)
 
10
  from PIL import Image
11
  from torch.utils.data import Dataset
12
 
13
+ from sim_rlbench.camera_spec import camera_aliases, canonical_to_upstream_camera
14
 
15
 
16
  THREE_CAMERAS: tuple[str, str, str] = ("front", "wrist_left", "wrist_right")
 
27
 
28
 
29
  def _camera_value(obs: Any, camera_name: str, suffix: str) -> Any:
30
+ candidate_keys: list[str] = []
31
+ for alias in camera_aliases(camera_name):
32
+ candidate_keys.append(f"{alias}_{suffix}")
 
 
33
  if suffix == "point_cloud":
34
+ for alias in camera_aliases(camera_name):
35
+ candidate_keys.append(f"{alias}_pointcloud")
 
 
 
 
36
  for key in candidate_keys:
37
  if hasattr(obs, key):
38
  return getattr(obs, key)
 
332
  def _load_rgb_stack(self, episode_dir: Path, step_index: int) -> torch.Tensor:
333
  frames: list[np.ndarray] = []
334
  for camera_name in self.cameras:
335
+ image_path = None
336
+ for camera_alias in camera_aliases(camera_name):
337
+ candidate = episode_dir / f"{camera_alias}_rgb" / f"rgb_{step_index:04d}.png"
338
+ if candidate.exists():
339
+ image_path = candidate
340
+ break
341
+ if image_path is None:
342
+ raise FileNotFoundError(
343
+ f"Could not locate RGB frame for camera '{camera_name}' step {step_index} in {episode_dir}"
344
+ )
345
  image = Image.open(image_path).convert("RGB")
346
  if image.size != (self.resolution, self.resolution):
347
  image = image.resize((self.resolution, self.resolution), Image.Resampling.BILINEAR)
code/reveal_vla_bimanual/sim_rlbench/generate_smoke_dataset.py CHANGED
@@ -7,10 +7,9 @@ from pathlib import Path
7
 
8
  import numpy as np
9
  from PIL import Image
10
- from helpers.utils import create_obs_config
11
- from rlbench.action_modes.action_mode import MoveArmThenGripper2Robots
12
- from rlbench.action_modes.arm_action_modes import EndEffectorPoseViaPlanning2Robots
13
- from rlbench.action_modes.gripper_action_modes import Discrete2Robots
14
  from rlbench.backend.const import (
15
  EPISODE_FOLDER,
16
  EPISODES_FOLDER,
@@ -19,15 +18,15 @@ from rlbench.backend.const import (
19
  VARIATION_NUMBER,
20
  VARIATIONS_ALL_FOLDER,
21
  )
22
- from rlbench.backend.utils import task_file_to_task_class
23
- from rlbench.environments_two_robots import Environment2Robots
24
 
25
- from sim_rlbench.camera_spec import canonical_to_upstream_camera, default_three_camera_spec
 
 
26
 
27
 
28
  def _camera_payload(obs: object, camera_name: str, suffix: str):
29
- upstream_name = canonical_to_upstream_camera(camera_name)
30
- for key in (f"{upstream_name}_{suffix}", f"{camera_name}_{suffix}"):
31
  if hasattr(obs, key):
32
  return getattr(obs, key)
33
  return None
@@ -70,22 +69,17 @@ def main() -> None:
70
  args = parser.parse_args()
71
 
72
  spec = default_three_camera_spec(args.resolution)
73
- obs_config = create_obs_config(
74
- list(spec.upstream_cameras),
75
- [args.resolution, args.resolution],
76
- "PERACT_BC",
77
- )
78
 
79
- task_class = task_file_to_task_class(args.task)
80
- env = Environment2Robots(
81
- action_mode=MoveArmThenGripper2Robots(
82
- EndEffectorPoseViaPlanning2Robots(absolute_mode=True, frame="world", collision_checking=False),
83
- Discrete2Robots(),
84
  ),
85
  obs_config=obs_config,
86
  headless=True,
87
- robot_setup="panda",
88
- task_name=task_class.__name__,
89
  )
90
  output_root = Path(args.output_root)
91
  episodes_root = output_root / args.task / VARIATIONS_ALL_FOLDER / EPISODES_FOLDER
 
7
 
8
  import numpy as np
9
  from PIL import Image
10
+ from rlbench.action_modes.action_mode import BimanualMoveArmThenGripper
11
+ from rlbench.action_modes.arm_action_modes import BimanualEndEffectorPoseViaPlanning
12
+ from rlbench.action_modes.gripper_action_modes import BimanualDiscrete
 
13
  from rlbench.backend.const import (
14
  EPISODE_FOLDER,
15
  EPISODES_FOLDER,
 
18
  VARIATION_NUMBER,
19
  VARIATIONS_ALL_FOLDER,
20
  )
21
+ from rlbench.environment import Environment
 
22
 
23
+ from sim_rlbench.camera_spec import camera_aliases, default_three_camera_spec
24
+ from sim_rlbench.obs_config import build_obs_config
25
+ from sim_rlbench.task_resolver import resolve_task_class
26
 
27
 
28
  def _camera_payload(obs: object, camera_name: str, suffix: str):
29
+ for key in [f"{alias}_{suffix}" for alias in camera_aliases(camera_name)]:
 
30
  if hasattr(obs, key):
31
  return getattr(obs, key)
32
  return None
 
69
  args = parser.parse_args()
70
 
71
  spec = default_three_camera_spec(args.resolution)
72
+ obs_config = build_obs_config(list(spec.upstream_cameras), args.resolution)
 
 
 
 
73
 
74
+ task_class = resolve_task_class(args.task)
75
+ env = Environment(
76
+ action_mode=BimanualMoveArmThenGripper(
77
+ BimanualEndEffectorPoseViaPlanning(absolute_mode=True, frame="world", collision_checking=False),
78
+ BimanualDiscrete(),
79
  ),
80
  obs_config=obs_config,
81
  headless=True,
82
+ robot_setup="dual_panda",
 
83
  )
84
  output_root = Path(args.output_root)
85
  episodes_root = output_root / args.task / VARIATIONS_ALL_FOLDER / EPISODES_FOLDER
code/reveal_vla_bimanual/sim_rlbench/launch_smoke.py CHANGED
@@ -5,73 +5,88 @@ import json
5
  import os
6
 
7
  import numpy as np
8
- from helpers.utils import create_obs_config
9
- from rlbench.action_modes.action_mode import MoveArmThenGripper2Robots
10
- from rlbench.action_modes.arm_action_modes import EndEffectorPoseViaPlanning2Robots
11
- from rlbench.action_modes.gripper_action_modes import Discrete2Robots
12
- from rlbench.backend.utils import task_file_to_task_class
13
- from rlbench.environments_two_robots import Environment2Robots
14
 
15
  from sim_rlbench.camera_spec import default_three_camera_spec
 
 
16
 
17
 
18
- def _noop_arm_action(obs: object, arm_name: str) -> np.ndarray:
19
- if arm_name == "right":
20
- pose = np.asarray(obs.gripper_right_pose, dtype=np.float32)
21
- gripper_open = float(obs.gripper_right_open)
22
- elif arm_name == "left":
23
- pose = np.asarray(obs.gripper_left_pose, dtype=np.float32)
24
- gripper_open = float(obs.gripper_left_open)
25
- else: # pragma: no cover - smoke-only guard
26
- raise ValueError(f"Unsupported arm: {arm_name}")
27
- return np.concatenate([pose, np.array([gripper_open, 1.0], dtype=np.float32)], axis=0)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
28
 
29
 
30
  def main() -> None:
31
  parser = argparse.ArgumentParser()
32
- parser.add_argument("--task", default="open_drawer")
33
  parser.add_argument("--resolution", type=int, default=224)
34
  parser.add_argument("--display", default=None)
35
  parser.add_argument("--headless", action="store_true", default=True)
36
  parser.add_argument("--visible", action="store_true")
37
- parser.add_argument("--arm", choices=("right", "left"), default="right")
38
  args = parser.parse_args()
39
 
40
  headless = args.headless and not args.visible
41
  spec = default_three_camera_spec(args.resolution)
42
- task_cls = task_file_to_task_class(args.task)
43
- obs_config = create_obs_config(list(spec.upstream_cameras), [args.resolution, args.resolution], "PERACT_BC")
44
- action_mode = MoveArmThenGripper2Robots(
45
- EndEffectorPoseViaPlanning2Robots(absolute_mode=True, frame="world", collision_checking=False),
46
- Discrete2Robots(),
47
  )
48
- env = Environment2Robots(
49
  action_mode=action_mode,
50
  obs_config=obs_config,
51
  headless=headless,
52
- robot_setup="panda",
53
- task_name=task_cls.__name__,
54
  )
55
 
56
  try:
57
  env.launch()
58
  task = env.get_task(task_cls)
59
  descriptions, obs = task.reset()
60
- next_obs, reward, done = task.step(_noop_arm_action(obs, args.arm), args.arm)
61
  payload = {
62
  "display": args.display or os.environ.get("DISPLAY"),
63
  "headless": headless,
64
  "task": task_cls.__name__,
65
  "description": descriptions[0] if descriptions else "",
66
- "front_rgb_shape": None if obs.front_rgb is None else list(obs.front_rgb.shape),
67
- "wrist_rgb_shape": None if obs.wrist_rgb is None else list(obs.wrist_rgb.shape),
68
- "wrist2_rgb_shape": None if obs.wrist2_rgb is None else list(obs.wrist2_rgb.shape),
69
- "right_pose_shape": None if obs.gripper_right_pose is None else list(obs.gripper_right_pose.shape),
70
- "left_pose_shape": None if obs.gripper_left_pose is None else list(obs.gripper_left_pose.shape),
71
- "stepped_arm": args.arm,
72
  "reward": float(reward),
73
  "done": bool(done),
74
- "front_rgb_shape_after_step": None if next_obs.front_rgb is None else list(next_obs.front_rgb.shape),
75
  }
76
  print(json.dumps(payload, indent=2))
77
  finally:
 
5
  import os
6
 
7
  import numpy as np
8
+ from rlbench.action_modes.action_mode import BimanualMoveArmThenGripper
9
+ from rlbench.action_modes.arm_action_modes import BimanualEndEffectorPoseViaPlanning
10
+ from rlbench.action_modes.gripper_action_modes import BimanualDiscrete
11
+ from rlbench.environment import Environment
 
 
12
 
13
  from sim_rlbench.camera_spec import default_three_camera_spec
14
+ from sim_rlbench.obs_config import build_obs_config
15
+ from sim_rlbench.task_resolver import resolve_task_class
16
 
17
 
18
+ def _camera_shape(obs: object, camera_name: str):
19
+ perception_data = getattr(obs, "perception_data", None)
20
+ if isinstance(perception_data, dict):
21
+ value = perception_data.get(f"{camera_name}_rgb")
22
+ if value is not None:
23
+ return list(np.asarray(value).shape)
24
+ return None
25
+
26
+
27
+ def _noop_bimanual_action(obs: object) -> np.ndarray:
28
+ right_obs = getattr(obs, "right", None)
29
+ left_obs = getattr(obs, "left", None)
30
+ right = np.concatenate(
31
+ [
32
+ np.asarray(right_obs.gripper_pose, dtype=np.float32),
33
+ np.array([float(right_obs.gripper_open), 1.0], dtype=np.float32),
34
+ ],
35
+ axis=0,
36
+ )
37
+ left = np.concatenate(
38
+ [
39
+ np.asarray(left_obs.gripper_pose, dtype=np.float32),
40
+ np.array([float(left_obs.gripper_open), 1.0], dtype=np.float32),
41
+ ],
42
+ axis=0,
43
+ )
44
+ return np.concatenate([right, left], axis=0)
45
 
46
 
47
  def main() -> None:
48
  parser = argparse.ArgumentParser()
49
+ parser.add_argument("--task", default="bimanual_push_box")
50
  parser.add_argument("--resolution", type=int, default=224)
51
  parser.add_argument("--display", default=None)
52
  parser.add_argument("--headless", action="store_true", default=True)
53
  parser.add_argument("--visible", action="store_true")
 
54
  args = parser.parse_args()
55
 
56
  headless = args.headless and not args.visible
57
  spec = default_three_camera_spec(args.resolution)
58
+ task_cls = resolve_task_class(args.task)
59
+ obs_config = build_obs_config(list(spec.upstream_cameras), args.resolution)
60
+ action_mode = BimanualMoveArmThenGripper(
61
+ BimanualEndEffectorPoseViaPlanning(absolute_mode=True, frame="world", collision_checking=False),
62
+ BimanualDiscrete(),
63
  )
64
+ env = Environment(
65
  action_mode=action_mode,
66
  obs_config=obs_config,
67
  headless=headless,
68
+ robot_setup="dual_panda",
 
69
  )
70
 
71
  try:
72
  env.launch()
73
  task = env.get_task(task_cls)
74
  descriptions, obs = task.reset()
75
+ next_obs, reward, done = task.step(_noop_bimanual_action(obs))
76
  payload = {
77
  "display": args.display or os.environ.get("DISPLAY"),
78
  "headless": headless,
79
  "task": task_cls.__name__,
80
  "description": descriptions[0] if descriptions else "",
81
+ "front_rgb_shape": _camera_shape(obs, "front"),
82
+ "wrist_left_rgb_shape": _camera_shape(obs, "wrist_left"),
83
+ "wrist_right_rgb_shape": _camera_shape(obs, "wrist_right"),
84
+ "right_pose_shape": list(obs.right.gripper_pose.shape),
85
+ "left_pose_shape": list(obs.left.gripper_pose.shape),
86
+ "stepped_mode": "bimanual_noop",
87
  "reward": float(reward),
88
  "done": bool(done),
89
+ "front_rgb_shape_after_step": _camera_shape(next_obs, "front"),
90
  }
91
  print(json.dumps(payload, indent=2))
92
  finally:
code/reveal_vla_bimanual/sim_rlbench/obs_adapter.py CHANGED
@@ -5,7 +5,7 @@ from typing import Any
5
 
6
  import numpy as np
7
 
8
- from sim_rlbench.camera_spec import RLBenchThreeCameraSpec, canonical_to_upstream_camera
9
 
10
 
11
  @dataclass
@@ -31,50 +31,44 @@ class CanonicalBimanualObservation:
31
 
32
 
33
  def _camera_rgb(obs: Any, camera_name: str) -> np.ndarray:
34
- upstream_name = canonical_to_upstream_camera(camera_name)
35
- for key in (f"{upstream_name}_rgb", f"{camera_name}_rgb"):
36
  if hasattr(obs, key):
37
  return np.asarray(getattr(obs, key), dtype=np.uint8)
38
  perception_data = getattr(obs, "perception_data", None)
39
  if isinstance(perception_data, dict):
40
- for key in (f"{upstream_name}_rgb", f"{camera_name}_rgb"):
41
  if key in perception_data:
42
  return np.asarray(perception_data[key], dtype=np.uint8)
43
  raise KeyError(f"Observation does not expose RGB for camera '{camera_name}'")
44
 
45
 
46
  def _camera_point_cloud(obs: Any, camera_name: str) -> np.ndarray:
47
- upstream_name = canonical_to_upstream_camera(camera_name)
48
- for key in (
49
- f"{upstream_name}_point_cloud",
50
- f"{upstream_name}_pointcloud",
51
- f"{camera_name}_point_cloud",
52
- f"{camera_name}_pointcloud",
53
- ):
54
  if hasattr(obs, key):
55
  return np.asarray(getattr(obs, key), dtype=np.float32)
56
  perception_data = getattr(obs, "perception_data", None)
57
  if isinstance(perception_data, dict):
58
- for key in (
59
- f"{upstream_name}_point_cloud",
60
- f"{upstream_name}_pointcloud",
61
- f"{camera_name}_point_cloud",
62
- f"{camera_name}_pointcloud",
63
- ):
64
  if key in perception_data:
65
  return np.asarray(perception_data[key], dtype=np.float32)
66
  raise KeyError(f"Observation does not expose point clouds for camera '{camera_name}'")
67
 
68
 
69
  def _camera_misc(obs: Any, camera_name: str, field_name: str) -> np.ndarray:
70
- upstream_name = canonical_to_upstream_camera(camera_name)
71
  misc = getattr(obs, "misc", {})
72
- for key in (
73
- f"{upstream_name}_camera_{field_name}",
74
- f"{camera_name}_camera_{field_name}",
75
- f"{upstream_name}_{field_name}",
76
- f"{camera_name}_{field_name}",
77
- ):
 
 
 
78
  if key in misc:
79
  return np.asarray(misc[key], dtype=np.float32)
80
  raise KeyError(f"Observation misc does not expose {field_name} for camera '{camera_name}'")
 
5
 
6
  import numpy as np
7
 
8
+ from sim_rlbench.camera_spec import RLBenchThreeCameraSpec, camera_aliases
9
 
10
 
11
  @dataclass
 
31
 
32
 
33
  def _camera_rgb(obs: Any, camera_name: str) -> np.ndarray:
34
+ candidate_keys = [f"{alias}_rgb" for alias in camera_aliases(camera_name)]
35
+ for key in candidate_keys:
36
  if hasattr(obs, key):
37
  return np.asarray(getattr(obs, key), dtype=np.uint8)
38
  perception_data = getattr(obs, "perception_data", None)
39
  if isinstance(perception_data, dict):
40
+ for key in candidate_keys:
41
  if key in perception_data:
42
  return np.asarray(perception_data[key], dtype=np.uint8)
43
  raise KeyError(f"Observation does not expose RGB for camera '{camera_name}'")
44
 
45
 
46
  def _camera_point_cloud(obs: Any, camera_name: str) -> np.ndarray:
47
+ candidate_keys = []
48
+ for alias in camera_aliases(camera_name):
49
+ candidate_keys.extend([f"{alias}_point_cloud", f"{alias}_pointcloud"])
50
+ for key in candidate_keys:
 
 
 
51
  if hasattr(obs, key):
52
  return np.asarray(getattr(obs, key), dtype=np.float32)
53
  perception_data = getattr(obs, "perception_data", None)
54
  if isinstance(perception_data, dict):
55
+ for key in candidate_keys:
 
 
 
 
 
56
  if key in perception_data:
57
  return np.asarray(perception_data[key], dtype=np.float32)
58
  raise KeyError(f"Observation does not expose point clouds for camera '{camera_name}'")
59
 
60
 
61
  def _camera_misc(obs: Any, camera_name: str, field_name: str) -> np.ndarray:
 
62
  misc = getattr(obs, "misc", {})
63
+ candidate_keys = []
64
+ for alias in camera_aliases(camera_name):
65
+ candidate_keys.extend(
66
+ [
67
+ f"{alias}_camera_{field_name}",
68
+ f"{alias}_{field_name}",
69
+ ]
70
+ )
71
+ for key in candidate_keys:
72
  if key in misc:
73
  return np.asarray(misc[key], dtype=np.float32)
74
  raise KeyError(f"Observation misc does not expose {field_name} for camera '{camera_name}'")
code/reveal_vla_bimanual/sim_rlbench/obs_config.py ADDED
@@ -0,0 +1,40 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from __future__ import annotations
2
+
3
+ from rlbench.observation_config import CameraConfig, ObservationConfig
4
+
5
+
6
+ def build_obs_config(
7
+ cameras: list[str],
8
+ resolution: int,
9
+ *,
10
+ rgb: bool = True,
11
+ depth: bool = False,
12
+ point_cloud: bool = False,
13
+ mask: bool = False,
14
+ ) -> ObservationConfig:
15
+ camera_configs = {
16
+ camera: CameraConfig(
17
+ rgb=rgb,
18
+ depth=depth,
19
+ point_cloud=point_cloud,
20
+ mask=mask,
21
+ image_size=(resolution, resolution),
22
+ )
23
+ for camera in cameras
24
+ }
25
+ return ObservationConfig(
26
+ camera_configs=camera_configs,
27
+ joint_velocities=True,
28
+ joint_positions=True,
29
+ joint_forces=True,
30
+ gripper_open=True,
31
+ gripper_pose=True,
32
+ gripper_matrix=False,
33
+ gripper_joint_positions=False,
34
+ gripper_touch_forces=False,
35
+ wrist_camera_matrix=False,
36
+ record_gripper_closing=False,
37
+ task_low_dim_state=True,
38
+ record_ignore_collisions=True,
39
+ robot_name="dual_panda",
40
+ )
code/reveal_vla_bimanual/sim_rlbench/peract2_runner.py CHANGED
@@ -40,7 +40,7 @@ def resolve_upstream_root(upstream_root: Path) -> Path:
40
 
41
  @dataclass
42
  class BenchmarkRunSpec:
43
- upstream_root: Path = Path("/workspace/third_party/peract_bimanual")
44
  demo_path: Path = Path("/workspace/data/rlbench2")
45
  replay_path: Path = Path("/workspace/replays/rlbench2")
46
  logdir: Path = Path("/workspace/logs/rlbench2")
 
40
 
41
  @dataclass
42
  class BenchmarkRunSpec:
43
+ upstream_root: Path = Path("/workspace/third_party/peract2_bimanual_probe_20260324")
44
  demo_path: Path = Path("/workspace/data/rlbench2")
45
  replay_path: Path = Path("/workspace/replays/rlbench2")
46
  logdir: Path = Path("/workspace/logs/rlbench2")
code/reveal_vla_bimanual/sim_rlbench/smoke_test.py CHANGED
@@ -12,7 +12,7 @@ from sim_rlbench.peract2_runner import BenchmarkRunSpec, resolve_upstream_root
12
  def main() -> None:
13
  parser = argparse.ArgumentParser()
14
  parser.add_argument("--demo-path", default="/workspace/data/rlbench2")
15
- parser.add_argument("--upstream-root", default="/workspace/third_party/peract_bimanual")
16
  parser.add_argument("--print-train-command", action="store_true")
17
  args = parser.parse_args()
18
 
 
12
  def main() -> None:
13
  parser = argparse.ArgumentParser()
14
  parser.add_argument("--demo-path", default="/workspace/data/rlbench2")
15
+ parser.add_argument("--upstream-root", default="/workspace/third_party/peract2_bimanual_probe_20260324")
16
  parser.add_argument("--print-train-command", action="store_true")
17
  args = parser.parse_args()
18
 
code/reveal_vla_bimanual/sim_rlbench/task_resolver.py ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from __future__ import annotations
2
+
3
+ from rlbench.backend.utils import task_file_to_task_class
4
+
5
+
6
+ def is_bimanual_task_name(task_name: str) -> bool:
7
+ return task_name.startswith("bimanual_")
8
+
9
+
10
+ def resolve_task_class(task_name: str):
11
+ return task_file_to_task_class(task_name, bimanual=is_bimanual_task_name(task_name))
environment/run_peract2_13_rollouts.sh ADDED
@@ -0,0 +1,57 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ ROOT_DIR="${ROOT_DIR:-/workspace}"
5
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
6
+ BUNDLE_ROOT="$(cd "${SCRIPT_DIR}/.." && pwd)"
7
+ PROJECT_DIR="${PROJECT_DIR:-${ROOT_DIR}/reveal_vla_bimanual}"
8
+ MAMBA_BIN="${ROOT_DIR}/.tools/micromamba/bin/micromamba"
9
+ MAMBA_ROOT_PREFIX="${ROOT_DIR}/.micromamba"
10
+ ENV_PREFIX="${ROOT_DIR}/envs/rlbench"
11
+ DISPLAY_NUM="${DISPLAY_NUM:-99}"
12
+ DISPLAY=":${DISPLAY_NUM}"
13
+ COPPELIA_DIR="${COPPELIASIM_ROOT:-${ROOT_DIR}/assets/coppeliasim_v4_1_0}"
14
+ RUNTIME_DIR="${ROOT_DIR}/runtime"
15
+ CHECKPOINT="${CHECKPOINT:-${BUNDLE_ROOT}/artifacts/outputs/interaction_debug/proxy_interaction_state_clip_actionhist/checkpoint_best.pt}"
16
+ OUTPUT_ROOT="${OUTPUT_ROOT:-${BUNDLE_ROOT}/artifacts/outputs/interaction_debug}"
17
+ RUN_NAME_PREFIX="${RUN_NAME_PREFIX:-peract2_13_rollout}"
18
+
19
+ mkdir -p "${RUNTIME_DIR}"
20
+ chmod 700 "${RUNTIME_DIR}"
21
+
22
+ ensure_rlbench_display() {
23
+ if DISPLAY="${DISPLAY}" xdpyinfo >/dev/null 2>&1; then
24
+ return 0
25
+ fi
26
+ ROOT_DIR="${ROOT_DIR}" DISPLAY_NUM="${DISPLAY_NUM}" "${PROJECT_DIR}/scripts/start_rlbench_x.sh"
27
+ }
28
+
29
+ run_in_rlbench_env() {
30
+ local driver_version=""
31
+ local driver_branch=""
32
+ local shim_ld=""
33
+ if command -v nvidia-smi >/dev/null 2>&1; then
34
+ driver_version="$(nvidia-smi --query-gpu=driver_version --format=csv,noheader | head -n1 || true)"
35
+ driver_branch="${driver_version%%.*}"
36
+ if [[ -n "${driver_branch}" && -d "${ROOT_DIR}/system_shims/nvidia${driver_branch}/usr/lib/x86_64-linux-gnu" ]]; then
37
+ shim_ld="${ROOT_DIR}/system_shims/nvidia${driver_branch}/usr/lib/x86_64-linux-gnu"
38
+ fi
39
+ fi
40
+ env \
41
+ DISPLAY="${DISPLAY}" \
42
+ COPPELIASIM_ROOT="${COPPELIA_DIR}" \
43
+ XDG_RUNTIME_DIR="${RUNTIME_DIR}" \
44
+ LD_LIBRARY_PATH="${COPPELIA_DIR}${shim_ld:+:${shim_ld}}${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}" \
45
+ QT_QPA_PLATFORM_PLUGIN_PATH="${COPPELIA_DIR}" \
46
+ "${MAMBA_BIN}" run -r "${MAMBA_ROOT_PREFIX}" -p "${ENV_PREFIX}" "$@"
47
+ }
48
+
49
+ ensure_rlbench_display
50
+
51
+ run_in_rlbench_env python -m eval.run_peract2_task_sweep \
52
+ --checkpoint "${CHECKPOINT}" \
53
+ --output-root "${OUTPUT_ROOT}" \
54
+ --run-name-prefix "${RUN_NAME_PREFIX}" \
55
+ --headless \
56
+ --chunk-commit-steps 4 \
57
+ "$@"
environment/setup_same_machine.sh CHANGED
@@ -8,6 +8,7 @@ BUNDLED_PROJECT_DIR="${BUNDLE_ROOT}/code/reveal_vla_bimanual"
8
  PROJECT_DIR="${PROJECT_DIR:-${ROOT_DIR}/reveal_vla_bimanual}"
9
  THIRD_PARTY_DIR="${ROOT_DIR}/third_party"
10
  INSTALL_ENV_B="${INSTALL_ENV_B:-1}"
 
11
 
12
  echo "Using ROOT_DIR=${ROOT_DIR}"
13
  echo "Using BUNDLE_ROOT=${BUNDLE_ROOT}"
@@ -39,10 +40,16 @@ mkdir -p "${THIRD_PARTY_DIR}"
39
  ensure_project_dir
40
 
41
  echo "1/6 Sync pinned third-party repos"
42
- sync_repo "${THIRD_PARTY_DIR}/peract_bimanual" "https://github.com/markusgrotz/peract_bimanual.git" "bb0232a6ba3fe116566e9568f0c7af980ed6703d"
43
- sync_repo "${THIRD_PARTY_DIR}/RLBench" "https://github.com/markusgrotz/RLBench.git" "8af748c51287989294e00c9c670e3330a0e35ed5"
44
- sync_repo "${THIRD_PARTY_DIR}/PyRep" "https://github.com/markusgrotz/PyRep.git" "b8bd1d7a3182adcd570d001649c0849047ebf197"
45
- sync_repo "${THIRD_PARTY_DIR}/YARR" "https://github.com/markusgrotz/YARR.git" "6822ff78602c77878b27d4cfe759ce029c67bffb"
 
 
 
 
 
 
46
 
47
  echo "2/6 Install or update Env A (RLBench / PerAct2)"
48
  ROOT_DIR="${ROOT_DIR}" "${PROJECT_DIR}/scripts/setup_env_a_rlbench.sh"
@@ -67,6 +74,7 @@ echo " INSTALL_ISAACSIM=1 ${PROJECT_DIR}/scripts/setup_env_b_reveal.sh"
67
  echo
68
  echo "Recommended validation commands:"
69
  echo " DISPLAY=:99 glxinfo -B"
70
- echo " /workspace/.tools/micromamba/bin/micromamba run -r /workspace/.micromamba -p /workspace/envs/rlbench python -m sim_rlbench.launch_smoke --headless"
 
71
  echo " /workspace/.tools/micromamba/bin/micromamba run -r /workspace/.micromamba -p /workspace/envs/rlbench python -m sim_reveal.isaac_smoke"
72
  echo " ${BUNDLE_ROOT}/environment/validate_same_machine.sh"
 
8
  PROJECT_DIR="${PROJECT_DIR:-${ROOT_DIR}/reveal_vla_bimanual}"
9
  THIRD_PARTY_DIR="${ROOT_DIR}/third_party"
10
  INSTALL_ENV_B="${INSTALL_ENV_B:-1}"
11
+ INSTALL_LEGACY_LAYOUT="${INSTALL_LEGACY_LAYOUT:-0}"
12
 
13
  echo "Using ROOT_DIR=${ROOT_DIR}"
14
  echo "Using BUNDLE_ROOT=${BUNDLE_ROOT}"
 
40
  ensure_project_dir
41
 
42
  echo "1/6 Sync pinned third-party repos"
43
+ sync_repo "${THIRD_PARTY_DIR}/peract2_bimanual_probe_20260324" "https://github.com/markusgrotz/peract_bimanual.git" "bb0232a6ba3fe116566e9568f0c7af980ed6703d"
44
+ sync_repo "${THIRD_PARTY_DIR}/RLBench_peract2_20260324" "https://github.com/markusgrotz/RLBench.git" "8af748c51287989294e00c9c670e3330a0e35ed5"
45
+ sync_repo "${THIRD_PARTY_DIR}/PyRep_peract2_20260324" "https://github.com/markusgrotz/PyRep.git" "b8bd1d7a3182adcd570d001649c0849047ebf197"
46
+ sync_repo "${THIRD_PARTY_DIR}/YARR_peract2_20260324" "https://github.com/markusgrotz/YARR.git" "6822ff78602c77878b27d4cfe759ce029c67bffb"
47
+ if [[ "${INSTALL_LEGACY_LAYOUT}" == "1" ]]; then
48
+ sync_repo "${THIRD_PARTY_DIR}/peract_bimanual" "https://github.com/markusgrotz/peract_bimanual.git" "1cc074b1730f52a7fd35d069d8c9099d18718bca"
49
+ sync_repo "${THIRD_PARTY_DIR}/RLBench" "https://github.com/markusgrotz/RLBench.git" "02720bba4c73fe02eb75df946b8791b806028a9d"
50
+ sync_repo "${THIRD_PARTY_DIR}/PyRep" "https://github.com/markusgrotz/PyRep.git" "b8bd1d7a3182adcd570d001649c0849047ebf197"
51
+ sync_repo "${THIRD_PARTY_DIR}/YARR" "https://github.com/markusgrotz/YARR.git" "6822ff78602c77878b27d4cfe759ce029c67bffb"
52
+ fi
53
 
54
  echo "2/6 Install or update Env A (RLBench / PerAct2)"
55
  ROOT_DIR="${ROOT_DIR}" "${PROJECT_DIR}/scripts/setup_env_a_rlbench.sh"
 
74
  echo
75
  echo "Recommended validation commands:"
76
  echo " DISPLAY=:99 glxinfo -B"
77
+ echo " /workspace/.tools/micromamba/bin/micromamba run -r /workspace/.micromamba -p /workspace/envs/rlbench python -m sim_rlbench.launch_smoke --task bimanual_push_box --headless"
78
+ echo " ${BUNDLE_ROOT}/environment/run_peract2_13_rollouts.sh --episodes-per-task 1 --episode-length 20"
79
  echo " /workspace/.tools/micromamba/bin/micromamba run -r /workspace/.micromamba -p /workspace/envs/rlbench python -m sim_reveal.isaac_smoke"
80
  echo " ${BUNDLE_ROOT}/environment/validate_same_machine.sh"
environment/upstream_revisions.txt CHANGED
@@ -1,11 +1,27 @@
1
- /workspace/third_party/peract_bimanual
2
  repo_url=https://github.com/markusgrotz/peract_bimanual.git
3
  commit=bb0232a6ba3fe116566e9568f0c7af980ed6703d
4
 
5
- /workspace/third_party/RLBench
6
  repo_url=https://github.com/markusgrotz/RLBench.git
7
  commit=8af748c51287989294e00c9c670e3330a0e35ed5
8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9
  /workspace/third_party/PyRep
10
  repo_url=https://github.com/markusgrotz/PyRep.git
11
  commit=b8bd1d7a3182adcd570d001649c0849047ebf197
 
1
+ /workspace/third_party/peract2_bimanual_probe_20260324
2
  repo_url=https://github.com/markusgrotz/peract_bimanual.git
3
  commit=bb0232a6ba3fe116566e9568f0c7af980ed6703d
4
 
5
+ /workspace/third_party/RLBench_peract2_20260324
6
  repo_url=https://github.com/markusgrotz/RLBench.git
7
  commit=8af748c51287989294e00c9c670e3330a0e35ed5
8
 
9
+ /workspace/third_party/PyRep_peract2_20260324
10
+ repo_url=https://github.com/markusgrotz/PyRep.git
11
+ commit=b8bd1d7a3182adcd570d001649c0849047ebf197
12
+
13
+ /workspace/third_party/YARR_peract2_20260324
14
+ repo_url=https://github.com/markusgrotz/YARR.git
15
+ commit=6822ff78602c77878b27d4cfe759ce029c67bffb
16
+
17
+ /workspace/third_party/peract_bimanual
18
+ repo_url=https://github.com/markusgrotz/peract_bimanual.git
19
+ commit=1cc074b1730f52a7fd35d069d8c9099d18718bca
20
+
21
+ /workspace/third_party/RLBench
22
+ repo_url=https://github.com/markusgrotz/RLBench.git
23
+ commit=02720bba4c73fe02eb75df946b8791b806028a9d
24
+
25
  /workspace/third_party/PyRep
26
  repo_url=https://github.com/markusgrotz/PyRep.git
27
  commit=b8bd1d7a3182adcd570d001649c0849047ebf197
environment/validate_same_machine.sh CHANGED
@@ -62,8 +62,8 @@ DISPLAY="${DISPLAY}" glxinfo -B
62
 
63
  echo
64
  echo "RLBench import smoke"
65
- run_in_rlbench_env python -m sim_rlbench.smoke_test --print-train-command
66
 
67
  echo
68
- echo "RLBench launch smoke"
69
- run_in_rlbench_env python -m sim_rlbench.launch_smoke --task open_drawer --resolution 128 --headless
 
62
 
63
  echo
64
  echo "RLBench import smoke"
65
+ run_in_rlbench_env python -m sim_rlbench.smoke_test --print-train-command --upstream-root "${ROOT_DIR}/third_party/peract2_bimanual_probe_20260324"
66
 
67
  echo
68
+ echo "RLBench launch smoke: bimanual_push_box"
69
+ run_in_rlbench_env python -m sim_rlbench.launch_smoke --task bimanual_push_box --resolution 128 --headless