The AY-Robots recording tutorial showing how a LeRobot dataset is captured from a teleoperation session with camera streams
camera placementdata collectionlerobotso-100imitation learningwrist camera

Camera Placement for Robot Manipulation Data

AY-Robots ResearchAugust 23, 202622 min read

Where to put cameras when recording LeRobot datasets on an SO-100: what overhead, front and wrist views each let a policy learn, the measured cost of dropping the wrist camera, and the traps.

Two USB webcams on a bench set the ceiling on what a manipulation policy can learn. One watches the scene, the other rides on the gripper. A camera that cannot resolve the gap between the fingers and the object cannot teach a policy when to close them, no matter how many episodes you record.

This page covers the physical question when recording a LeRobot dataset: overhead, front, wrist, how many, and what changes in the trained model when one is missing. Commands are from lerobot 0.6.1, published to PyPI on 3 August 2026. Every number below is attributed to the paper, model card or repository it was read from.

The short version

  • Two views is the working default on an SO-100 class arm: one third-person camera for the task, one wrist camera for the gripper. NVIDIA's SO-100 example for GR00T declares exactly those two video keys, front and wrist.
  • The wrist camera is where grasping lives. robomimic measured a real-robot pick task falling from 73.3 to 43.3 percent success when the wrist view was removed.
  • Third-person only is the view that overfits. Hsu et al. got 85 percent in distribution from both rigs, then 52.0 percent hand-centric against 20.0 percent third-person once the scene changed.
  • Camera keys are part of the model contract: GR00T reads meta/modality.json, SmolVLA reorders views into OBS_IMAGE_1 to 3, ACT requires every camera to have the same image shape.
  • Every extra view costs inference time. OpenVLA-OFT fell from 109.7 Hz to 71.4 Hz once a wrist image and proprioception were added.
  • Cameras that move between sessions are a distribution shift. If they will move, move them on purpose during recording.

What each viewpoint can and cannot resolve

A camera is a projection, and each projection destroys an axis. Ask which axis the task needs at the moment it is hardest, usually when the end effector touches something, then make sure one camera keeps it.

ViewWhere it sitsResolves wellDestroys
Overhead / topAbove the workspace, looking downObject layout in x and y, which object among several, where the target container isHeight. A gripper 1 cm and 6 cm above an object look nearly identical.
Front / sideRoughly table height, in front of or beside the armApproach height, arm pose, gripper above or beside the object, lifting versus notThe fingertips at contact: the arm moves into the line of sight.
Wrist / eye-in-handOn the last link, looking past the fingersThe last few centimetres: alignment, whether the object is between the fingers, contact, slipEverything outside a narrow cone, and the goal is rarely in frame during transport.
Depth (RealSense and similar)Any of the aboveMetric height and distance without inferring it from shadingNothing extra, but it doubles storage and no model contract here names a depth stream.

That is why the standard answer is not one camera. A single third-person view encodes coarse layout and fine contact in the same pixels and is weakest at the fine part, because the arm occludes the object exactly when precision matters. A single wrist view is the opposite: good at contact, useless at where do I go next.

What the published rigs actually use

Worth looking at what real imitation learning systems shipped. Every row was read from the paper, model card or repository in the sources.

SystemCamerasPlacementStream format
ALOHA / ACT (Zhao et al., 2023)4 Logitech C922x webcamsTwo on the follower wrists for a close-up of the grippers, one front, one top. The front camera is rotated 90 degrees for more vertical space.480 x 640 at 30 fps; teleoperation and recording at 50 Hz
DROID (Khazatsky et al., 2024)3 stereo camerasTwo exterior ZED 2 on adjustable tripods, repositioned per scene; one wrist-mounted ZED Mini1280 x 720, all data recorded at 15 Hz
robomimic (Mandlekar et al., 2021)2Front view matching what the operator saw; wrist view. Tool Hang used side plus wrist, Transport shoulder plus wrist per arm.Franka Panda, front RealSense SR300, wrist RealSense D415
OpenVLA-OFT on ALOHA (Kim et al., 2025)3One top-down, two wrist-mounted224 x 224 px into the model, control at 25 Hz
SmolVLA real-world benchmark2SO-100 used top plus wrist; SO-101 used top plus sidelerobot's SmolVLA config resizes views to 512 x 512 with padding
NVIDIA GR00T SO-100 example2front (third-person) plus wrist (egocentric)640 x 480 at 30 fps in the shipped eval command

