
A 110 euro SO-100 will never pipette to ISO 8655. It will shuttle plates, feed instruments and sort tubes. Where the line runs, with measured numbers from both sides.
What you need to know
- •A 110 to 150 EUR SO-100 is not a pipetting robot. ISO 8655-2:2022 scopes volumetric accuracy to the pipette and its tips. The arm is not in the measurement chain, so it cannot improve the number.
- •The same arm is useful for the transport half of a workflow: plates, racks, vials, tip waste, tube sorting. A 2025 Communications Chemistry paper names vial and rack transfers as a common failure point in self-driving labs.
- •Measured, not advertised: a bench test of an STS3215 found about 0.87 degrees of backlash against a 0.5 degree datasheet limit, and plus or minus 0.3 mm repeatability on a 10 cm lever.
- •The ANSI/SLAS footprint is 127.76 mm by 85.48 mm. Standardised labware is what makes a cheap arm workable: you buy accuracy with a printed nest, not a better arm. Also: 7.4 V servos, never 12 V.
- •Latency picks where the policy runs. ACT costs 20 ms per action step here, Pi0.5 costs 485 ms. Slow shuttling tolerates a remote pod; reactive motion does not.
Start with the tolerance, not the arm
Split a bench workflow in two. There is metrology, where a number has to be right: aspirate 100 microlitres, read at 450 nm. And there is logistics, where an object has to end up somewhere: this plate into the reader, these tubes into the centrifuge. Metrology belongs to instruments. Logistics is what an arm does. A SO-100 does a surprising amount of the second and essentially none of the first.
| Bench job | Tolerance that matters | Where it lives | Cheap arm? |
|---|---|---|---|
| Dispense 100 uL | Volumetric error per ISO 8655-2 | Pipette, seal, tip | No |
| Mount a pipette tip | Axial force, 1 to 15 kgf in published tests | Shaft and tip cone | No |
| Move a 96-well plate | Landing in a nest; 127.76 by 85.48 mm footprint | Nest geometry | Yes, with chamfers |
| Vial into a rack hole | 1 to 2 mm radial clearance | Rack and gripper | Yes |
| Sort tubes by label | Camera resolution | Vision, not the arm | Yes, best case |
| Load a sealed drawer | Insertion compliance, force limiting | Whole arm | No, jamming risk |
Write down the clearance of the tightest feature the arm must enter. A 96-well plate has a 9 mm centre-to-centre pitch per ANSI/SLAS 4-2004, first column centre 14.38 mm from the left outside edge. A rack hole gives a millimetre or two, a tip cone almost nothing. Above roughly 1 mm, a cheap arm plus a fixture is real. Below it, buy the instrument.
What an SO-100 is, measured rather than advertised
The SO-100 and the newer SO-101 are printed arms built on Feetech STS3215 bus servos. The SO-ARM100 build repository prices one follower arm at USD 121.94 or EUR 124.30 and a leader-follower pair at EUR 226.30, before filament. The follower runs six STS3215 motors with 1/345 gearing per the LeRobot SO-101 guide; the leader mixes 1/191, 1/345 and 1/147 so a human can backdrive it.
Vendor pages quote payloads. The build repo does not, and that silence is honest. What you get instead is measured servo behaviour, from a bench test published as Testing of Feetech STS3215 Servomotor. Its torque figures are for the 30 kg.cm 12 V variant; the SO-100 follower runs the 7.4 V motor, rated at 16.5 kg.cm stall at 6 V, so read that column as a ceiling you will not reach.
| Property | Spec | Measured | At the gripper |
|---|---|---|---|
| Backlash | 0.5 degrees or less | about 0.87 degrees | Roughly 4.5 mm of slop at 300 mm |
| Repeatability | not specified | plus or minus 0.3 mm on a 10 cm lever | Fine for a 9 mm pitch, not a press fit |
| Stall torque (12 V part) | 30 kg.cm | about 35 kg.cm | Peak only, not a design target |
| Sustained load (12 V part) | not specified | 1.5 kg at 10 cm, plus 15 C in 10 min | Duty cycle beats peak torque |
| Overload trip (12 V part) | not specified | 2 kg dynamic at 10 cm | The arm sags mid-motion |
STS3215 servos ship in 7.4 V and 12 V versions that look identical. SO-100 and SO-101 use the 7.4 V parts, and 12 V destroys them permanently in under a second. Label the power brick. If an arm has already gone silent, start at servo not responding.
The arm has six degrees of freedom including the gripper, so five for pose. Enough to lay a plate on a nest or drop a vial in a hole. Not enough to reach into a crowded deck at an arbitrary orientation while dodging a cable. Design the layout around the arm.
Job 1: pipetting. The answer is no
ISO 8655-2:2022 sets maximum permissible errors for air-displacement and positive-displacement pipettes complete with their selected tips and consumable parts, at 20 C, 50 percent relative humidity and 101.3 kPa. It scopes the instrument and the disposable, not the thing holding them. For scale, an Opentrons OT-2 lists 15 percent accuracy at 1 uL, its P300 single channel hits plus or minus 0.6 percent at 300 uL, and the machine weighs 48 kg and starts at USD 10,000.
- Force. The METTLER TOLEDO Rainin pipetting whitepaper puts tip ejection as the heaviest force in the cycle, four common pipettes spread across roughly 1 to 4 kgf. An SO-100 gripper does not make a coaxial 30 N push.
- Stiffness. A press fit needs the shaft coaxial as force builds. With 0.87 degrees of backlash, the wrist deflects first.
- Sealing. Too little tip loading force and the seal leaks, a volumetric error no camera will show you.
- Contamination. PLA's glass transition sits near 60 C, so a 121 C autoclave cycle is unavailable.
- Traceability. No calibration certificate and no path to one. Regulated workflows are out by construction, not performance.
You can record 60 episodes of an SO-100 pressing a manual plunger and train a policy that looks convincing on video. The loss falls, the arm moves, and every dispense is off by an unknown amount, because nothing in the pipeline measures volume. Errors in a learned policy are silent here. Put a balance under the receiving vessel and log mass per dispense. Same failure class as loss falls but the policy does nothing.
Job 2: plate handling, with a fixture
Here standardisation rescues you. ANSI/SLAS 1-2004 fixes the microplate footprint at 127.76 mm by 85.48 mm, plus or minus 0.25 mm within 12.7 mm of the corners and plus or minus 0.5 mm along the side, with a flange corner radius of 3.18 mm. Every SBS plate has that outline, so one printed nest with generous lead-in chamfers provides the last millimetre instead of the arm.
The failure modes are specific. A plate gripped on its short edges skews if the jaws close asymmetrically, and drops if the gripper servo trips its overload protection mid-lift. A lidded plate is two objects that can separate. A full plate is not rigid, so sloshing moves the centre of mass: slow the trajectory rather than expecting the policy to compensate. Dropped objects usually trace back to gripper does not close.
Job 3: sample sorting, the sweet spot
Sorting is where a learned policy beats a script and the arm's weaknesses stop mattering. Rack holes give a millimetre or two, the objects are light, there is no force spec, and the decision is visual, which is what a vision-language-action model is for.
Published work brackets this. Burger et al., A mobile robotic chemist (Nature 583, 2020) ran 688 experiments over eight days and framed the contribution as automating the researcher rather than the instruments. At the other end, Conrad et al. (Advanced Intelligent Systems, 2025) moved specimens from a magazine to a pallet with a desktop Dobot MG400, reporting 100 percent correct placement at 8.9 s per transfer, 2.8 times faster than the human demonstration.
- 110 to 150 EUR of parts per station, so three arms cost less than one set of Opentrons pipettes.
- Taught by demonstration, so a new tray layout is a recording session, not a rewrite.
- Standardised labware means you buy accuracy with a printed fixture.
- It fails soft. An overloaded servo sags rather than driving a force spike into a 10 kEUR instrument.
- Build files, dataset format and policies are open and inspectable, which matters when a reviewer asks how the sample moved.
- The measured backlash rules out sub-millimetre placement without a mechanical guide.
- No force or torque sensing. Contact tasks are blind.
- PLA cannot be autoclaved and has no defined chemical resistance.
- Continuous duty heats the servos: plus 15 C in ten minutes at 1.5 kg on a 10 cm lever.
- No traceability and no qualification path into GLP or GMP.
- A policy is valid only for the setup it was recorded in, as documented at /fix/policy-only-works-in-one-setup.
Teach the motion instead of programming it
Inverse kinematics plus waypoints works when the world is fixed, and a bench is not: racks shift, tube heights vary, someone leaves a marker pen on the deck. The imitation learning route is to drive the arm through the task a few dozen times and train a policy on what the cameras and joints saw. The LIRA paper (Communications Chemistry, 2025) states the problem plainly: manipulation in most self-driving lab workflows is open loop, with no real-time error detection. Their closed-loop vision fix reached 1.02 mm mean translation error using 75 mm ArUco markers, at about 5 s per calibration against roughly 53 s tactile.
# LeRobot plus the Feetech SDK the STS3215 bus needs
pip install -e ".[feetech]"
# Which serial port is the arm on? Unplug when prompted.
lerobot-find-port
# One-time: write ids and baudrate into each servo's EEPROM,
# gripper first, one motor connected at a time.
lerobot-setup-motors --robot.type=so101_follower --robot.port=/dev/ttyACM0
# Calibration: mid-range pose, then sweep every joint end to end.
lerobot-calibrate --robot.type=so101_follower --robot.port=/dev/ttyACM0 --robot.id=bench_arm- 1Fix the scene before recording anything
Bolt down the nest, the rack and the cameras, and mark their outlines. A policy trained on a moving camera learns nothing transferable. Two views work well: overhead for the tray, wrist for the grasp.
bashlerobot-teleoperate \ --robot.type=so101_follower --robot.port=/dev/ttyACM0 --robot.id=bench_arm \ --robot.cameras="{ top: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30}, wrist: {type: opencv, index_or_path: 1, width: 640, height: 480, fps: 30} }" \ --teleop.type=so101_leader --teleop.port=/dev/ttyACM1 --teleop.id=bench_leader \ --display_data=true - 2Record, varying only what should vary
Vary tube position, roughly 10 episodes per region. Do not vary lighting, camera pose or grasp style yet. Defaults: episode_time_s 60, reset_time_s 60, num_episodes 50.
bashlerobot-record \ --robot.type=so101_follower --robot.port=/dev/ttyACM0 --robot.id=bench_arm \ --robot.cameras="{ top: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30}, wrist: {type: opencv, index_or_path: 1, width: 640, height: 480, fps: 30} }" \ --teleop.type=so101_leader --teleop.port=/dev/ttyACM1 --teleop.id=bench_leader \ --dataset.repo_id=${HF_USER}/tube-sort \ --dataset.num_episodes=60 \ --dataset.episode_time_s=30 \ --dataset.reset_time_s=15 \ --dataset.single_task="Put the capped tube into the empty rack hole" \ --display_data=true - 3Replay before you train
Replay drives the recorded joint targets back at the arm with no policy involved. If it misses the rack hole, the problem is mechanical, and training will only launder it.
bashlerobot-replay \ --robot.type=so101_follower --robot.port=/dev/ttyACM0 --robot.id=bench_arm \ --dataset.repo_id=${HF_USER}/tube-sort --dataset.episode=0 - 4Train the cheap model first
ACT trains from scratch at roughly 80 M parameters on a 24 GB card and costs 20 ms per action step. Save the 3 B models for when ACT has plateaued.
bashlerobot-train \ --dataset.repo_id=${HF_USER}/tube-sort \ --policy.type=act \ --output_dir=outputs/train/act_tube_sort \ --job_name=act_tube_sort \ --policy.device=cuda - 5Roll out and count failures by cause
Log why each attempt failed: missed the tube, dropped it, missed the hole, hit the rack. Four buckets, four fixes. In current LeRobot, --strategy.type=base runs autonomously without recording.
bashlerobot-rollout \ --strategy.type=base \ --policy.path=${HF_USER}/act_tube_sort \ --robot.type=so100_follower --robot.port=/dev/ttyACM0 \ --task="Put the capped tube into the empty rack hole" \ --duration=120
Which policy for a bench task
Five models are trainable here, and for lab logistics the choice is latency and episode count. ACT is the default for a fixed bench; SmolVLA is the alternative when you want language conditioning or cannot record 50 episodes. The full comparison and ACT against SmolVLA have the rest.
| Policy | Params | Per action step | GPU tier | Min episodes | Dataset | Fit |
|---|---|---|---|---|---|---|
| ACT | about 80 M | 20 ms | RTX 4090 or any 24 GB | 50 | v3.0 | Best. Runs beside the servos |
| SmolVLA | about 450 M | 245 ms | RTX 4090 or any 24 GB | 30 | v3.0 | Fewest episodes, language conditioning |
| GR00T N1.7 | about 3 B, 40 M trained | 152 ms | A100 or H100 80 GB | 50 | v2.0 or v2.1 | Overkill for a fixed nest |
| GR00T N1.5 | about 3 B | 165 ms | A100 or H100 80 GB | 50 | v2.0 or v2.1 | Prefer N1.7 |
| Pi0.5 | about 3 B, PaliGemma | 485 ms | A100 or H100 80 GB | 50 | v3.0 | Slowest loop of the five |

