SO-100 vs Koch v1.1: two servo buses, one data pipeline

Same joint count, same recording commands, same five models. The difference sits underneath all of that, in the servo bus, and the bus decides your wiring, your power rails, your failure modes and roughly half your parts budget.

Last updated 2026-08-09

SO-100 and Koch v1.1 side by side
FactSO-1005 joints plus gripper, 6 actuatorsKoch v1.15 joints plus gripper, 6 actuators
MakerTheRobotStudio and LeRobotLeRobot community
Actuators5 joints plus gripper, 6 actuators5 joints plus gripper, 6 actuators
ServosFeetech STS3215 bus servosDynamixel XL330 and XL430
Supply voltage7.4 V5 V and 12 V rails depending on the servo
Parts costroughly 110 to 150 euro per arm in partsroughly 250 to 350 euro per arm in parts
Platform supportFully supportedCompatible
Also written asSO-ARM100, SO100Alexander Koch arm, Koch arm
In one lineThe 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.
Short answer

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

FactSO-100Koch v1.1
MakerTheRobotStudio and LeRobotLeRobot community
Degrees of freedom5 joints plus gripper, 6 actuatorsIdentical, 6 actuators
ServosFeetech STS3215 bus servosDynamixel XL330 and XL430
Voltage7.4 V, one rail5 V and 12 V rails, depending on the servo
Parts costRoughly 110 to 150 euroRoughly 250 to 350 euro
Support level herefullcompatible
DriverFeetech bus, the reference setupDynamixel bus, a different path
Action dimensions66
Dataset formatLeRobot v2.0LeRobot v2.0
ModelsACT, SmolVLA, Pi0.5, GR00T N1.5, GR00T N1.7The same five
Also written asSO-ARM100, SO100Alexander 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.

Keep a 12 V rail away from a Feetech bus

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

StageSO-100Koch v1.1Same?
Bring the arm upFeetech serial portDynamixel portNo, different bus
Zero pointay-robots calibrateSame commandYes
TeleoperationDesktop client or web cockpitSameYes
Recordingay-robots record --task "..."Same commandYes
Dataset writtenLeRobot v2.0, 6 action dimensionsSameYes
TrainingCloud GPU, from the dashboard or start_trainingSameYes
Run cost per job1 to 3 USD on 24 GB, 4 to 12 USD on 80 GBSame, the model sets itYes
Inferenceay-robots run --model <model>Same commandYes

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.

bash
# 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 stop
Identify the arm, then run a base model as a smoke test before your own policy exists.

Bringing a Koch v1.1 online next to an SO-100

  1. 1
    Power 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.

    bash
    ay-robots devices
  2. 2
    Calibrate the arm you will record with

    Guide the joints to the neutral pose, press Enter, then send it home to confirm the reference took.

    bash
    ay-robots calibrate
    ay-robots home
  3. 3
    Record 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.

    bash
    ay-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
  4. 4
    Upload, 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.

    bash
    ay-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

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.