The pattern across all six: at least one third-person view, and a wrist view wherever there is a grasp. The exception is instructive. DROID records a wrist camera, but the diffusion policy baseline in the paper defines observation keys for the two exterior cameras, the gripper position and the gripper state only, each image downsampled to 128 x 128. The wrist stream is there for whoever wants it; the paper's own baseline did not use it.

json
{
  "state":  { "single_arm": {"start": 0, "end": 5}, "gripper": {"start": 5, "end": 6} },
  "action": { "single_arm": {"start": 0, "end": 5}, "gripper": {"start": 5, "end": 6} },
  "video": {
    "front": { "original_key": "observation.images.front" },
    "wrist": { "original_key": "observation.images.wrist" }
  },
  "annotation": {
    "human.task_description": { "original_key": "task_index" }
  }
}
examples/SO100/modality.json from NVIDIA's Isaac-GR00T repository, reformatted onto fewer lines. Two video keys, front and wrist, each mapped to a LeRobot feature name.

The wrist camera, and the failure you get without it

People skip this one because mounting a webcam on a moving link is fiddly and the cable has to survive rotation. Three independent measurements say it is the highest-value camera on the arm.

SourceSetupWithout wrist viewWith wrist view
robomimic, real-robot Can taskFranka Panda, front plus wrist, BC-RNN on 200 demonstrations, 30 rollouts43.3 percent success73.3 percent success
robomimic, simulated suiteFront or side view plus wrist view per taskThe study states that not including wrist camera observations "can reduce performance by 10 to 45 percent"-
Hsu et al. 2022, real sponge grasp, out-of-distribution aggregateFranka Panda, behaviour cloning on 360 teleoperated demos; both rigs reached 85 percent in distribution20.0 percent mean (third-person plus proprioception)52.0 percent mean (hand-centric plus proprioception)
OpenVLA-OFT, LIBERO-LongThird-person image only, versus third-person plus wrist image plus robot state90.7 percent, 109.7 Hz throughput94.5 percent, 71.4 Hz throughput

Read the Hsu row carefully. In distribution the two rigs were indistinguishable at 85 percent. The gap only opened once the table height, the distractor objects or the table texture changed. A third-person policy that scores well on your own bench is not evidence of anything until you move something.

The failure signature is recognisable. The arm travels to roughly the right place, the trajectory looks smooth, then the grasp is wrong: the gripper closes 2 cm early, or on air, or catches an edge and lifts nothing. From a fixed camera 60 cm away the last 2 cm of approach are a handful of pixels, and the gripper is in front of them. With no signal there the network falls back on proprioception and produces the same closing motion every time.

If the approach is fine and the grasp is not, look at the camera

A policy that reaches the object reliably but closes the gripper at the wrong moment is describing a perception problem, not an optimisation problem. Before retraining with a different learning rate, check whether the fingers and the object are visible together in any camera at the moment of contact. See gripper does not close.

The AY-Robots recording tutorial page showing the steps for capturing a LeRobot dataset from a teleoperation session
The recording walkthrough at /learn/record-your-first-dataset. Camera choice happens before this screen, not after.

Overhead or front for the third-person view

Given a wrist camera, the remaining question is where the scene camera goes. There is no universal answer, but there is a defensible rule, and two of the sources state it almost identically.

  • The LeRobot recording guide states it as a test: "A good rule of thumb is you should be able to do the task yourself by only looking at the camera images." If you cannot teleoperate from the streams alone, the policy cannot either.
  • The robomimic study used the third-person view that matched what the operator saw during collection. Same rule from the other side.
  • Overhead wins when the task is about which object and where it goes: sorting, bin placement, picking from a cluttered tray. The arm is thin from above, so it occludes less.
  • Front or side wins when height must be visible: stacking, inserting, shelving, pouring. Height is the axis an overhead camera cannot recover.
  • ALOHA kept both and rotated the front camera 90 degrees for more vertical coverage out of a 480 x 640 sensor. lerobot exposes that as the rotation field on OpenCVCameraConfig.
  • The Hugging Face guidance is blunt about what must not be in frame: the leader arm should not appear, and the only moving objects should be the follower arm and the manipulated items.
The leader arm in frame is a real problem

In a leader-follower setup the leader moves in perfect correlation with the action labels. If it is visible in any camera it is the easiest feature for the network to latch onto, and it will not be there at inference time. Frame the cameras so the leader is out of shot.