GR00T's loader wants a LeRobot v2.0 or v2.1 dataset and crashes on v3.0, so a fresh recording has to be converted down first. ACT, SmolVLA and Pi0.5 all take v3.0. Check before renting a GPU, not after. Symptom and fix at dataset rejected as v3, format at LeRobot dataset.
Where the policy has to run
A bench arm has an unusual advantage: nobody minds if the plate takes four seconds instead of one, which makes remote inference viable in a way it is not for reactive work. The constraint is that the control loop already costs 20 to 485 ms per action step, and public-internet round trips on top turn a working policy into a hesitant one. Slow pick and place is fine on a cloud pod; anything reacting to contact needs inference next to the servos. See inference latency and action chunking.
A hesitating policy can be a latency problem or a data problem, and video will not tell them apart. Latency pauses land at regular intervals matched to the chunk boundary; data problems pause at the same place every time. Log timestamps before blaming the network: policy freezes mid-motion.
Print the arm from the SO-ARM100 repository, buy servos and a 7.4 V supply, assemble, install LeRobot with the Feetech extra, and run the sequence above. Fixtures you model against the SLAS dimensions yourself.
- 110 to 150 EUR for an SO-100, plus filament, plus a leader arm if you want leader-follower teleoperation rather than a pad.
- You own the whole stack, including the rented GPU still running on Sunday.
- Dataset versioning, v2.1 to v3.0 conversion and checkpoint management are yours.
- Budget a full day for assembly and calibration on a first build.
Same goal, fewer moving parts. The desktop client records LeRobot-format datasets straight out of a teleoperation session. The training form picks model, dataset and hyperparameters; the backend rents a GPU by required VRAM and writes checkpoints to object storage. For inference, an endpoint auto-provisions a pod that serves the policy.
- No hardware needed to start: /live streams a physical arm with no signup, queue-based.
- Inference pods carry an idle watchdog and destroy themselves, so a forgotten pod does not bill silently.
- Public datasets are listed in the dataset directory; a run can also point at a Hugging Face repo id.
- The same operations reach a terminal via the CLI and AI agents via the MCP server, which is how a bench workflow reaches a scheduler.
- Run cost is 1 to 3 USD on the 24 GB tier, 4 to 12 USD on the A100 or H100 tier: see pricing.
ACT on SO-100 and SmolVLA on SO-100 list the defaults the backend actually sends, which are not the upstream repo defaults.

