๐Ÿšฆ OSMA-Bench

Experiments

How to run the paper's three research questions (ยง4), with each result in brief. The launch commands build on Policies (one model, one seed) and the scoring on Metrics. Items marked Not yet in the repository are in the paper, but their code is not included here.

The scoring lines below share these settings:

OUT=/workspace/outputs
SCORE="python -m robocasa.scripts.summarize_post_evaluation_metrics"
# SSI on CFSR-I, the tasks every compared run completes without collision
SSI="--comparison matched_intersection --scope collision_free_task_success"

RQ1: Do foundation models generate obstacle-conditioned safe motion?

Result. Avoiding collision is not adapting: only VoxPoser keeps SSI above 0 for every VLM, PIVOT stays near 0, and the VLAs collide most and tend to reverse the tier order. Qwen3.5 4B โ†’ 9B raises VoxPoser SSI (0.254 โ†’ 0.323) but not PIVOT's (โˆ’0.068 โ†’ โˆ’0.061).

Policy group (models) CFSR/TSR (%) SSI
VLA (4) 40.6โ€“57.8 โˆ’0.595 to โˆ’0.262
PIVOT (8) 77.8โ€“89.5 โˆ’0.140 to 0.132
VoxPoser (8) 94.9โ€“99.5 0.169 to 0.493

Ranges over each group's models, seed means; SSI on the group's CFSR-I (for VLAs, 6 of 35 cells).

Run. All 20 policies with default settings, for each seed \(S\) in {0, 3, 16}:

  1. Launch the four VLA profiles, and the eight VLMs through VoxPoser and through PIVOT, with the Policies commands and the seed set to \(S\). VLA runs go to $OUT/<profile>_seed$S as in the Policies example; merge the VoxPoser and PIVOT workers.
  2. Score the seed: the task-level metrics of every run, and SSI once per policy group.
  3. Average each number over the three seeds.
S=0   # then 3 and 16
VLA=$(printf "$OUT/%s_seed$S " \
  xr1 pi05_opentau groot_n1_5_atomic_seen pi05_human300)
VOX="$OUT/*_seed${S}_voxposer"; PIV="$OUT/*_seed${S}_pivot"
$SCORE --inputs $VLA $VOX $PIV --comparison individual --out rq1_headline_s$S.json
$SCORE --inputs $VLA $SSI --out rq1_ssi_vla_s$S.json
$SCORE --inputs $VOX $SSI --out rq1_ssi_voxposer_s$S.json
$SCORE --inputs $PIV $SSI --out rq1_ssi_pivot_s$S.json

Check episodes = 625 per run and the --strict-complete option in Metrics.

Example episodes (4 videos)

Three policy groups, one boy

ฯ€0.5-OpenTau across the tiers

PIVOT across the tiers

VoxPoser across the tiers

The three groups around one boy, then one policy of each group across the tiers. The VLA episodes come from a separate ฯ€0.5-OpenTau run with a 0.6 m goal radius.

RQ2: Can VLMs distinguish among OCTs, and how can these distinctions be translated into executed motion?

Result. Asked only for values, Qwen3.5-9B orders them by caution (value SSI +0.98), but the values it writes into VoxPoser code keep the order only weakly (+0.45), and so does the motion (SSI +0.38). Safety prompts raise SSI to at most +0.51 and the 3-step split to +0.58. Only in the 3-step split does the inferred velocity region reach the planned path (59.0% of tasks; 0% for the others).

Run. VoxPoser with Qwen3.5-9B, seed 0 (paper App. F): the VoxPoser worker command of Policies once per method, with the method's switch in front. Each method gets its own tag M and writes to $OUT/rq2, so the RQ1 lines do not pick the runs up.