Wiring two cameras into a recording session

The manual path end to end on an SO-100 or SO-101. It assumes the arm is calibrated; if not, do that first, because calibration and framing interact. A differently calibrated arm sits at a different place in frame.

  1. 1
    Find the camera identifiers

    lerobot auto-discovers OpenCV and RealSense devices. The docs warn that these identifiers may change after rebooting or re-plugging, which is the most common cause of a silently ruined dataset.

    bash
    lerobot-find-cameras opencv
    # or, for Intel RealSense:
    lerobot-find-cameras realsense
  2. 2
    Name the keys by location, not by device

    The Hugging Face dataset guidance asks for <modality>.<location>: images.top, images.front, images.left, images.right, and images.wrist.left / .right / .top / .bottom for wrist mounts. It explicitly asks you to avoid images.laptop and images.phone. The key becomes the dataset feature name and follows the data into the trainer.

    text
    good:  front, wrist, top, side
    bad:   laptop, phone, cam0, usb2
  3. 3
    Record with both streams

    Cameras are passed as one inline dict on --robot.cameras, each entry mapping a key to a device config. Mixing camera types in one rig is supported.

    bash
    lerobot-record \
      --robot.type=so101_follower \
      --robot.port=/dev/tty.usbmodem585A0076841 \
      --robot.id=my_follower \
      --robot.cameras="{ front: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30}, wrist: {type: opencv, index_or_path: 2, width: 640, height: 480, fps: 30}}" \
      --teleop.type=so101_leader \
      --teleop.port=/dev/tty.usbmodem58760431551 \
      --teleop.id=my_leader \
      --display_data=true \
      --dataset.repo_id=${HF_USER}/pick-place-two-cams \
      --dataset.num_episodes=50 \
      --dataset.single_task="Pick the red cube and put it in the box"
  4. 4
    Watch the streams while you record

    --display_data=true shows the feeds live. Use the first episode as a check: is the object in frame for the whole approach, is the wrist camera looking past the fingers rather than at them, is the leader out of shot, does the exposure hunt when the arm casts a shadow.

    text
    DatasetRecordConfig defaults you accept unless you override them:
      --dataset.fps=30
      --dataset.episode_time_s=60
      --dataset.reset_time_s=60
      --dataset.num_episodes=50
  5. 5
    Verify the schema before you spend GPU money

    Read meta/info.json and confirm both video features exist with the shape you expect. A camera that failed to open does not always stop the run; it can leave a one-camera dataset you notice only after training.

    bash
    python -c "import json; d=json.load(open('meta/info.json')); \
    [print(k, v['dtype'], v['shape']) for k,v in d['features'].items()]"
  6. 6
    If the target is GR00T, convert and map the keys

    GR00T needs a LeRobot v2.1 dataset plus a meta/modality.json naming the video keys. Both the downgrade script and the SO-100 modality file live in NVIDIA's Isaac-GR00T repository, not in lerobot. Config, modality.json and recorded keys must use the same strings.

    bash
    # from your Isaac-GR00T checkout
    uv run --project scripts/lerobot_conversion \
      python scripts/lerobot_conversion/convert_v3_to_v2.py \
      --repo-id ${HF_USER}/pick-place-two-cams \
      --root examples/SO100/pick_place_lerobot
    
    cp examples/SO100/modality.json \
       examples/SO100/pick_place_lerobot/${HF_USER}/pick-place-two-cams/meta/modality.json
The trap that eats a day: index_or_path is not stable

USB camera indices are assigned by the operating system at enumeration time. Reboot, or replug in a different order, and index 0 and index 2 can swap. Nothing errors. You record thirty episodes with the wrist stream stored under the front key, training completes, the loss curve looks normal, and the policy behaves as if it had no wrist camera. Re-run lerobot-find-cameras every session and glance at the live preview. On Linux, a udev rule pinning each camera to a stable /dev/video path is worth the twenty minutes. See camera not detected.

Two routes to the same two-camera dataset

Everything above on your own machine: install lerobot, find the camera indices, wire the mount, record, then convert the format for the trainer you target.

bash
pip install lerobot
lerobot-find-cameras opencv
lerobot-calibrate --robot.type=so101_follower --robot.port=/dev/ttyACM0 --robot.id=my_follower
lerobot-record --robot.cameras="{ front: {...}, wrist: {...} }" ...