What this does not fix
Useful for logistics is not the same as useful. Several things a lab needs sit outside what any 110 EUR arm delivers, and pretending otherwise is how automation projects die at month four.
- Error recovery. A trained policy shares the open-loop flaw the LIRA authors describe: it continues after dropping the tube, because nothing told it. Their inspection module reached 97.9 percent detection accuracy as a separate build.
- Device integration. Moving a plate is one command in a workflow that also talks to a reader, a shaker and a LIMS. That layer is what SiLA 2 and PyLabRobot exist for. The arm is a peripheral, not the system.
- Throughput. One arm at a 10 second transfer is 360 moves an hour at best, with servo heating in the way.
- Validated volume. Without a balance or a reader in the loop, a pipetting policy's error is unobservable.
- Generalisation. A policy is bound to the camera poses and lighting it saw, so rebuilding the bench means rebuilding the dataset: policy only works in one setup.
- Anything regulated. No calibration certificate, no qualification path, no autoclave. A hard boundary, not a roadmap item.
A realistic first project
Build a tube handoff. Not a workflow, not a pipetting cell. One arm, one tray, one rack, one decision. Published low-cost work sits at this scale: Logan, Dudash and Negron (arXiv, March 2026) report a modified 5-DOF arm with a liquid handling end effector reaching mean positional error below 1 mm for colony picking, with segmentation at 0.537 IoU. Sub-millimetre placement is achievable at this price. Reliable perception is the harder half.
- 1Week 1: fixtures and replay, no learning
Print a nest and rack holder against the SLAS dimensions with 3 mm or larger chamfers, bolt them and the cameras down, run the calibration sweep, then record five throwaway episodes and replay them. Nothing downstream rescues a nest the arm cannot hit.
- 2Week 2: record 60 episodes in one sitting
One person, one session, one grasp style, tube position varied across the tray. At 30 s per episode plus 15 s reset, roughly 45 minutes.
- 3Week 2: train ACT and measure
Train ACT, run 30 rollouts and tally the four failure buckets. A number you wrote down beats a video you remember.
- 4Week 3: add the balance
Put a scale under the destination and log mass per handoff. That independent check is the difference between a demo and an instrument.
- 5Week 4: decide honestly
Above roughly 95 percent success on a task you repeat, keep it and add error detection. At 80 percent it is a teaching tool and the workflow still needs a human.