Method Switch SSI
VoxPoser none +0.38
2-step VOXPOSER_DECOUPLED_VALUES=1 +0.39
3-step VOXPOSER_THREESTEP=1 VOXPOSER_THREESTEP_CLAMP=1 +0.58
+ Per obstacle Not yet in the repository (prompt in paper Table 15) +0.47
+ Collision risk Not yet in the repository +0.39
+ Both Not yet in the repository +0.51
OUT=/workspace/outputs/rq2; S=0; i=0; TASKS="<slice i of blocking_tasks.txt>"
M=qwen35_9b_3step   # qwen35_9b and qwen35_9b_2step for the other two
cd /workspace/policy/Voxposer && VOXPOSER_THREESTEP=1 VOXPOSER_THREESTEP_CLAMP=1 \
  MUJOCO_GL=egl NAV_MODE=holonomic \
  ROBOCASA_SEED=$S ROBOCASA_LEDGER_DIR=$OUT/${M}_seed${S}_vox_s${i}_ledger \
  python3 src/run_LMP.py $TASKS -m <served name of Qwen3.5-9B> -p <port> \
    --layout-ids 0,2,5,7,8 --style-ids 3 --seed $S -w $i \
    -o $OUT/${M}_seed${S}_vox_s${i}

# after every worker of the three methods: merge each M as in Policies, then
$SCORE --inputs $OUT/qwen35_9b{,_2step,_3step}_seed0_voxposer $SSI \
  --out rq2_ssi.json

The paper scores SSI on the 569 tasks that all six executed methods complete without collision. Three of them need prompts that are not in the repository, so these lines score the three runnable methods on their own intersection, and the numbers can differ.

RQ3: Can external guidance improve VLA safety, and does the VLA backbone retain obstacle safety knowledge?

Result. No safety prompt raises CFSR above c0 (38.72%), and SSI stays near 0 (โˆ’0.048 to +0.026). Rollout selection raises CFSR by 6.72 points (37.92 โ†’ 44.64%) but lowers SSI (โˆ’0.059 โ†’ โˆ’0.204): the sampled rollouts differ little (median pairwise distance โ‰ˆ 0.10 m). The GR00T N1.5 backbone still orders control values by caution (value SSI 0.573).

Run. ฯ€0.5-OpenTau, seed 0 (paper App. G): the VLA command of Policies once per prompt condition, set with --instruction-mode (templates in policy/VLA/src/run_vla_rollout.py):

Rollout selection compares s0, the c1 run, with s1, the same command plus --steering-config rollout_k4.yaml.

OUT=/workspace/outputs/rq3
for C in navigation_only environment environment_obstacle \
         obstacle_caution obstacle_behavior; do   # c0โ€“c4
  python3 policy/VLA/src/run_vla_eval.py --model-profile pi05_opentau \
    --policy-url http://127.0.0.1:8101 --instruction-mode $C \
    --tasks $(cat blocking_tasks.txt) --layout-ids 0,2,5,7,8 --style MODERN_1 \
    --seed 0 --policy-seed 0 --horizon 500 \
    --out-dir $OUT/prompts/$C --ledger-dir $OUT/prompts/$C/ledger
done
# s1: the c1 (environment) command again with --steering-config rollout_k4.yaml
#     and --out-dir $OUT/s1 --ledger-dir $OUT/s1/ledger

$SCORE --inputs $OUT/prompts $SSI --out rq3_prompts.json   # c0โ€“c4, one entry each
$SCORE --inputs $OUT/prompts/environment $OUT/s1 $SSI --out rq3_selection.json

rollout_k4.yaml is a copy of policy/VLA/src/configs/steering/forewarn.yaml (K = 16, verifier Qwen3.5-9B) with num_candidates: 4, and verifier.base_url / verifier.model set to a Qwen3.5-35B-A3B server started with --limit-mm-per-prompt '{"image": 4}' or more. Details: policy/VLA/src/forewarn/README.md.

Backbone. https://huggingface.co/ocsnav/groot-vlm-graft28 holds GR00T N1.5 with decoder layers 13โ€“28 of Qwen3-1.7B appended, and its construction code (paper App. G.2). The value-level probe (App. G.2) and the linear probe that separates the 18 obstacles at 61.7% (App. G.3) are not yet in the repository.