# lerobot 0.6.1 writes LeRobot v3.0; GR00T wants v2.1. The downgrade script ships
# with Isaac-GR00T, not with lerobot:
uv run --project scripts/lerobot_conversion \
  python scripts/lerobot_conversion/convert_v3_to_v2.py --repo-id <your-repo-id>
  • You own the mount design, cable routing and USB topology, which is where most of the real work is.
  • You handle the format question: a LeRobot v3.0 dataset crashes the GR00T loader and has to be converted down to v2.1.
  • You rent the GPU, or train ACT and SmolVLA locally on a 24 GB card.

Camera keys are part of the model contract

Once the data exists the camera names stop being labels and become an interface. Each vision-language-action model handles multiple views differently, and each has a rule you can violate silently. GR00T N1.7 and SmolVLA are where the mistake is easiest to make.

PolicyHow it consumes viewsThe rule you can break
ACTEvery key beginning with observation.images. counts as another view. lerobot runs all views through one shared ResNet18 backbone (the vision_backbone default) and appends each feature map to the transformer encoder input as extra tokens.The configuration file states that only images of the same shape are supported. A 1920 x 1080 front camera plus a 640 x 480 wrist camera is not a valid pair.
SmolVLAViews are consumed in a fixed order. The paper maps each community dataset to a standard view type, prioritising top, wrist and side, renamed OBS_IMAGE_1, OBS_IMAGE_2 and OBS_IMAGE_3.Order matters. The authors found inconsistent camera naming across community datasets "detrimental during pretraining". Extra views kept their order; unused views were dropped.
GR00T N1.7 / N1.5The model card lists vision input as a variable number of uint8 frames from robot cameras; Isaac-GR00T's data config resizes them to an image_target_size of 224 x 224. Which keys exist comes from meta/modality.json.The modality_keys in your config must match the video entries in modality.json, which must match what you recorded. Three places, one string.
Pi0.5The openpi inference example passes named image keys such as observation/exterior_image_1_left and observation/wrist_image_left.Names are positional in effect. An exterior stream passed under a wrist key is not an error, just a wrong model.
python
# lerobot/policies/smolvla/configuration_smolvla.py
# Add empty images. Used by smolvla_aloha_sim which adds the empty
# left and right wrist cameras in addition to the top camera.
empty_cameras: int = 0

def validate_features(self) -> None:
    for i in range(self.empty_cameras):
        key = f"{OBS_IMAGES}.empty_camera_{i}"
        empty_camera = PolicyFeature(type=FeatureType.VISUAL, shape=(3, 480, 640))
        self.input_features[key] = empty_camera
SmolVLA can pad a rig with fewer physical cameras than the checkpoint expects by injecting zero-filled views. Useful for compatibility, not a substitute for a camera.

Understand that padding before relying on it. It makes a one-camera rig loadable by a checkpoint trained on three. It adds no information. If the missing view is the wrist view, the policy expects contact information and receives a black rectangle.

The same discipline applies between sessions. If the front camera sits 5 cm to the left on day two, that is a new viewpoint as far as the network is concerned. RoVi-Aug, a CoRL 2024 paper on synthesising extra viewpoints, states the problem: imbalances in the distribution of robot types and camera angles in many datasets make policies prone to overfit. The policy only works in one setup page covers the symptom.

What a second camera costs

Views are not free. The cost lands in the recording loop, the training run and the control loop. The last one surprises people.

Where the cost landsWhat actually happens
Recording loopEvery camera adds a read and an encode per tick. lerobot peeks the freshest buffered frame non-blockingly via read_latest(), so a slow camera does not stall the loop, but if the encode cannot keep up you get dropped or duplicated frames rather than an error.
Storage and transferDoubling the views doubles the video bytes. At the 480 x 640 / 30 fps that ALOHA and the GR00T SO-100 example use this is manageable; at the 1920 x 1080 the LeRobot record example passes, it is not.
TrainingMore visual tokens per sample. OpenVLA-OFT reports that adding a wrist image doubled the visual patch embeddings entering the language model decoder, from 256 to 512.
InferenceOpenVLA-OFT measured throughput falling from 109.7 Hz to 71.4 Hz and latency rising from 0.0729 s to 0.1120 s when the wrist image and robot state were added. NVIDIA's GR00T N1.7 timing table is measured at 4 denoising steps and 1 camera, so a two-camera rig is not the number in that table.
Adding a wrist camera to a working one-camera rig
Advantages
  • The measured effect on grasp reliability is large: robomimic's real-robot Can task went from 43.3 to 73.3 percent.
  • Out-of-distribution behaviour improves for the reason Hsu et al. identified: a hand-mounted camera sees roughly the same thing regardless of table height or colour, so there is less scene-specific detail to overfit to.
  • It matches what the pretrained checkpoints saw: GR00T's SO-100 example, SmolVLA's SO-100 benchmark and every ALOHA setup in the OpenVLA-OFT paper include wrist views.
  • It is cheap hardware, against a GPU run that costs money whether or not the data was good.
