
Published zero-shot success rates measure narrower things than they sound like. What BC-Z, RT-2 and Open X-Embodiment actually held out, and how to test your own policy.
What you need to know
- •"Zero-shot" almost never means the model saw nothing like this. It means one thing was held out: a task sentence, an object instance, a background. Everything else in the scene stayed put.
- •BC-Z's widely quoted 44 percent is the average over the 24 held-out tasks that scored above zero. Over all held-out tasks it was 32 percent, and 4 percent when conditioned on video instead of language.
- •RT-2 scored 91 percent on seen tasks against RT-1's 92. The entire difference between the two models showed up on the unseen splits: 62 against 32.
- •Swapping the object is one of the easier shifts. Moving the camera is one of the hardest, in two independent studies three years apart.
- •At ten trials per condition, a measured 50 percent has a 95 percent confidence interval of roughly 24 to 76 percent. Most published per-task cells are that noisy.
- •On one arm with fifty episodes, the only number worth anything is one you measured on a split you wrote down before training started.
What the word "unseen" is actually doing
Every vision-language-action model paper has a column called something like "unseen objects". That number is the one people quote, and it is the one that decides whether you buy an arm, because it implicitly promises that the policy you train on your desk will survive a change of scene. The promise is doing far more work than the experiment behind it.
The papers are not lying. "Unseen" is a protocol decision, not a property of the world, and every lab draws the line somewhere different. One holds out the object instance but keeps the category. One holds out the task sentence but keeps every object. One holds out the room. These produce wildly different numbers and all get printed under the same word. If you want to know whether a fine-tuned policy survives contact with your kitchen, read where each paper drew the line.
BC-Z, and the gap between 44 percent and 32 percent
BC-Z (arXiv 2202.02005, submitted 4 February 2022) is where "zero-shot task generalization" entered imitation learning for manipulation at scale. The team collected 25,877 robot demonstrations across 100 tasks, 125 hours of robot time, plus 18,726 human videos. They evaluated on 29 held-out tasks for which no robot demonstrations existed. The abstract reports "24 unseen manipulation tasks with an average success rate of 44%".
In the results section the number changes shape. 44 percent is the mean over the 24 held-out tasks that scored above zero. Over the full held-out set, zeros included, it was 32 percent with four or five distractor objects and 38 percent with one. Conditioned on a human video instead of a language embedding, the same policy scored 4 percent.
| BC-Z evaluation setting | Task conditioning | Success |
|---|---|---|
| Training tasks | One-hot task ID | 42% |
| Training tasks | Language embedding | 40% |
| Training tasks | Human video embedding | 24% |
| Held-out tasks | Language embedding | 32% |
| Held-out tasks | Human video embedding | 4% |
| Held-out tasks, 1 distractor | Language embedding | 38% |
| Held-out tasks, 4 to 5 distractors | Language embedding | 32% |
| Held-out tasks with non-zero success (24 of them) | Language embedding | 44% |
Three framings of one experiment give 44, 38, 32 and 4 percent. None is wrong, and the paper states the condition on the 44 plainly. The distortion happens downstream, when the number is repeated without the condition attached. Adding three more distractor objects to the table cost 6 percentage points on its own.
Two other results matter more to a desk setup than the headline. A single-task policy trained on 1,000 demonstrations of one task reached 5 percent; the multi-task policy trained across all 100 reached 52 percent on that same task. And on the four easiest held-out tasks, single-task policies trained on 300-plus demonstrations of the held-out task itself scored 0 percent. The dominant failure was "last-centimeter" error: the arm reaches the right object, then fails to close the gripper. Full write-up in the BC-Z article.
RT-2, where the seen number stopped being interesting
RT-2 (arXiv 2307.15818, 28 July 2023) ran about 6,000 real robot trials and split the unseen set three ways, each into easy and hard cases. The appendix table is the most useful table in the VLA literature for this question.
| Model | Seen tasks | Unseen objects (easy / hard) | Unseen backgrounds (easy / hard) | Unseen environments (easy / hard) | Unseen average |
|---|---|---|---|---|---|
| R3M | 45 | 32 / 14 | 13 / 9 | 0 / 2 | 12 |
| VC-1 | 63 | 34 / 10 | 13 / 3 | 0 / 0 | 10 |
| RT-1 | 92 | 31 / 43 | 71 / 9 | 26 / 14 | 32 |
| MOO | 75 | 58 / 48 | 38 / 41 | 19 / 3 | 35 |
| RT-2-PaLI-X-55B | 91 | 70 / 62 | 96 / 48 | 63 / 35 | 62 |
| RT-2-PaLM-E-12B | 93 | 84 / 76 | 75 / 71 | 36 / 33 | 62 |
Look at the first column. RT-1 scored 92 on seen tasks; RT-2-PaLI-X scored 91. Inside the training distribution the web-pretrained giant was slightly worse than the small robotics transformer. Everything RT-2 bought sits on the right, where the average goes from 32 to 62. Report only the seen number and RT-2 and RT-1 are the same model.
The ablation is blunter. A 5B RT-2 trained from scratch on robot data, no web pretraining, averaged 9 percent across the unseen splits. The same architecture from a web-pretrained checkpoint reached 42 percent fine-tuned, 44 percent co-fine-tuned, and 63 percent at 55B. Generalisation came from web pretraining and parameter count, not from robot demonstrations. Longer treatment in the RT-2 article, per-benchmark numbers in the RT-2 arena entry.
Open X-Embodiment, and the thing extra robots did not buy
Open X-Embodiment (arXiv 2310.08864, 13 October 2023) is usually summarised as "more robots, better generalisation". The ablation says something more specific. Note first that the RT-X models were trained on a robotics mixture of 9 embodiments, not the full 22 in the dataset, because the dataset kept growing after the experiments ran.
| Model variant | Emergent skills eval | RT-2 generalisation eval |
|---|---|---|
| RT-2 55B, Google Robot data only, web co-trained | 27.3% | 62% |
| RT-2-X 55B, full robotics mixture, web co-trained | 75.8% | 61% |
| RT-2-X 55B, robotics mixture minus Bridge | 42.8% | 54% |
| RT-2-X 5B, history length 2, web co-trained | 44.4% | 52% |
| RT-2-X 5B, no history, web co-trained | 14.5% | 30% |
| RT-2-X 5B, from scratch, no web pretraining | 0% | 1% |
Twelve extra datasets moved unseen-object generalisation from 62 to 61. Within noise, nothing. What moved was the emergent-skills column, 27.3 to 75.8, and those skills are tasks that exist in the Bridge dataset for a different robot. Remove Bridge and it falls to 42.8. Cross-embodiment data did not make the model better at unseen objects; it let the model perform skills somebody else had demonstrated. Only one of those is generalisation in the usual sense.
The bottom row is the one to remember. Strip out web pretraining, train the same 5B from scratch on pooled robot data from 9 embodiments, and both columns go to roughly zero. Robot-data scale alone did not produce generalisation. There is a negative-transfer result too: on the data-rich Google Robot domain RT-1 scored 92 and RT-1-X, the same architecture co-trained on everything, scored 73, because it underfit. Details in the Open X-Embodiment write-up.

