| Fact | SO-1005 joints plus gripper, 6 actuators | Koch v1.15 joints plus gripper, 6 actuators |
|---|---|---|
| Maker | TheRobotStudio and LeRobot | LeRobot community |
| Actuators | 5 joints plus gripper, 6 actuators | 5 joints plus gripper, 6 actuators |
| Servos | Feetech STS3215 bus servos | Dynamixel XL330 and XL430 |
| Supply voltage | 7.4 V | 5 V and 12 V rails depending on the servo |
| Parts cost | roughly 110 to 150 euro per arm in parts | roughly 250 to 350 euro per arm in parts |
| Platform support | Fully supported | Compatible |
| Also written as | SO-ARM100, SO100 | Alexander Koch arm, Koch arm |
| In one line | The reference arm of this platform. Everything here is tested on one first. | Dynamixel bus instead of Feetech, so the driver differs but the data pipeline does not. |
Both arms give you five joints plus a gripper, six actuators, and a LeRobot v2.0 dataset that every trainer here reads the same way. The SO-100 runs Feetech STS3215 bus servos on a single 7.4 V rail at roughly 110 to 150 euro in parts. The Koch v1.1 runs Dynamixel XL330 and XL430 servos across 5 V and 12 V rails at roughly 250 to 350 euro, so pick it only when the Dynamixel bus is a requirement you already have.
The short answer
Put a dataset from each arm side by side and you cannot tell them apart: six actuator positions per frame, camera images, a task string, LeRobot v2.0. That is what a trainer consumes. The divergence lives below that line, in the layer that turns a commanded joint position into a servo that moves: Feetech STS3215 on the SO-100, Dynamixel XL330 and XL430 on the Koch. Different protocol, different driver, different connectors, different rails, roughly double the bill.
Side by side
| Fact | SO-100 | Koch v1.1 |
|---|---|---|
| Maker | TheRobotStudio and LeRobot | LeRobot community |
| Degrees of freedom | 5 joints plus gripper, 6 actuators | Identical, 6 actuators |
| Servos | Feetech STS3215 bus servos | Dynamixel XL330 and XL430 |
| Voltage | 7.4 V, one rail | 5 V and 12 V rails, depending on the servo |
| Parts cost | Roughly 110 to 150 euro | Roughly 250 to 350 euro |
| Support level here | full | compatible |
| Driver | Feetech bus, the reference setup | Dynamixel bus, a different path |
| Action dimensions | 6 | 6 |
| Dataset format | LeRobot v2.0 | LeRobot v2.0 |
| Models | ACT, SmolVLA, Pi0.5, GR00T N1.5, GR00T N1.7 | The same five |
| Also written as | SO-ARM100, SO100 | Alexander Koch arm, Koch arm |
The bus is the whole difference
A bus servo answers to a protocol on a shared line, and every servo on that line has an id. Feetech and Dynamixel each have their own protocol and neither speaks the other, so the driver, the serial adapter, the connectors and the id assignment all differ. What none of that produces is a second data format: once a joint position has been read off the bus it is a number in a frame, and frames are what the recorder writes.
In daily use the split shows up in three places: finding the right serial port, wiring power, and working out whether a silent joint is the servo, its id or the line. Everything after that, the calibration reference, the episodes, the training job, the policy run, behaves the same.
Power is where the Koch costs you attention
The SO-100 has one correct voltage and only one. Every actuator on it is an STS3215 and each wants 7.4 V, a rule you can enforce with a glance at a label. That matters, because you are most likely to grab the wrong supply when the arm is half apart on the bench.
The Koch v1.1 does not offer that shortcut. It mixes XL330 and XL430 servos across 5 V and 12 V rails, so the check is per rail rather than per arm. That is not a defect, it is the price of a mixed lineup, but it is real care at build time and real risk during a repair, and it belongs next to the parts cost.
The Koch runs a 12 V rail. A Feetech STS3215 runs at 7.4 V and dies within seconds on 12 V. Two arms sharing a bench is how the wrong barrel jack finds the wrong bus. Label each supply at the connector end.
What the data pipeline never sees
| Stage | SO-100 | Koch v1.1 | Same? |
|---|---|---|---|
| Bring the arm up | Feetech serial port | Dynamixel port | No, different bus |
| Zero point | ay-robots calibrate | Same command | Yes |
| Teleoperation | Desktop client or web cockpit | Same | Yes |
| Recording | ay-robots record --task "..." | Same command | Yes |
| Dataset written | LeRobot v2.0, 6 action dimensions | Same | Yes |
| Training | Cloud GPU, from the dashboard or start_training | Same | Yes |
| Run cost per job | 1 to 3 USD on 24 GB, 4 to 12 USD on 80 GB | Same, the model sets it | Yes |
| Inference | ay-robots run --model <model> | Same command | Yes |
That is why the Koch is compatible rather than unsupported. Everything above the driver line is shared, so every training guide and dataset rule here applies unchanged, including the one that bites hardest: GR00T takes LeRobot v2.0 or v2.1 and crashes on v3.0, on either arm.
What compatible means, and what it costs you
The two support levels describe where a change gets tested. The SO-100 is the reference unit, so a symptom is reproduced on one before the page describing it is written, and the SO-101 inherits that as the same servo family on the same rail.
Compatible means the Koch runs that same workflow but is not the arm the platform is developed against. Every hardware symptom documented here was reproduced on a Feetech bus. The diagnostic order transfers, ids first, then wiring, then power, because that order is a property of bus servos rather than of a vendor. The exact output may not, so you will sometimes read a fix page as reasoning rather than a script.
That is the honest cost of the Koch, and the only one: no reduced feature set, no separate dataset format, no excluded model, no surcharge on a run.
# Which serial port is the Koch on? --json makes the answer scriptable.
ay-robots --json devices
# run without --checkpoint drives the base model, which proves the
# driver, the calibration and the cameras before any training happens.
ay-robots run --model act --task "pick up the red cube and put it in the bin"
ay-robots stopBringing a Koch v1.1 online next to an SO-100
- 1Power one arm at a time, then find its port
Two energized arms on one bench, one at 7.4 V and one on 5 V and 12 V rails, is how the wrong supply finds the wrong bus. Bring the Koch up alone. If it is missing here, nothing below works.
bashay-robots devices - 2Calibrate the arm you will record with
Guide the joints to the neutral pose, press Enter, then send it home to confirm the reference took.
bashay-robots calibrate ay-robots home - 3Record a short dataset and inspect it before scaling
Five episodes confirm that frames, cameras and action columns look right. Enter keeps an episode, Ctrl-C discards a fumbled one.
bashay-robots record --task "pick up the red cube and put it in the bin" \ --dataset cube-pick-koch --episodes 5 --cameras wrist,top ay-robots datasets list --local - 4Upload, then start training in the dashboard
Training has no CLI command: upload, then open Training in the dashboard, pick the dataset, choose a model, press Start. Agents call start_training on the MCP server.
bashay-robots datasets upload cube-pick-koch --name "koch cube pick"
Choose the Koch v1.1 if
- You already own Dynamixel servos, or your lab standardized on them and spares are on the shelf. Buying into a second bus family to save nothing downstream is no improvement.
- You need Dynamixel tooling outside this platform and want one bus for everything.
- A Koch build already exists. Its data is worth the same as SO-100 data.
Choose the SO-100 if
- You are starting from zero. Roughly 110 to 150 euro against 250 to 350 is the difference between one arm and a teleoperation pair.
- You want the documented failure modes reproduced on the bus in front of you.
- You may add a mobile base later. A LeKiwi is an SO-100 arm on wheels, so the Feetech path carries forward and a Koch build does not.
- You would rather spend the difference on cameras and episodes.
Where to go next
- /robots/koch-v1-1 for the Koch fact sheet, servos and rails
- /robots/so-100 for the reference arm it is compared against
- /train/smolvla-on-koch-v1-1 for the cheapest first run
- /train/act-on-koch-v1-1 for the lowest inference latency
- /fix/servo-not-responding when a joint drops off the bus
- /fix/arm-not-detected when the device list stays empty
- /glossary/leader-follower for how the teleoperation pair works
- /glossary/degrees-of-freedom for what six actuators mean
- /compare/so-100-vs-so-101 if the question is which Feetech arm to build
Frequently asked questions
Does the Koch v1.1 train the same models?▾
Yes, all five: ACT, SmolVLA, Pi0.5, GR00T N1.5 and GR00T N1.7. The trainer sees six action dimensions in a LeRobot v2.0 dataset and never learns which bus produced them, so defaults and GPU tiers are identical.
Is a Dynamixel arm more precise than a Feetech one?▾
This site publishes no such measurement, so do not take one from here. What is documented is what the pipeline sees, and it sees six joint positions per frame either way. When a policy fails, the cause is far more often the dataset, the cameras or the calibration.
Can I pair a Koch leader with an SO-100 follower?▾
Treat that as untested territory. The joint counts match, but driver, calibration and power are per arm, and this platform documents matched pairs. On a budget, two SO-100 arms cost less than one Koch.
Does the Koch cost more to train?▾
No. Training cost follows the model and its GPU tier, not the arm: about 1 to 3 USD on 24 GB with SmolVLA or ACT, about 4 to 12 USD on 80 GB with Pi0.5 or either GR00T.
Will a policy trained on SO-100 data run on a Koch?▾
The shapes match, so the job runs and the checkpoint loads. What breaks is physical: different geometry, a different calibration frame, probably different cameras. Treat a cross-arm checkpoint as a smoke test, then record on the arm you deploy on.
The arm is the smaller half of the decision. Which model you train on the data it records is compared under /compare, and the runnable instructions per model and arm are under /train.