Trade-offs
  • Mechanical work. The mount has to survive wrist rotation without straining the cable, and it changes payload and reach.
  • Inference cost, quantified above. On a 20 ms per action step policy like ACT the extra encode matters proportionally more than on a 485 ms policy like Pi0.5.
  • Another USB device on a bus that already carries the servo adapter. Contention on a shared hub shows up as dropped frames, not an error.
  • It does not help if the wrist view cannot observe enough. Hsu et al. are explicit that where hand-centric observability is insufficient, a third-person view is necessary for learning at all.

Fixed rig, or move the cameras on purpose

The LeRobot guide says to keep the cameras fixed, and for a first dataset that is right: hold everything constant except what you want the policy to generalise over, which early on is object position. The same guide then says that once grasping is reliable you can introduce variations, including altering camera positions, and warns against adding too much too quickly.

DROID is the far end of that spectrum. Its exterior cameras sit on adjustable tripods repositioned for every new scene, the collection GUI periodically prompts the operator to perform sampled scene augmentations including moving and re-calibrating the third-person cameras, and the released dataset covers 1417 camera viewpoints across 564 scenes. The protocol was built to prevent two mistakes worth a sticky note: "camera cannot see robot" and "teleoperator in camera view".

A practical middle path

Record the first 30 to 50 episodes with a fixed rig and get a policy that works. Then, before scaling up, move the third-person camera a few centimetres and record another block. If the policy survives, viewpoint is not your bottleneck. If it collapses, you learned that cheaply instead of after a GPU run and a week.

The public dataset directory on AY-Robots listing recorded LeRobot datasets
The public dataset directory. Opening datasets from tasks like yours shows which camera keys and framings other people settled on.

Where this platform helps, and where it does not

Camera placement is a physical problem on your bench and no web service solves it. The desktop client records LeRobot-format datasets from a teleop session, the directory lists public datasets to compare against, and the training form removes the format and GPU plumbing between recording and a fine-tuned checkpoint. None of that tells you your overhead camera cannot see height.

The second honest limit is where inference runs. The control loop is 20 ms per action step for ACT up to 485 ms for Pi0.5, and a cloud pod adds public-internet round trips on top. For slow pick-and-place that is workable; for fast reactive motion it is not. Action chunking helps by executing a chunk open loop between queries, and the three ways to start page lists what each GPU tier costs and what inference latency you are buying.

The AY-Robots desktop client download page, the client that records LeRobot datasets from a teleoperation session
The desktop client at /download. It records the streams; it does not decide where you point them.

Record a two-camera dataset today

The desktop client records LeRobot-format datasets straight from a teleoperation session: episodes, camera streams and joint states, in the format the trainers expect. You still choose where the cameras go.

Get the desktop client

Resolution, frame rate and the things that ruin frames

Placement is the big decision, but a well-placed camera can still produce unusable data. Three settings are worth deciding deliberately, and the recording walkthrough assumes you already have.

SettingWhat the sources useWhy it matters
ResolutionALOHA 480 x 640, GR00T SO-100 example 640 x 480, Hugging Face guidance at least 480 x 640 / 720p, the LeRobot record example 1920 x 1080.Models downsample anyway: Isaac-GR00T targets 224 x 224, OpenVLA-OFT uses 224 x 224, the DROID baseline used 128 x 128. Recording at 1080p mostly buys storage cost and encode load.
Frame rate30 fps in ALOHA, in the GR00T SO-100 eval command, in the lerobot record defaults and in the Hugging Face guidance. DROID records at 15 Hz; ALOHA records actions at 50 Hz with cameras at 30 fps.Camera rate and control rate need not match. What must be true is that recorded timestamps reflect reality; a loop that ran at 25 Hz still writes a dataset claiming 30.
ExposureALOHA fixed the focal length and left auto-exposure on to adjust for changing lighting. lerobot's RealSenseCameraConfig exposes exposure, gain and white_balance as manual values that default to None.Auto-exposure hunting when the arm shadows the workspace puts a brightness step in the middle of every episode, correlated with arm position. The policy will use it.
Depth is optional and mostly unnecessary here