Which shift actually breaks a policy
If you are going to hold something out, hold out the thing that matters. Xie, Lee, Xiao and Finn measured this directly in arXiv 2307.03659 (7 July 2023): a real robot policy trained with random crop and photometric augmentation, one environment factor perturbed at a time, six tasks, twelve trials per factor.
| Environment shift | Success rate | Drop from baseline |
|---|---|---|
| No shift (training conditions) | 91.7% | - |
| New backgrounds | 88.9% | 2.8 points |
| New lighting | 83.3% | 8.4 points |
| New distractor objects | 80.6% | 11.1 points |
| New table texture | 52.8% | 38.9 points |
| New camera pose | 45.8% | 45.9 points |
| New table texture plus new background | 55.6% | 36.1 points |
| New table texture plus new distractors | 50.0% | 41.7 points |
Two things fall out. Moving the camera cost more than twice what unfamiliar distractors cost, which the paper attributes to the training set using a fixed head pose throughout. And the factors did not compound: table texture plus background was no worse than table texture alone, so you can fix these one at a time.
The usual cause of "it worked yesterday and does nothing today" is not the policy. The camera got nudged, the arm was re-clamped two centimetres left, or someone re-ran calibration with a different zero. Camera pose is the factor policies handle worst and the one that changes silently. Tape the mount, photograph the setup once, compare that photo before every session. Check geometry before you retrain anything. Symptom pattern: policy only works in one setup.
LIBERO-Plus (arXiv 2510.13626, 15 October 2025) reached the same conclusion with a much bigger hammer: 10,030 simulated tasks across seven perturbation factors and twenty-one sub-components, run against ten VLA models. The ordering held.
| Perturbation | OpenVLA-OFT (from 97.1% baseline) | OpenVLA (from 76.5% baseline) |
|---|---|---|
| Background | 92.4% | 25.3% |
| Lighting | 85.8% | 4.4% |
| Language rephrasing | 81.5% | 26.8% |
| Object layout | 77.1% | 31.6% |
| Sensor noise | 76.7% | 19.3% |
| Camera viewpoint | 59.7% | 1.1% |
| Robot initial state | 37.2% | 4.1% |
Camera viewpoint and the robot's initial joint configuration were worst for both models, matching the 2023 real-robot study. The authors also report the models were largely insensitive to language variation and, on probing, tend to ignore the instruction entirely. A model can post a strong "unseen instruction" score without reading the instruction, because in a scene holding one plausible object there is only one thing to do.
What published zero-shot numbers do not measure
- Statistical resolution. OpenVLA (arXiv 2406.09246) evaluated 170 rollouts on BridgeData V2, 17 tasks at 10 trials each, and 60 on the Google robot, 12 tasks at 5 trials. RT-2 ran each emergent-capability instruction 5 times. Honest, expensive, standard numbers, and small ones.
- Which subset the average covers. BC-Z's 44 percent excludes the zeros. Check whether a reported mean covers all held-out conditions or only the ones that worked.
- The initial state. Nearly every protocol resets the arm to the same home pose. Perturbing the initial state alone cost OpenVLA-OFT 59.9 points, more than any other factor.
- Partial credit. Long-horizon evaluations often score progress rubrics, not binary success. Pi0.5 scores roughly the percentage of task steps completed, so half the dishes in the sink counts as about 50 percent. Reasonable, but not comparable to a binary pick-and-place rate.
- Anything about your arm. None of it was measured on an SO-100, with your cameras, your lighting and your gripper.
# How much can you conclude from 10 trials?
# Wilson score interval, 95 percent, for a measured success rate.
import math
def wilson(successes, trials, z=1.96):
p = successes / trials
denom = 1 + z * z / trials
centre = (p + z * z / (2 * trials)) / denom
half = z * math.sqrt(p * (1 - p) / trials + z * z / (4 * trials * trials)) / denom
return 100 * (centre - half), 100 * (centre + half)
for k, n in [(5, 10), (10, 20), (25, 50), (50, 100)]:
lo, hi = wilson(k, n)
print(f"{k}/{n} = {100 * k / n:.0f}% 95% CI {lo:.1f}% to {hi:.1f}%")
# 5/10 = 50% 95% CI 23.7% to 76.3%
# 10/20 = 50% 95% CI 29.9% to 70.1%
# 25/50 = 50% 95% CI 36.6% to 63.4%
# 50/100 = 50% 95% CI 40.4% to 59.6%A 2026 methodology paper on real-robot VLA benchmarking (arXiv 2605.29710) describes standard practice as binary success at a fixed timeout with "N ≤ 25 rollouts per condition", usually without confidence intervals. Run 10 per condition and a 20-point gap tells you almost nothing. Budget 20 to 30, keep object start positions identical across conditions, and run both in one session so lighting does not drift underneath you.
Building your own seen and unseen split on one arm
You cannot reproduce a 6,000-trial evaluation on a desk. You can define one split before training and measure it honestly. The unit you are splitting is the episode inside a LeRobot dataset, so the split has to exist in the recording plan, not in a post-hoc filter.
- 1Write the split down before you record anything
Pick one axis of variation and commit to it in a text file next to the dataset. One axis, not three. "Objects A, B, C are seen, object D is unseen, everything else fixed" is a real experiment. "Some stuff will be different" is not.
textSPLIT: object identity seen : red cube, blue cube, yellow cube (episodes 0-59) unseen : green cube (never recorded) held fixed: camera pose, table cloth, lighting, arm mount, gripper, home pose, instruction template protocol : 25 rollouts per condition, 5 start positions x 5 repeats date : 2026-08-23 - 2Record the seen set
The desktop client records episodes, camera streams and joint states from a teleoperation session into LeRobot format. Keep the camera bolted down for every episode. For the manual path, lerobot exposes the same operation as a CLI, verbatim below from the README at version 0.6.1, released 3 August 2026.
bashpip install lerobot # 0.6.1, requires Python >= 3.12 lerobot-record \ --robot.type=<robot_name> \ --teleop.type=<teleoperator_name> \ --dataset.repo_id=${HF_USER}/my-dataset - 3Train once, on the seen set only
No peeking. If the unseen object appears in even one episode the exercise is void. lerobot's default seed is 1000, so a repeated run is reproducible for ACT, SmolVLA and Pi0.5. GR00T's fine-tuning entry point, the tyro CLI in launch_finetune.py, exposes no seed at all, so two GR00T runs on identical data will differ.
bashlerobot-train \ --policy.type=act \ --dataset.repo_id=lerobot/aloha_mobile_cabinet - 4Sanity-check the checkpoint open-loop first
Open-loop evaluation replays recorded episodes and compares predicted actions against ground truth. It is cheap and catches a dead checkpoint in a minute. It cannot measure generalisation: it scores against a dataset the model trained on unless you held episodes back. Command from the Isaac-GR00T README.
bashuv run python gr00t/eval/open_loop_eval.py \ --dataset-path <DATASET_PATH> \ --embodiment-tag NEW_EMBODIMENT \ --model-path <CHECKPOINT_PATH> \ --traj-ids 0 \ --execution-horizon 16 # writes /tmp/open_loop_eval/traj_{traj_id}.jpeg with MSE metrics - 5Run seen and unseen back to back, same session
25 rollouts seen, then 25 unseen, identical start positions, alternating if you can. Record every trial as a 0 or a 1. Do not stop early because the numbers look good, and compute the intervals before concluding anything.
bash# For a simulated dry run of the same idea, LIBERO-Object holds out # object identity by construction: 10 tasks, each a pick-and-place # of a different object. lerobot-eval \ --policy.path=lerobot/pi0_libero_finetuned \ --env.type=libero \ --env.task=libero_object \ --eval.n_episodes=10
One note on that command. lerobot's LiberoEnv defaults to task libero_10, accepts libero_spatial and libero_object, and runs at 20 Hz to match robosuite's control frequency. LIBERO itself (arXiv 2306.03310) is four suites and 130 tasks; LIBERO-Spatial, LIBERO-Object and LIBERO-Goal have 10 tasks each and isolate exactly one thing. It is simulation, so treat a result there as a smoke test, never as evidence about your hardware.

