The AY-Robots SO-100 hub page, showing the reference SO-100 arm used for teleoperation and dataset recording
GELLOLeader armTeleoperationSO-101Data collectionLeRobot

GELLO and Low-Cost Leader Arms: What a Teleoperation Rig Costs

AY-Robots ResearchAugust 23, 202619 min read

GELLO's bill of materials is under 300 USD, an SO-101 leader adds about 108 USD to a follower arm. What each design buys you, and how the leader you pick changes your data.

The cheapest part of a data collection rig is the part that decides how good the data is. On an SO-100 setup the leader arm is a second, slightly different copy of the follower, sitting on the desk next to it. The SO-ARM100 bill of materials puts numbers on the split: two arms come to 229.88 USD, a single follower to 121.94 USD. The leader is roughly 108 USD of a 230 USD rig, and it is the only part your hand ever touches.

GELLO, from UC Berkeley, made the same idea explicit for arms costing thousands: a bill of materials under 300 USD that drives a Franka, a UR5 or an xArm7. This article covers what a leader arm is mechanically, what the GELLO study measured, what every cheap leader in the LeRobot ecosystem costs, and what changes inside your recorded episodes when you swap a pad for a leader.

What you need to know

  • The GELLO paper (arXiv 2309.13037, v2 revised 18 July 2024) puts its bill of materials under 300 USD, against 150 for a 3D SpaceNavigator and 300 for a Meta Quest 2.
  • In a 12-participant study on a bimanual two-UR5 station across 5 tasks, GELLO averaged 0.92 success against 0.72 for VR and 0.63 for 3D mice, with the fewest timeouts.
  • An SO-101 leader costs about 108 USD on top of a 121.94 USD follower: the same STS3215 servos in three gear ratios. On the SO-100 the leader was a second follower with the gears pulled out of all six motors.
  • ALOHA set the rule that still matters: the action stored in the dataset is the leader joint position, not the follower position. The gap between them encodes force.
  • None of these leader arms give force feedback. GELLO calls that a deliberate cost compromise, not an oversight.

What GELLO is, and what its study measured

GELLO is a general framework for building low-cost, intuitive teleoperation systems, and the idea is one sentence long: build a miniature, kinematically equivalent copy of the target arm from 3D printed links and off-the-shelf servos, read its joint angles, and send them to the real arm as joint commands. The paper is by Philipp Wu, Yide Shentu, Zhongke Yi, Xingyu Lin and Pieter Abbeel, posted 22 September 2023 and revised 18 July 2024.

The reason it exists is the cost table below. Before GELLO, joint-space teleoperation meant a second industrial arm or a haptic device, and the hobby-priced alternatives work in end-effector space, hiding the arm kinematics from you.

Teleoperation deviceApproximate cost as listed in the GELLO paper
3D mouse (SpaceNavigator)150 USD
GELLO300 USD
VR (Meta Quest 2)300 USD
Robot-to-robot teleoperation (for example a second UR5)30,000 USD
Haptic device (Omega 7)40,000 USD

The study used two UR5 arms and five tasks: place a hat on a rack, open a case and fetch a sleeping mask, hand a banana across the workspace, fold a towel, plug in a USB cable. Twelve volunteers, none professionally trained, ran all five on all three devices in randomised order.

DeviceHatMaskBananaTowelUSBAverage
GELLO0.920.921.00.920.830.92
3D mice0.750.580.670.580.580.63
VR0.920.830.750.580.50.72

For imitation learning data the failure breakdown matters more, because each of these is an episode you throw away.

  • Timeout, aggregated over all five tasks: GELLO 1, 3D mice 9, VR 5.
  • Self collision (follower hitting itself or the other follower): GELLO 1, 3D mice 5, VR 5.
  • Environment collision: GELLO 3, 3D mice 6, VR 6.
  • Other irrecoverable failures, such as dropping the object out of reach: GELLO 0, 3D mice 2, VR 1.
What the study does and does not show

Each participant got a 6-minute orientation, then 5 minutes of practice per device, with a 45 second limit on the hat task and 90 seconds on the other four. The authors are explicit that this measures beginners and leave trained operators to future work. Read it as how fast a new operator becomes useful, the question if you are building a data collection team.

The three design decisions inside every leader arm

1. The servo is there for its encoder, not its torque