lerobot supports RealSense depth: read_depth() returns an (H, W, 1) uint16 map in millimetres, stored during recording as a sibling feature (front_depth next to front). None of the model contracts above name a depth stream. Absent a specific reason, two RGB views beat one RGB plus depth at the same bandwidth.

A placement checklist you can run in five minutes

  1. Try the task yourself watching only the camera streams. If you cannot, re-aim.
  2. Move the arm to the exact moment of grasp. Are the fingers and the object visible together in at least one view?
  3. Move through the full trajectory and watch for the object leaving frame in the third-person view. Occlusion by the arm at the critical moment is the normal failure.
  4. Check that the leader arm, your hands and your torso are out of every frame.
  5. Cast a shadow over the workspace with your hand and watch whether the exposure jumps.
  6. Wiggle each USB cable at the wrist through the joint's full rotation. A stream that drops when the wrist turns will drop in half your episodes.
  7. Record one episode, read meta/info.json, confirm both video features are present with the expected shapes.
  8. Reboot, re-run lerobot-find-cameras, confirm the indices did not move before recording the other forty-nine.

None of it is glamorous, and all of it is cheaper than a training run on a dataset with a swapped camera key. The guide on collecting high-quality VLA training data covers diversity and episode counts, the DROID dataset walkthrough goes deeper into viewpoint-diverse collection at scale, and the SO-100 setup guide plus SO-100 data collection cover the arm and the recording side.

Once the rig is settled the decisions are about model and budget, not optics: which of the five trainable policies fits the task, whether you can stay on a 24 GB card, how many episodes you need. The GR00T N1.7 on SO-100 guide and the dataset documentation pick up from there, and the CLI exposes the same operations to a terminal.

How many cameras do I need for an SO-100 dataset?

Two: one third-person view of the scene and one wrist camera. The Hugging Face dataset guidance says to use preferably two camera views, NVIDIA's SO-100 example for GR00T declares exactly two video keys (front and wrist), and SmolVLA's SO-100 benchmark used top plus wrist. One camera can work when the wrist view alone is sufficient, but it is more brittle to scene changes.

Can I train a policy with only an overhead camera?

Yes, and it will often reach a decent success rate on the bench it was recorded on. The measured risk is generalisation: Hsu et al. found third-person and hand-centric rigs both reached 85 percent in distribution on a real grasping task, then 20.0 against 52.0 percent once table height, distractors or texture changed. The other risk is grasp precision, since an overhead view cannot resolve height.

Does the wrist camera have to point past the fingers?

It has to see the region where contact happens. A wrist camera aimed at the fingers with the workspace out of frame gives you a picture of the gripper closing and nothing about what it closes on. Watch only that stream during a teleoperated grasp and ask whether you could judge the closing moment from it.

Why does my policy work on my bench and fail after I move the setup?

Most often the camera moved, or the lighting or background changed. A fixed third-person camera makes the whole scene layout a usable feature, and the network will use it. RoVi-Aug states the general version: imbalances in camera angles across a dataset make policies prone to overfit. Recording episodes with the third-person camera deliberately shifted is both the cheapest test and the cheapest fix.

Do I need to record at 1080p?

Probably not. The LeRobot record example passes 1920 x 1080, but ALOHA recorded 480 x 640 and NVIDIA's SO-100 example uses 640 x 480 at 30 fps. Models downsample anyway: Isaac-GR00T targets 224 x 224, OpenVLA-OFT uses 224 x 224, the DROID baseline used 128 x 128. High resolution mostly costs disk, encode time and dropped frames.

What happens if the camera indices swap between sessions?

Nothing visible. Recording succeeds, episode counts look right, training completes and the loss curve looks normal. The policy behaves as if the wrist camera were somewhere else, because for half the episodes it was. The lerobot camera docs warn that identifiers may change after rebooting or re-plugging.

Sources

Sources

Ready for high-quality robotics data?

AY-Robots connects your robots to skilled operators worldwide.

Get Started