Before committing, the model arena compares 85 VLA models across 332 benchmark results, and the three ways to start without hardware lets you drive a real arm first. Background reading: the complete SO-100 setup and training guide, the overview of vision-language-action models, and how to collect high-quality VLA training data.
For the state of the art, LabVLA (arXiv, June 2026) grounds a VLA in laboratory protocols on a Qwen3-VL-4B-Instruct backbone, evaluated on the LabUtopia benchmark. And ORGANA remains the clearest statement of the assistive framing, with a chemist in the loop and 80.3 percent average time saved. Note what ORGANA automates. Not the measurement. The hands.
Build the SO-100 first, then decide what it is for
The SO-100 hub collects the build, calibration, data collection and training path in one place, with the parts cost, the servo voltage and the defaults the trainer actually sends.
Open the SO-100 hubCan an SO-100 pipette accurately?▾
No. ISO 8655-2:2022 scopes volumetric accuracy to the pipette together with its tips, at 20 C, 50 percent relative humidity and 101.3 kPa. The arm is not in the measurement chain, so it cannot improve the number and can worsen it by tilting the barrel. Published measurements also put tip ejection at roughly 1 to 4 kgf, which an SO-100 gripper does not produce coaxially.
What can a cheap arm actually do in a lab?▾
Transport and sorting: microplates between a nest and an instrument, vials into rack holes, feeding a reader, clearing tip waste, sorting tubes by a visual cue. All have 1 mm or larger clearances, low mass, no force spec and a visual decision. The 2025 Communications Chemistry paper on LIRA names vial and rack transfers as a common failure point in self-driving labs.
How repeatable is an SO-100?▾
A bench test of an STS3215 measured about 0.87 degrees of backlash against a 0.5 degree datasheet limit, on an 86 mm lever, and plus or minus 0.3 mm repeatability on a 10 cm lever. The 12-bit encoder resolves 0.088 degrees, so backlash and firmware dead zones are the limit, not the encoder. At 300 mm from a joint that is roughly 4.5 mm of slop, which is why lead-in chamfers matter more than tuning.
Which policy should I train for plate or tube handling?▾
Start with ACT: about 80 M parameters, from scratch on a 24 GB card, 50 episodes minimum, 20 ms per action step. SmolVLA is the alternative if you want language conditioning or cannot record 50 episodes, since its minimum is 30. GR00T N1.7 at 152 ms and Pi0.5 at 485 ms need an A100 or H100, which a fixed bench rarely justifies.
Is a printed PLA arm safe around samples and reagents?▾
Treat it as non-sterile and solvent-naive. PLA's glass transition sits near 60 C, so a 121 C autoclave cycle is unavailable, and printed parts have layer lines and no defined chemical resistance. That rules out sterile and solvent-contact work, but not handling closed, labelled containers on the outside. GLP and GMP are out regardless: no calibration certificate.
Sources
- TheRobotStudio/SO-ARM100: build repository, bill of materials and servo torque figures
- LeRobot SO-101 guide: gearing table, lerobot-find-port, lerobot-setup-motors, lerobot-calibrate
- LeRobot imitation learning on real robots: lerobot-record defaults, lerobot-replay, lerobot-train, lerobot-rollout
- Robo9: testing of the Feetech STS3215 servomotor, backlash, repeatability and torque
- ANSI/SLAS 1-2004 (R2012): microplate footprint dimensions
- ANSI/SLAS 4-2004 (R2012): microplate well positions and 9 mm pitch
- ISO 8655-2:2022 preview: scope, maximum permissible errors and reference conditions for pipettes
- Opentrons OT-2 pipette accuracy and precision specifications per volume
- Opentrons OT-2 liquid handler: price, deck slots, dimensions and mass
- The Ergonomics of Pipetting (Rainin Instrument, METTLER TOLEDO, 2012): plunger and tip ejection forces
- Zhou et al., localization, inspection and reasoning (LIRA) module for autonomous workflows in self-driving laboratories, Communications Chemistry 2025
- Burger et al., A mobile robotic chemist, Nature 583 (2020)
- Conrad et al., lowering the entrance hurdle for lab automation, Advanced Intelligent Systems 7(10), 2025
- Darvish, Skreta et al., ORGANA: a robotic assistant for automated chemistry experimentation and characterization
- Ren et al., LabVLA: grounding vision-language-action models in scientific laboratories (2026)
Ready for high-quality robotics data?
AY-Robots connects your robots to skilled operators worldwide.
Get Started