GELLO uses the DYNAMIXEL XL330-M288-T: a 288.4:1 gear ratio, a 12-bit contactless absolute encoder at 4096 pulses per revolution, 0.52 N.m stall torque at 5.0 V, 18 g, and a 3.7 to 6.0 V input range. 4096 counts over 360 degrees is about 0.088 degrees per step, and the paper quotes joint measurements within 0.088 of a mechanical degree.

They picked the highest gear ratio in the family, and not for torque: the motor is never commanded to move. The reduction provides resistance when the operator backdrives it, which the paper calls natural damping that improves stability. A servo is not strictly necessary, the authors note, since only positions are read, but it packages an encoder, a bus protocol and a housing. The Koch v1.1 leader uses the XL330-M077-T at 77.5:1 and 0.215 N.m at 5.0 V: less reduction, lighter feel, less damping.

2. Scale: alpha equals 0.5

GELLO takes the Denavit-Hartenberg parameters of the target arm and scales the link lengths by alpha, noting the optimal value is user and robot dependent and using 0.5. Joint positions are read off the device and sent through as joint commands, with ZMQ between processes. That is the whole control stack: no inverse kinematics, and half size keeps the device portable across the arm's full degrees of freedom.

3. Joint regularization: rubber bands

A passive servo arm cannot hold itself up, so gravity drags the elbow into configurations that are kinematically legal and practically useless, sometimes into the table. GELLO adds rubber bands or springs on the joints that resist gravity hardest, the second and third on the UR design. The paper measured it: without regularization, holding the device stationary takes a roughly constant 1.9 N at every height. With the bands, the restoring force is lower near the table and higher far from it, pushing the operator away from singularities.

ALOHA solved it the same way: an off-the-shelf WidowX with a 3D printed handle-and-scissor mechanism that cuts the force needed to backdrive the motor, plus a rubber band load balancing mechanism against gravity. The stated reason is endurance, making sessions longer than 30 minutes possible.

The family of cheap leader arms, with real prices

Every leader design that publishes a bill of materials, at the cost each project states in its own currency and at its own date. Supplier prices move, so treat these as published figures, not quotes.

Leader designActuatorsPublished costDrivesSource
GELLO3D printed links, DYNAMIXEL XL330-M288-Tunder 300 USDFranka, UR5, xArm7 in the paper; the repo now lists 7 robot types including YAM, Lite6, AR4 and FR3GELLO paper and gello_mechanical
SO-101 leader6x Feetech STS3215 at 7.4 V, three gear ratiosabout 108 USD (229.88 for two arms minus 121.94 for one)SO-100 and SO-101 followersSO-ARM100 README
SO-100 leader6x Feetech STS3215 at 7.4 V, gears removedabout 109 USD (232 for two arms minus 123 for one)SO-100 followerSO100.md in the same repo
Koch v1.1 leader6x DYNAMIXEL XL330-M077-T199 USD (follower listed at 278 USD)Koch v1.1 followerkoch-v1-1 repo
ALOHA leaderWidowX 6-DoF, bought off the shelf3,300 USD per leaderViperX 6-DoF follower at about 5,600 USDALOHA paper (arXiv 2304.13705)
U-ARM3D printed, three structural configurations50.50 USD for 6-DoF, 56.80 USD for 7-DoFmost commercial arms, via three joint topologiesU-ARM paper (arXiv 2509.02437)

The spread between the cheapest leader and the ALOHA leader is a factor of 65, and the cheap end is not obviously worse: U-ARM reports 39 percent higher data collection efficiency than Joycon at comparable success rates. ALOHA is also the system that produced the ACT policy and action chunking, on a rig its authors put at 18,000 USD, or 20,000 with optional add-ons. Cheap leader arms are not a later compromise; ALOHA was itself the cheap option in 2023.

Voltage kills STS3215 servos

The SO-ARM100 README is blunt: the leader arm is always 7.4 V on the SO-101. Follower servos exist in a 7.4 V version (16.5 kg.cm stall at 6 V) and a 12 V version (30 kg.cm) needing a 12 V 5 A supply instead of the 5 V one. Feeding 12 V to a 7.4 V STS3215 destroys it, and it will not be obvious which of the six died until you read the bus. The Koch v1.1 runs 5 V and 12 V rails on one robot, the same trap in a different shape. Silent joint: servo not responding.

Why the SO-100 leader has its gears removed and the SO-101 does not

This is the same problem GELLO solved with rubber bands. The SO-100 two-arm bill of materials is twelve identical STS3215 servos: the leader is literally a second follower. The follower needs its reduction to hold its own weight; the leader holds nothing and has to be light in the hand. So the official LeRobot assembly page has you remove the gear from all six leader motors before you build the arm, leaving, as it puts it, only the position encoding of the motor and less friction.