Install lerobot, record two datasets by hand, train locally or on a GPU you rent yourself, then write your own evaluation harness and tally sheet. All of it is public and free. What it costs is your time and a card with enough VRAM.
pip install lerobot
# 1. record the seen split
lerobot-record --robot.type=<robot_name> \
--teleop.type=<teleoperator_name> \
--dataset.repo_id=${HF_USER}/seen-objects
# 2. train on it and nothing else
lerobot-train --policy.type=act \
--dataset.repo_id=${HF_USER}/seen-objects
# 3. simulated smoke test on held-out object identity
lerobot-eval --policy.path=<checkpoint> \
--env.type=libero --env.task=libero_object \
--eval.n_episodes=10
# 4. real rollouts: your own harness, your own tally sheet- You control every variable, which is the entire point of a generalisation study.
- You own the raw trial log, so you can recompute intervals later.
- GR00T needs a LeRobot v2.0 or v2.1 dataset. A v3.0 dataset crashes the GR00T loader and has to be converted down to v2.1 first: dataset rejected as v3.
- You own GPU provisioning, driver versions, and remembering to shut the instance down.
The platform removes the plumbing around the experiment. It does not run the experiment for you and it will not tell you whether your split was a good one. What it does is make both halves cheap enough that running the comparison twice is not a budget decision.
- The desktop client records LeRobot-format datasets directly from a teleop session, so episode boundaries and camera streams stay consistent between your seen and unseen recordings.
- The training form picks model, dataset and hyperparameters, rents a GPU on a spot market by required VRAM, runs the trainer and writes checkpoints to object storage. A second run on a stricter split is a form submission, not an afternoon.
- Inference pods auto-provision a cloud GPU that serves the policy and carry an idle watchdog that destroys the pod after an idle period, so a forgotten evaluation session does not keep billing.
- The CLI and the MCP server expose the same operations, so a seen-versus-unseen sweep can be scripted instead of clicked.
- Public datasets give you something to compare against when your own numbers look implausible.
| Tier | Models | Typical run | Cost per run |
|---|---|---|---|
| A100 80 GB or H100 80 GB | GR00T N1.7, GR00T N1.5, Pi0.5 | 3 to 6 hours at 1.20 to 2.00 USD per hour | about 4 to 12 USD |
| RTX 4090 or any 24 GB card | SmolVLA, ACT | 2 to 5 hours at 0.30 to 0.60 USD per hour | about 1 to 3 USD |
At 1 to 3 USD for an ACT run, training a second model on a stricter split costs less than the coffee you drink while it runs. That is the whole argument. Breakdown on the pricing page.
What actually buys generalisation with one arm and fifty episodes
The literature is consistent and the answer is unwelcome. RT-2's ablation says web pretraining and parameter count. Open X-Embodiment's bottom row says a from-scratch model on pooled robot data generalises to nothing. Pi0.5 (arXiv 2504.16054, 22 April 2025) says scene count: roughly 400 hours of mobile manipulator data across about 100 home environments, with a scaling study over 3, 12, 22, 53, 82 and 104 locations. Only at 104 did the model match a control trained directly on the test homes. Generalisation to the 101st home was bought by collecting data in 100.
You are not going to record 100 rooms. What you can do is pick a policy family whose pretraining already carries the semantic breadth, and spend your fifty episodes on the motion rather than the vocabulary. The five trainable policies here differ sharply on that axis.
| Policy | Family | Params | Base checkpoint | Min episodes | Inference | GPU tier |
|---|---|---|---|---|---|---|
| GR00T N1.7 | VLA foundation model, diffusion action head | ~3 B, ~40 M trained during fine-tuning | nvidia/GR00T-N1.7-3B | 50 | 152 ms per action step | A100 80 GB or H100 80 GB |
| GR00T N1.5 | VLA foundation model, predecessor | ~3 B | nvidia/GR00T-N1.5-3B | 50 | 165 ms | A100 80 GB or H100 80 GB |
| Pi0.5 | Flow-matching VLA, PaliGemma backbone | ~3 B | lerobot/pi05_base | 50 | 485 ms | A100 80 GB or H100 80 GB |
| SmolVLA | Compact VLA | ~450 M | vendor base checkpoint | 30 | 245 ms | RTX 4090 or any 24 GB card |
| ACT | Action Chunking Transformer, from scratch | ~80 M | none, it exists only after training on your task | 50 | 20 ms | RTX 4090 or any 24 GB card |
- 20 ms per action step, so the control loop is not the bottleneck and you can iterate in an afternoon.
- Runs on a 24 GB card, about 1 to 3 USD per cloud run, which makes a proper two-condition experiment affordable.
- Action chunking at the default chunk size of 100 handles fine motion VLAs often fumble, and BC-Z's last-centimetre failure is a motion problem, not a semantics one.
- It is honest. With no base model there is no pretraining to over-credit: whatever it does, your fifty episodes taught it.
- No web pretraining means no semantic transfer. RT-2's from-scratch 5B ablation averaged 9 percent on the unseen splits against 44 percent co-fine-tuned.
- An unseen object is genuinely unseen. Nothing in the model knows what a mug is.
- Language conditioning is close to decorative, and LIBERO-Plus found even large VLAs tend to ignore instructions.
- You hit the ceiling of your recorded distribution quickly, and the only way past it is more episodes covering more variation.
Practical recommendation: train ACT first to prove the task is learnable and your data is clean, then fine-tune SmolVLA or GR00T N1.7 on the same dataset and measure the unseen column on both. The head-to-head comparison lists what changes. If the VLA does not beat ACT on your unseen split, the pretraining is not helping on your task and the money belongs in more episodes.

