
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.
| View | Where it sits | Resolves well | Destroys |
|---|---|---|---|
| Overhead / top | Above the workspace, looking down | Object layout in x and y, which object among several, where the target container is | Height. A gripper 1 cm and 6 cm above an object look nearly identical. |
| Front / side | Roughly table height, in front of or beside the arm | Approach height, arm pose, gripper above or beside the object, lifting versus not | The fingertips at contact: the arm moves into the line of sight. |
| Wrist / eye-in-hand | On the last link, looking past the fingers | The last few centimetres: alignment, whether the object is between the fingers, contact, slip | Everything outside a narrow cone, and the goal is rarely in frame during transport. |
| Depth (RealSense and similar) | Any of the above | Metric height and distance without inferring it from shading | Nothing 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.
| System | Cameras | Placement | Stream format |
|---|---|---|---|
| ALOHA / ACT (Zhao et al., 2023) | 4 Logitech C922x webcams | Two 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 cameras | Two exterior ZED 2 on adjustable tripods, repositioned per scene; one wrist-mounted ZED Mini | 1280 x 720, all data recorded at 15 Hz |
| robomimic (Mandlekar et al., 2021) | 2 | Front 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) | 3 | One top-down, two wrist-mounted | 224 x 224 px into the model, control at 25 Hz |
| SmolVLA real-world benchmark | 2 | SO-100 used top plus wrist; SO-101 used top plus side | lerobot's SmolVLA config resizes views to 512 x 512 with padding |
| NVIDIA GR00T SO-100 example | 2 | front (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.
{
"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" }
}
}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.
| Source | Setup | Without wrist view | With wrist view |
|---|---|---|---|
| robomimic, real-robot Can task | Franka Panda, front plus wrist, BC-RNN on 200 demonstrations, 30 rollouts | 43.3 percent success | 73.3 percent success |
| robomimic, simulated suite | Front or side view plus wrist view per task | The 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 aggregate | Franka Panda, behaviour cloning on 360 teleoperated demos; both rigs reached 85 percent in distribution | 20.0 percent mean (third-person plus proprioception) | 52.0 percent mean (hand-centric plus proprioception) |
| OpenVLA-OFT, LIBERO-Long | Third-person image only, versus third-person plus wrist image plus robot state | 90.7 percent, 109.7 Hz throughput | 94.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.
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.

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.
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.
- 1Find 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.
bashlerobot-find-cameras opencv # or, for Intel RealSense: lerobot-find-cameras realsense - 2Name 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.
textgood: front, wrist, top, side bad: laptop, phone, cam0, usb2 - 3Record 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.
bashlerobot-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" - 4Watch 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.
textDatasetRecordConfig defaults you accept unless you override them: --dataset.fps=30 --dataset.episode_time_s=60 --dataset.reset_time_s=60 --dataset.num_episodes=50 - 5Verify 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.
bashpython -c "import json; d=json.load(open('meta/info.json')); \ [print(k, v['dtype'], v['shape']) for k,v in d['features'].items()]" - 6If 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
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.
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.
The desktop client records LeRobot-format datasets straight from a teleoperation session, with camera streams, joint states and episode boundaries handled for you. A form picks model, dataset and hyperparameters, the backend rents a GPU sized by required VRAM and writes checkpoints to object storage. The client documentation covers the camera side.
| Policy | Minimum episodes | Dataset format | GPU tier | Typical run cost |
|---|---|---|---|---|
| GR00T N1.7 | 50 | LeRobot v2.0 or v2.1 | A100 80 GB or H100 80 GB | 4 to 12 USD |
| GR00T N1.5 | 50 | LeRobot v2.0 or v2.1 | A100 80 GB or H100 80 GB | 4 to 12 USD |
| Pi0.5 | 50 | LeRobot v3.0 | A100 80 GB or H100 80 GB | 4 to 12 USD |
| SmolVLA | 30 | LeRobot v3.0 | RTX 4090 or any 24 GB card | 1 to 3 USD |
| ACT | 50 | LeRobot v3.0 | RTX 4090 or any 24 GB card | 1 to 3 USD |
What it does not do: mount the wrist camera, or tell you the overhead view was wrong for a stacking task. Placement stays a physical decision. What it removes is the format churn between recording and training, and the GPU plumbing. The public dataset directory shows how others framed the same class of task.
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.
| Policy | How it consumes views | The rule you can break |
|---|---|---|
| ACT | Every 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. |
| SmolVLA | Views 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.5 | The 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.5 | The 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. |
# 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_cameraUnderstand 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 lands | What actually happens |
|---|---|
| Recording loop | Every 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 transfer | Doubling 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. |
| Training | More 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. |
| Inference | OpenVLA-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. |
- 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.
- 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".
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.

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.

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 clientResolution, 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.
| Setting | What the sources use | Why it matters |
|---|---|---|
| Resolution | ALOHA 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 rate | 30 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. |
| Exposure | ALOHA 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. |
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
- Try the task yourself watching only the camera streams. If you cannot, re-aim.
- Move the arm to the exact moment of grasp. Are the fingers and the object visible together in at least one view?
- 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.
- Check that the leader arm, your hands and your torso are out of every frame.
- Cast a shadow over the workspace with your hand and watch whether the exposure jumps.
- 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.
- Record one episode, read meta/info.json, confirm both video features are present with the expected shapes.
- 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
- LeRobot docs: Cameras (lerobot-find-cameras, OpenCVCameraConfig rotation, read_latest, RealSense depth)
- LeRobot docs: Imitation Learning on Real-World Robots (lerobot-record, camera arguments, tips for gathering data)
- Hugging Face blog: LeRobot Community Datasets, the ImageNet of Robotics, When and How?
- robomimic: What Matters in Learning from Offline Human Demonstrations (study site, wrist-camera ablation)
- NVIDIA GR00T N1.7 3B model card (vision input format, inference timing at 4 denoising steps and 1 camera)
- Hsu et al., Vision-Based Manipulators Need to Also See from Their Hands (ICLR 2022)
- Zhao et al., Learning Fine-Grained Bimanual Manipulation with Low-Cost Hardware (ALOHA / ACT)
- Khazatsky et al., DROID: A Large-Scale In-The-Wild Robot Manipulation Dataset
- Mandlekar et al., What Matters in Learning from Offline Human Demonstrations for Robot Manipulation
- Kim et al., Fine-Tuning Vision-Language-Action Models: Optimizing Speed and Success (OpenVLA-OFT)
- Chen et al., RoVi-Aug: Robot and Viewpoint Augmentation for Cross-Embodiment Robot Learning (CoRL 2024)
- Shukor et al., SmolVLA: A Vision-Language-Action Model for Affordable and Efficient Robotics
- Isaac-GR00T: SO-100 example (modality.json with front and wrist video keys, so100_config.py modality_keys, README with the v3 to v2 conversion and two-camera eval command)
- lerobot source (configuration_act.py, modeling_act.py, configuration_smolvla.py, configuration_realsense.py, configs/dataset.py)
- openpi: Pi0.5 inference example with named image keys (observation/exterior_image_1_left, observation/wrist_image_left)
Sources
- LeRobot docs: Cameras (lerobot-find-cameras, OpenCVCameraConfig rotation, read_latest, RealSense depth)
- LeRobot docs: Imitation Learning on Real-World Robots (lerobot-record, camera arguments, tips for gathering data)
- Hugging Face blog: LeRobot Community Datasets, the ImageNet of Robotics, When and How?
- robomimic: What Matters in Learning from Offline Human Demonstrations (study site, wrist-camera ablation)
- NVIDIA GR00T N1.7 3B model card (vision input format, inference timing at 4 denoising steps and 1 camera)
- Hsu et al., Vision-Based Manipulators Need to Also See from Their Hands (ICLR 2022)
- Zhao et al., Learning Fine-Grained Bimanual Manipulation with Low-Cost Hardware (ALOHA / ACT)
- Khazatsky et al., DROID: A Large-Scale In-The-Wild Robot Manipulation Dataset
- Mandlekar et al., What Matters in Learning from Offline Human Demonstrations for Robot Manipulation
- Kim et al., Fine-Tuning Vision-Language-Action Models: Optimizing Speed and Success (OpenVLA-OFT)
- Chen et al., RoVi-Aug: Robot and Viewpoint Augmentation for Cross-Embodiment Robot Learning (CoRL 2024)
- Shukor et al., SmolVLA: A Vision-Language-Action Model for Affordable and Efficient Robotics
- Isaac-GR00T: SO-100 example (modality.json with front and wrist video keys, so100_config.py modality_keys, README with the v3 to v2 conversion and two-camera eval command)
- lerobot source (configuration_act.py, modeling_act.py, configuration_smolvla.py, configuration_realsense.py, configs/dataset.py)
- openpi: Pi0.5 inference example with named image keys (observation/exterior_image_1_left, observation/wrist_image_left)
Ready for high-quality robotics data?
AY-Robots connects your robots to skilled operators worldwide.
Get Started