The SO-101 replaced that surgery with three factory gear ratios, which is why its README calls the arm easier to assemble with no gear removal. The LeRobot SO-101 page states the follower uses 1/345 gearing throughout, and publishes the leader assignment.

Leader-arm axisMotor idGear ratio
Base / shoulder pan11 / 191
Shoulder lift21 / 345
Elbow flex31 / 191
Wrist flex41 / 147
Wrist roll51 / 147
Gripper61 / 147

Shoulder lift keeps the full 1/345 reduction because it carries the whole arm against gravity. The wrist joints carry almost nothing and get the lowest reduction, so they feel light where the fine motion happens. That is GELLO's joint regularization argument solved in the parts list instead of with elastics, and the README sells all six as a bundle: three 1/147 (C046), two 1/191 (C044), one 1/345 (C001). For a new build the leader is the strongest argument for the SO-101; the SO-100 against SO-101 comparison covers the rest.

The AY-Robots SO-100 hub page, the entry point for building, calibrating and teleoperating an SO-100 arm
The SO-100 hub. The leader arm never appears in the product photos, and it decides how operators feel after an hour.

Building and driving a leader arm: the actual commands

These are the current commands from the SO-101 and imitation learning pages of the LeRobot documentation. LeRobot ships hyphenated console scripts (lerobot-teleoperate), and the old python lerobot/scripts/control_robot.py path no longer exists in the repository, so older tutorials will not run against current main.

  1. 1
    Install LeRobot with the Feetech SDK

    The extra pulls in feetech-servo-sdk. Without it the SO classes import but cannot open the bus.

    bash
    pip install -e ".[feetech]"
  2. 2
    Find the two serial ports

    Unplug the arm when prompted and it reports which port disappeared. Repeat for the second arm.

    bash
    lerobot-find-port
    
    # Linux only, if the port exists but cannot be opened:
    sudo chmod 666 /dev/ttyACM0
    sudo chmod 666 /dev/ttyACM1
  3. 3
    Write ids and baud rates into the leader motors

    Brand new motors usually come with a default id of 1, so they cannot share a bus until each has its own. Connect them one at a time, gripper (id 6) back to shoulder pan (id 1). Once per arm, ever.

    bash
    lerobot-setup-motors \
        --teleop.type=so101_leader \
        --teleop.port=/dev/tty.usbmodem575E0031751
  4. 4
    Calibrate both arms

    Move the arm to the middle of every joint range and press Enter, setting the homing offsets, then sweep each joint through its whole range. Wrist roll is the exception: a full-turn joint fixed at 0 to 4095 rather than recorded. The id names the calibration file and must match on every later command.

    bash
    lerobot-calibrate \
        --teleop.type=so101_leader \
        --teleop.port=/dev/tty.usbmodem575E0031751 \
        --teleop.id=my_awesome_leader_arm
    
    lerobot-calibrate \
        --robot.type=so101_follower \
        --robot.port=/dev/tty.usbmodem585A0076841 \
        --robot.id=my_awesome_follower_arm
  5. 5
    Teleoperate, with the camera streams on screen

    If the follower mirrors the leader and the gripper tracks the trigger, the rig is done. --display_data=true opens a rerun window with camera feeds and joint traces, the cheapest camera placement check you will run.

    bash
    lerobot-teleoperate \
        --robot.type=so101_follower \
        --robot.port=/dev/tty.usbmodem585A0076841 \
        --robot.id=my_awesome_follower_arm \
        --robot.cameras="{front: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30}}" \
        --teleop.type=so101_leader \
        --teleop.port=/dev/tty.usbmodem575E0031751 \
        --teleop.id=my_awesome_leader_arm \
        --display_data=true
  6. 6
    Record a dataset

    Same command with a dataset attached. Right arrow or n ends an episode early, left arrow or r re-records it, Escape or q stops and encodes.

    bash
    lerobot-record \
        --robot.type=so101_follower \
        --robot.port=/dev/tty.usbmodem585A0076841 \
        --robot.id=my_awesome_follower_arm \
        --robot.cameras="{ front: {type: opencv, index_or_path: 0, width: 1920, height: 1080, fps: 30}}" \
        --teleop.type=so101_leader \
        --teleop.port=/dev/tty.usbmodem575E0031751 \
        --teleop.id=my_awesome_leader_arm \
        --display_data=true \
        --dataset.repo_id=${HF_USER}/record-test \
        --dataset.num_episodes=5 \
        --dataset.single_task="Grab the black cube"
