Camera naming (model card vs embodiment)¶
VLA checkpoints declare image input features (e.g.
observation.images.image, observation.images.wrist_image). The
LeRobot Local provider routes a robot/sim camera onto each
of those features using the embodiment's obs_rename map
({runtime_camera_name: "observation.images.*"}).
The trap: a model's HuggingFace card often describes its cameras in
human terms ("top + side", "third-person + wrist") that do NOT match the
runtime source key the embodiment expects. If you name your sim cameras after
the card ("realsense_top"), the rename step never produces the model's image
features, and inference fails with a confusing
image_keys missing from observation.
run_policy / eval_policy catch this with a cheap pre-flight check BEFORE any
model weights download, returning a status=error that names the expected
source camera keys and how to fix it. See
the pre-flight check.
Translation table¶
Use the embodiment source key column when naming sim cameras
(sim.add_camera(name=...)). The model-feature column is what the checkpoint
declares internally.
| Model | Embodiment | Camera source key (add_camera name) |
Model image feature |
|---|---|---|---|
allenai/MolmoAct2-SO100_101 |
so100 / so101 |
front |
observation.images.image |
allenai/MolmoAct2-SO100_101 |
so100 / so101 |
wrist |
observation.images.wrist_image |
| SmolVLA (single-cam SO arm) | so100 / so101 |
front |
observation.images.image |
| pi0 / pi0-FAST (Aloha) | aloha |
cam_high |
observation.images.cam_high |
| pi0 / pi0-FAST (Aloha) | aloha |
cam_left_wrist |
observation.images.cam_left_wrist |
| pi0 / pi0-FAST (Aloha) | aloha |
cam_right_wrist |
observation.images.cam_right_wrist |
The authoritative source for every embodiment is its entry in
strands_robots/policies/lerobot_local/embodiments.json (obs_rename). When in
doubt, read the obs_rename keys for your embodiment - those are exactly the
camera names the runtime observation must contain.
Two ways to satisfy the check¶
- Rename your cameras to the expected source keys:
sim.add_camera(name="front", position=[0.22, 0.025, 0.6], target=[0.22, 0.025, 0])
sim.add_camera(name="wrist", parent_body="so101/gripper")
- Keep your names and override -
obs_rename_overridemerges OVER the embodiment'sobs_rename, so a custom camera name routes onto the model's image feature without renaming:
sim.run_policy(
robot_name="so101",
policy_provider="lerobot_local",
policy_config={
"pretrained_name_or_path": "allenai/MolmoAct2-SO100_101",
"embodiment": "so101",
"obs_rename_override": {
"realsense_top": "observation.images.image",
"realsense_side": "observation.images.wrist_image",
},
},
)
See also¶
- LeRobot Local - camera routing, the pre-flight check,
obs_rename_override. - MolmoAct2 - the SO-100/101 action/observation contract.