Where this platform does not help
Being clear about this beats another feature list. AY-Robots does not measure generalisation for you. No button runs a held-out evaluation, scores it and hands you a confidence interval. The split is your design decision, the rollouts your labour, the tally sheet your spreadsheet. What the platform removes is GPU provisioning, training-step plumbing and the cost of a second run.
The arena is a bibliography, not a benchmark we ran. The arena compares 85 VLA models across 332 benchmark results, each linked back to its paper or model card. Those are source-reported numbers under each source's own protocol, not comparable across rows without reading what each held out. Use it to find the source, then read the source.
Remote inference has a latency floor. Inference has to sit next to the servos for fast tasks. The control loop is 20 to 485 ms per action step depending on the model, and public-internet round trips turn a working policy into a hesitant one. Viable for slow pick-and-place, not for fast reactive motion. See inference latency.
If you have no hardware at all, the live arm streams a physical SO-100 with no signup on a queue, which at least shows how much a two-centimetre offset in object placement changes the problem. And if your policy trains fine but does nothing on the arm, the split is not your issue yet: start at loss falls, policy does nothing.
Compare the five policies on real numbers before you pick a split
Parameters, GPU tier, inference latency per action step and the minimum episode count for each of the five trainable policies, with the trainer defaults the platform actually sends.
See the policy comparisonDoes "zero-shot" mean the model has never seen the object?▾
Usually not. In BC-Z it meant no robot demonstrations existed for that task sentence, while the objects came from two training families that were recombined. In RT-2 it meant object instances absent from the robot data, though the web pretraining had seen images of them. In LIBERO-Object it means the instance is held out inside a simulated suite of ten pick-and-place tasks. Read the protocol before comparing papers.
Why did more robot datasets not improve unseen-object performance in Open X-Embodiment?▾
Because unseen-object generalisation comes mostly from vision-language pretraining, not robot data. The ablation shows RT-2 at 62 percent and RT-2-X at 61 percent on the same evaluation. What cross-embodiment data improved was emergent skills, 27.3 to 75.8 percent, and those are skills demonstrated on a different robot in the Bridge dataset. Remove Bridge and it falls to 42.8 percent.
How many trials before my seen-versus-unseen gap means anything?▾
At 10 trials per condition a measured 50 percent has a 95 percent Wilson interval of about 24 to 76 percent, so a 20-point gap is not evidence. At 50 trials it narrows to roughly 37 to 63 percent. Budget 20 to 30 rollouts per condition as a floor, with identical object start positions across conditions.
What single change hurts my policy most?▾
Moving the camera. In the 2023 real-robot factor study a new camera pose dropped success from 91.7 to 45.8 percent, while new backgrounds only dropped it to 88.9 percent. LIBERO-Plus found the same ordering across ten models in 2025, camera viewpoint and initial joint state worst. Bolt the camera down and mark the mount.
Fine-tune a VLA or train ACT from scratch, if I care about unseen objects?▾
Train ACT first to prove the task is learnable and the data clean; about 1 to 3 USD per run, 20 ms per action step. Then fine-tune SmolVLA or GR00T N1.7 on the same dataset and measure your unseen split on both. If the VLA does not beat ACT there, the pretraining is not transferring and more episodes are the better investment.
Can I test generalisation in simulation instead of on the arm?▾
Partly. LIBERO-Object holds out object identity by construction and lerobot runs it with lerobot-eval, a useful smoke test. But simulated shifts differ from real ones: camera drift, lighting change and gripper wear only show up on hardware. Treat a simulated result as a reason to keep going, never as evidence about your setup.
Sources
- BC-Z: Zero-Shot Task Generalization with Robotic Imitation Learning
- BC-Z project page and released demonstration data
- RT-2: Vision-Language-Action Models Transfer Web Knowledge to Robotic Control
- RT-2 project page
- Open X-Embodiment: Robotic Learning Datasets and RT-X Models
- Open X-Embodiment project page
- Decomposing the Generalization Gap in Imitation Learning for Visual Robotic Manipulation
- Factor World benchmark and evaluation videos
- LIBERO-Plus: In-depth Robustness Analysis of Vision-Language-Action Models
- LIBERO: Benchmarking Knowledge Transfer for Lifelong Robot Learning
- OpenVLA: An Open-Source Vision-Language-Action Model
- Pi0.5: a Vision-Language-Action Model with Open-World Generalization
- PhAIL: A Real-Robot VLA Benchmark and Distributional Methodology
- huggingface/lerobot: lerobot-train, lerobot-eval and lerobot-record
- NVIDIA Isaac-GR00T: open-loop and closed-loop evaluation scripts
Ready for high-quality robotics data?
AY-Robots connects your robots to skilled operators worldwide.
Get Started