The trap that eats a day

The sweep. Calibration stores the minimum and maximum raw position it sees while you move each joint, and those become the normalisation range. A half-hearted sweep leaves the leader with a smaller usable range than the follower, so the follower appears to stop early with nothing mechanically wrong, and nothing warns you: a short range is a legal range. Measure instead of guessing with lerobot-find-joint-limits, which drives the follower from the leader for --teleop_time_s seconds and prints the ranges it saw. Then joint stops early. The id. --teleop.id and --robot.id name the JSON file the calibration lives in. Mistype one character and LeRobot finds no file under that id and drops you into a fresh calibration at the top of the run.

Corrupted packets are normal, and LeRobot expects them

The SO leader configuration carries num_read_retries, default 2, and the source comment explains why: a Feetech bus occasionally returns a corrupted status packet, especially when several joints move at once, which would otherwise abort the teleoperation loop mid-episode. A session that dies exactly when you make a fast multi-joint move is the bus, not the arm. One that dies before it starts is arm not detected.

What the leader arm actually changes in your recorded data

This is the part that gets skipped, and the reason a leader arm is worth 108 USD. The ALOHA paper states the rule directly: the joint positions recorded as the action are the leader positions, the human input, not the follower positions. The observation is the follower positions plus the camera feeds. Using leader positions matters, the authors say, because the force applied is implicitly defined by the difference between commanded and actual position, through the controller inside the servo.

Read that twice if you are training a policy that has to press, insert or hold something. Record the follower position and the action equals what happened, so the force signal collapses to nothing. Record the leader position and the action is what the human asked for, with the residual carrying how hard. A pad has no such residual, because no second arm is being backdriven by a wrist. Same task, same success rate, different LeRobot dataset.

A leader arm against a pad, a keyboard or a VR controller
Advantages
  • Joint-space mapping means no IK failures near singularities. ALOHA notes off-the-shelf IK fails frequently on a non-redundant 6-DoF arm.
  • You feel joint limits in your hand instead of finding them in the log afterwards.
  • The action stream carries an implicit force signal a pad cannot produce.
  • Measured by GELLO: 0.92 average success against 0.72 for VR and 0.63 for 3D mice, 1 timeout against 5 and 9, and faster completion times.
Trade-offs
  • No force feedback in any of these designs, which limits contact-rich work.
  • One more arm to assemble, wire and keep calibrated, plus a serial port and power supply.
  • A leader is per-embodiment. A GELLO built for a Franka does not drive an SO-100, and on a LeKiwi it drives only the arm: LeRobot steers the base from the keyboard.
  • Passive servos are dragged down by gravity: you pay with rubber bands, gearing, or a tired forearm.

Recording defaults that decide your throughput

The other half of data quality is good episodes per hour. The current LeRobot recording defaults:

FlagDefaultWhat it means in practice
--dataset.fps30Frames and actions per second stored. ALOHA recorded at 50 Hz.
--dataset.episode_time_s60Recording window per episode; the right arrow ends it early.
--dataset.reset_time_s60Time to put the scene back before the next episode.
--dataset.num_episodes50Episodes recorded in one invocation.
--dataset.videotrueCamera frames are encoded to video rather than left as PNGs.
--dataset.push_to_hubtrueUploaded when the session ends. Set false to keep it local.
--dataset.no_stampfalseBy default a new recording appends a date-time tag to your repo id, so the name you typed is not the name you get.

At those defaults a 50 episode dataset is 100 minutes of wall clock at best, which is why the GELLO timeout counts matter: nine timeouts is nine wasted reset cycles. lerobot-record also refuses to start without a teleoperator, pointing you at lerobot-rollout instead. Recording is defined as a human driving something.

How many you need depends on the model. Here SmolVLA has the lowest floor at 30 episodes, while ACT, GR00T N1.7 and Pi0.5 want at least 50; the rest is on the policies comparison and in how to collect high-quality VLA training data.

The AY-Robots desktop client download page, the client that records LeRobot-format datasets from a teleoperation session
The desktop client records LeRobot-format datasets out of a teleoperation session, whichever device drives the follower.

Two ways to get from a leader arm to a trained policy

You own the whole chain. Buy the six leader servos in the right gear ratios, print the leader-specific parts (Handle, Trigger and Wrist_Roll are the only STLs that differ from the follower), assemble, set the ids, calibrate, record locally.

  • About 108 USD of servos and boards on top of a follower you own, plus filament and an afternoon.
  • The raw dataset sits under ~/.cache/huggingface/lerobot/{repo-id} before upload.
  • Training is a separate problem: your own GPU, a rented one, or Hugging Face Jobs via lerobot-train --job.target.
  • Nothing is proprietary: the STLs, the BOM and the CLI are all open.
bash
lerobot-record \
    --robot.type=so101_follower \
    --robot.port=/dev/tty.usbmodem585A0076841 \
    --robot.id=my_awesome_follower_arm \
    --teleop.type=so101_leader \
    --teleop.port=/dev/tty.usbmodem575E0031751 \
    --teleop.id=my_awesome_leader_arm \
    --dataset.repo_id=${HF_USER}/so101-cube \
    --dataset.num_episodes=50 \
    --dataset.single_task="Grab the black cube"
Fifty episodes, the minimum for ACT, GR00T N1.7 or Pi0.5.
The AY-Robots teleoperator page, showing an SO-100 arm and the invitation to become a robot operator from anywhere in the world
A leader arm anchors the human to one desk next to the follower, the constraint remote operator work is trying to escape.

Where a leader arm does not help

Four honest limits, because the first three cost people weeks.

  • No force feedback, in any design in the table above. GELLO says its motor torque is too low for it, and that bilateral operation would also need force sensing on the target robot. You can watch the gripper deform the object on camera, but your hand does not know.
  • Distance. A leader arm works because your wrist is coupled to a device next to the follower; put a network in between and the coupling is gone. Same physics as remote inference here: the control loop is 20 to 485 ms per action step depending on the model, and public-internet round trips on top turn a working policy into a hesitant one. Viable for slow pick and place, not fast reactive motion. See inference latency.
  • It does not fix the scene. A perfect leader arm with one badly placed camera produces a policy that fails exactly like a pad-recorded one. The failure mode pages exist because most bad policies are bad data, and most bad data is upstream of the input device.
  • GELLO is not for the SO-100. gello_mechanical lists Franka FER, UR5, xArm7, YAM, Lite6, AR4, FR3 and FR3 Duo, and no SO configuration; its bill of materials lives in a Google Doc rather than the repo. If you own an SO-100 your leader is the SO-101 leader, and GELLO is the paper explaining why it is shaped that way.

GELLO is a design pattern first and a set of STLs second; the SO-101 leader, the Koch v1.1 leader and U-ARM are all instances of it. For wider context, the SO-100 complete guide runs assembly through training, and the RoboTurk article covers scaling to many remote humans, the problem a physical leader cannot solve. Here, record your first dataset and the teleoperation docs are the shortest path, and the dataset directory shows what other people's episodes look like.

Can I use GELLO with an SO-100 or SO-101?

Not directly. gello_mechanical publishes configurations for Franka FER, UR5, xArm7, YAM, Lite6, AR4, FR3 and FR3 Duo, and none for the SO series. The equivalent device for an SO follower is the SO-101 leader arm, which applies the same design ideas with Feetech servos instead of Dynamixel ones.

Is a second SO-100 a usable leader arm?

Only after modification. The SO-100 two-arm bill of materials is twelve identical STS3215 servos, and the official LeRobot assembly instructions tell you to remove the gear from all six leader motors so only the position encoder remains and the arm is light enough to backdrive. The SO-101 avoids that with three factory gear ratios.

How much does a leader arm add to an SO-100 rig?

From the SO-ARM100 repository: a follower arm is 121.94 USD and a leader plus follower set is 229.88 USD, so the leader is about 108 USD including its control board, power supply and clamps. The older SO-100 figures are 123 and 232 USD. On this platform an SO-100 parts build is listed at roughly 110 to 150 EUR, an SO-101 at 130 to 170 EUR.

Does the leader arm change what gets stored in the dataset?

Yes, and it is the main technical reason to have one. Following ALOHA, the action recorded is the leader joint position while the observation is the follower position plus the camera images. The difference between commanded and actual position is what the servo controller turns into force, so leader positions preserve a force signal a pad cannot generate.

Record LeRobot datasets from your own leader arm

The desktop client records episodes, camera streams and joint states in LeRobot format from a teleoperation session, whether you drive with an SO-101 leader, a Koch leader or the on-screen pad.

Get the desktop client

Ready for high-quality robotics data?

AY-Robots connects your robots to skilled operators worldwide.

Get Started