The AY-Robots SO-100 hub page, the single-arm starting point for teleoperation, dataset recording and ACT training
ALOHABimanual manipulationACTTeleoperationLeRobotData collection

ALOHA and Bimanual Manipulation: What Two Arms Buy You

AY-Robots ResearchAugust 23, 202618 min read

ALOHA put four arms in a cage for under 20,000 USD and hit 96 percent on slotting a battery from 50 demonstrations. What the second arm buys, and what it costs you in data.

The task that made ALOHA famous is opening a translucent condiment cup. The right gripper tips the cup over and nudges it into the waiting left gripper, which closes and lifts; a right finger then slides under the lid and pries it open. There is no one-armed version: the thing holding cannot also be the thing prying.

That is the case for a second arm, and Zhao et al. (arXiv 2304.13705, April 2023) built the cheapest credible rig for it: two big arms, two small arms you hold, four webcams and a cage, under 20,000 USD. What follows: what the second arm buys, how the puppeteering interface works, what changed across three hardware generations, and what it costs your dataset budget.

The short version

  • Handovers, hold-and-act and objects heavier than one gripper's payload are impossible with one arm. Everything else is a convenience argument.
  • You teleoperate by backdriving a smaller leader arm with the same kinematics as the follower. Joint-space mapping, not inverse kinematics: a 6-DoF arm has no redundancy and IK fails near singularities.
  • The recorded action is the leader's joint position, not the follower's. The gap between them encodes applied force through the servo PID loop. Everything runs at 50 Hz, so a 12 second episode is 600 timesteps.
  • 50 demonstrations got 88 to 96 percent on the easy ALOHA tasks and 20 percent on the hard one. ALOHA Unleashed needed 8,658 to reach 75 percent on hanging a shirt.
  • AY-Robots is single-arm. It trains ACT, the ALOHA algorithm, but sells no two-arm cell. That limit is spelled out below.

What the second arm actually buys you

The lazy version says two arms are twice as fast. That is not it. The interesting cases are the ones a single arm cannot produce at all.

CategoryReal task from the papersWhy one arm cannot do it
Hold and actOpen a translucent condiment cup (84 percent)The cup is gripped while the lid is pried. A fixture works, but then you built a jig, not a robot.
Mid-air handoverCut tape, hand it to the other gripper, place it on a box (64 percent)No ground-truth position. It lands somewhere different every episode, so the policy learns a relationship between grippers, not a coordinate.
Combined payloadLift a 1.4 kg pot into a cabinet (Mobile ALOHA, 85 percent)1.4 kg exceeds one ViperX arm's 750 g limit but sits inside the combined payload of two.
Whole-body coordinationOpen a two-door cabinet while the base reversesBoth arms hold handles as the base backs off. Sequencing arm and base separately gives a worse trajectory.
Bimanual assemblyThread a velcro tie through its own 3 x 25 mm loop in mid-air (20 percent)Both ends held, neither on the table. Hardest task in the paper.

That last row matters more than the successes. ALOHA gets 96 percent on slotting a battery but 20 percent on threading velcro, degrading at every subtask: 92 percent to lift the tie, 40 percent to grasp the tail, 20 percent to insert. Two arms give you access to the task, not ease.

The puppeteering rig, and why joint-space mapping won

The part people copy is the interface, not the arms. Teleoperation happens by physically backdriving a smaller arm. The small arm is a WidowX 250, the big one a ViperX 300; they share a kinematic structure, so the small arm's joint angles go straight onto the big one. This is the leader-follower scheme; the original repository still calls the sides master and puppet in its symlinks.

The alternative was task-space mapping: track a VR controller, run IK, command the end effector pose. The paper gives concrete reasons it did not.

  1. Fine manipulation lives near singularities. The ViperX has 6 degrees of freedom and no redundancy, so off-the-shelf IK fails in exactly the configurations precise tasks need.
  2. The leader arm has mass. Its weight stops the operator moving too fast and damps hand vibration. A VR controller weighs nothing and shakes.
  3. Less computation means less latency in a loop running at 50 Hz.
  4. A 3D-printed handle and scissor mechanism gives continuous gripper control instead of a binary button.
  5. Rubber band load balancing cancels part of gravity on the leader side, which is what makes sessions longer than 30 minutes tolerable.
Leader-follower puppeteering as a data collection interface
Advantages
  • No IK, no operator-to-robot frame calibration, no singularity handling.
  • The operator feels the robot's joint limits, because the leader hits them too.
  • Action labels come free and are aligned in time with observations.
  • Non-experts get productive fast: ALOHA Unleashed ran 35 operators collecting 26,000 episodes unsupervised.
  • The paper claims assembly in under 2 hours by non-experts.
Trade-offs
  • Twice the arms. Four arms, four USB ports, four calibrations.
  • Only works when leader and follower share kinematics. No generalisation to a robot you have no scale model of.
  • Both hands are occupied, which is why Mobile ALOHA tethered the operator's waist to the base.
  • The leader arm is a consumable. Backdriving wears gears, which is what ALOHA 2 redesigned.
  • Gripper travel differs between leader and follower, so that channel needs normalisation, not a straight copy.
Record the leader, not the follower

The most copied mistake in ALOHA-style rigs. The action stored in the dataset is the leader joint position; the observation is the follower joint position. The paper is explicit about why: the difference between them implicitly encodes applied force, through the PID controller inside the servo. Log follower positions as actions and you have taught the policy to command where the arm already is. Training loss looks fine. The robot does nothing.

Three hardware generations, and what you can buy in 2026

ALOHA has been revised twice in public and the commercial version renamed. Check which generation an older tutorial describes: cameras, gripper and ROS version all changed.

ALOHA (Apr 2023)Mobile ALOHA (Jan 2024)ALOHA 2 (Feb 2024)
Arms2x ViperX 300 follower, 2x WidowX 250 leaderSame, leaders forward-facingSame, leaders with rail gripper
Cameras4x Logitech C922x, 480x6403x Logitech C922x, 480x6404x Intel RealSense D405, depth, global shutter
Gripper3D-printed scissor, PLA and acrylicSame as ALOHALinear rail, carbon fibre nylon, 2x follower force, 10x less leader force
BaseFixed cageAgileX Tracer AGV, 7,000 USD, 1.6 m/sFixed cage, 48 x 30 inch table
Action dimension1416 (14 arm plus base velocities)14

Two ALOHA 2 details are worth stealing even if you never buy the hardware. The leader gripper motors were swapped from XL430-W250-T to XC430-W150-T, a lower gear ratio with metal rather than plastic gears, purely to cut backdriving friction. And ALOHA's rubber bands were replaced with passive hanging retractors, benchmarked against an active system computing torques from a MuJoCo inverse dynamics model: the passive springs won, 1.38 versus 0.97 shapes inserted per minute across six operators.

Buying one in 2026 does not get you the arms in the paper. Trossen's current kits are branded Trossen AI, and both the Stationary AI and the Mobile AI ship two leader-follower WidowX AI arm pairs, where the published ALOHA paired WidowX 250 leaders with larger ViperX 300 followers. The older ALOHA Stationary and ALOHA Mobile product pages are still online alongside the new ones, so it is easy to read a spec sheet from one generation and a price from another. Prices move; the point of quoting them is the ratio.

OptionArmsCamerasIndicative costSource and date
ALOHA as published2x ViperX 300 follower, 2x WidowX 250 leader4x Logitech C922xunder 20,000 USDPaper, Apr 2023
Mobile ALOHA as publishedsame 4 arms, plus AgileX Tracer base3x Logitech C922x32,000 USDPaper, Jan 2024
Trossen Stationary AI2x WidowX AI leader-follower pairs4x RealSense D40523,995.95 USD, desk not includedVendor page, 24 Aug 2026
Trossen Mobile AI2x WidowX AI leader-follower pairs, plus base3x RealSense D40533,695.95 USD without laptop, 40,025.80 USD withVendor page, 24 Aug 2026
The USB topology trap that eats a day

The original README is blunt: at least six USB3 ports, four for arms and two for cameras, and no extension cables or USB hubs for the arms. Hubs are allowed for cameras, two per hub maximum. On top of that, ttyUSB numbers get reshuffled on reboot, so the repository binds each arm to a fixed udev symlink derived from its serial number. Build a four-arm rig on a laptop with two ports and a hub and you will spend a day chasing dropouts that look like software bugs. The single-arm version is on the camera-not-detected page.

What two arms do to your dataset

A bimanual rig does not double the data problem, it changes its shape in three places: action vector, camera count, sampling rate. ALOHA records at 50 Hz, higher than most single-arm imitation learning setups, and every timestep carries four synchronised frames. Real numbers from two ALOHA datasets in LeRobot v3.0 format on the Hub, read 24 August 2026:

Fieldlerobot/aloha_static_batterylerobot/aloha_mobile_cabinet
Episodes4985
Frames29,400127,500
Frames per episode600 (12 seconds)1,500 (30 seconds)
fps5050
Camerascam_high, cam_low, cam_left_wrist, cam_right_wristcam_high, cam_left_wrist, cam_right_wrist
Image shape480 x 640 x 3480 x 640 x 3
state / actionfloat32[14] / float32[14]float32[14] / float32[14], plus observation.effort
Repository sizeabout 791 MBabout 1,742 MB
python
# Read the real shapes of any LeRobot dataset without downloading it
import json, urllib.request

repo = "lerobot/aloha_static_battery"
url = f"https://huggingface.co/datasets/{repo}/resolve/main/meta/info.json"
info = json.load(urllib.request.urlopen(url))

print(info["codebase_version"], info["fps"], "fps")
print(info["total_episodes"], "episodes,", info["total_frames"], "frames")
for key, feat in info["features"].items():
    print(f"{key:38s} {feat['dtype']:8s} {feat.get('shape')}")
Check dimensionality before committing disk and GPU hours. Works on any repo id.

Sixteen megabytes per twelve-second episode sounds harmless until you scale it. Note also that this port of the mobile dataset carries a 14-dimensional action, not the 16 the paper describes: the base velocities are not in it. Check features yourself. Conventions are in the dataset docs, and the public dataset directory shows what real recordings look like.

The AY-Robots public dataset directory listing LeRobot-format datasets with episode counts
The public dataset directory. Every entry is single-arm, the honest picture of what this platform covers.

Recording a bimanual dataset with LeRobot

You do not need ViperX arms to try the idea. LeRobot 0.6.2 ships bi_so_follower and bi_so_leader, which compose two SO-100 class arms into one robot object. Left-arm observations get a left_ prefix, right-arm a right_ prefix, and top-level cameras stay unprefixed, so a shared overhead camera does not become left_top. The commands below come from docstrings in the current LeRobot source.

  1. 1
    Find four serial ports

    Run once per arm, unplugging it when prompted. All four paths go into every command below.

    bash
    lerobot-find-port
  2. 2
    Calibrate each arm

    Four arms, four calibration passes. LeRobot writes two files from the id you pass, one ending _left and one _right. Use a stable id or you recalibrate every session.

    bash
    lerobot-calibrate \
      --robot.type=bi_so_follower \
      --robot.left_arm_config.port=/dev/tty.usbmodem5A460822851 \
      --robot.right_arm_config.port=/dev/tty.usbmodem5A460814411 \
      --robot.id=bimanual_follower
  3. 3
    Teleoperate before recording anything

    Drive both followers and watch the streams. If a joint moves the wrong way or a wrist camera is mirrored, fix it now. Episodes with a broken mapping get deleted.

    bash
    lerobot-teleoperate \
      --robot.type=bi_so_follower \
      --robot.left_arm_config.port=/dev/tty.usbmodem5A460822851 \
      --robot.right_arm_config.port=/dev/tty.usbmodem5A460814411 \
      --robot.id=bimanual_follower \
      --robot.left_arm_config.cameras='{ wrist: {"type": "opencv", "index_or_path": 1, "width": 640, "height": 480, "fps": 30} }' \
      --robot.right_arm_config.cameras='{ wrist: {"type": "opencv", "index_or_path": 2, "width": 640, "height": 480, "fps": 30} }' \
      --teleop.type=bi_so_leader \
      --teleop.left_arm_config.port=/dev/tty.usbmodem5A460852721 \
      --teleop.right_arm_config.port=/dev/tty.usbmodem5A460819811 \
      --teleop.id=bimanual_leader \
      --display_data=true
  4. 4
    Record the handover

    Pick a task that needs both arms. The docstring uses a cube handover, the right instinct: if the task can be done one-handed, your dataset teaches the policy to ignore an arm.

    bash
    lerobot-record \
      --robot.type=bi_so_follower \
      --robot.left_arm_config.port=/dev/tty.usbmodem5A460822851 \
      --robot.right_arm_config.port=/dev/tty.usbmodem5A460814411 \
      --robot.id=bimanual_follower \
      --robot.left_arm_config.cameras='{ wrist: {"type": "opencv", "index_or_path": 1, "width": 640, "height": 480, "fps": 30}, top: {"type": "opencv", "index_or_path": 3, "width": 640, "height": 480, "fps": 30} }' \
      --robot.right_arm_config.cameras='{ wrist: {"type": "opencv", "index_or_path": 2, "width": 640, "height": 480, "fps": 30} }' \
      --teleop.type=bi_so_leader \
      --teleop.left_arm_config.port=/dev/tty.usbmodem5A460852721 \
      --teleop.right_arm_config.port=/dev/tty.usbmodem5A460819811 \
      --teleop.id=bimanual_leader \
      --dataset.repo_id=${HF_USER}/bimanual-so-handover-cube \
      --dataset.num_episodes=25 \
      --dataset.single_task="Grab and handover the red cube to the other arm" \
      --display_data=true
  5. 5
    Train ACT on it

    State and action are now 12-dimensional, six motors per SO-100 arm. ACT reads the shapes from the dataset. What it needs from you is episodes.

    bash
    lerobot-train \
      --dataset.repo_id=${HF_USER}/bimanual-so-handover-cube \
      --policy.type=act \
      --output_dir=outputs/train/act_bimanual \
      --job_name=act_bimanual \
      --policy.device=cuda
7.4 V, and nothing above it

Four arms means four times the chance of a wiring mistake. The Feetech STS3215 servos in the SO-100 and SO-101 run at 7.4 V. Feeding them 12 V destroys them, quietly enough that you may not notice until a joint drifts. Koch v1.1 runs Dynamixel servos on 5 V and 12 V rails and LeKiwi mixes a 7.4 V arm with a 12 V base, so a mixed bench is where power supplies get swapped. Label them.

The AY-Robots tutorial page for recording a first LeRobot dataset from a teleoperation session
The single-arm recording tutorial. Same episode discipline a bimanual rig needs, half the hardware.

How many demonstrations two arms actually need

The number everyone quotes is 50: fifty demonstrations, 10 minutes of data, 80 to 90 percent success. Real, and the best case from the easiest tasks. The picture across three papers is more useful.

TaskDemonstrationsSuccessSystem and method
Slot Battery5096 percentALOHA + ACT, 2023
Put On Shoe5092 percentALOHA + ACT, 2023
Slide Ziploc5088 percentALOHA + ACT, 2023
Thread Velcro10020 percentALOHA + ACT, 2023
Shirt Hanging, easy init8,65875 percentALOHA 2 + Diffusion Policy, 2024
Shoelace Tying, messy init5,13340 percentALOHA 2 + Diffusion Policy, 2024

Read the top and bottom together. Fifty demonstrations buys a well-posed, short-horizon task with a fixed object and fixed lighting. Tying a shoelace took over five thousand demonstrations from 35 operators across 10 robots in 2 buildings over 8 months, and still lands at 40 percent. Our data collection guide applies with more force here: a handover episode has two ways to go wrong.

Co-training is the one real shortcut

Mobile ALOHA's biggest wins came not from more in-domain data but from mixing in 825 static ALOHA episodes released through RT-X, sampled with equal probability against the mobile data, base actions zero-padded and the front camera dropped so both sources had three cameras. Whole-task success improved on 5 of 7 tasks, by 45, 20, 80, 95 and 80 points, reaching 95 percent on wiping wine and 85 percent on the cabinet from 50 demonstrations each. That is a manipulation prior transferring across a morphology change, the same idea behind Open X-Embodiment.

Do it yourself, or do it here

A real ALOHA cell means the Interbotix ROS 2 stack, the maintained descendant of the original ROS 1 repository. It targets Humble and pins DT to 0.02 seconds and FPS to 50.

bash
source /opt/ros/humble/setup.bash
source ~/interbotix_ws/install/setup.bash

# Bring up all arms and cameras
ros2 launch aloha aloha_bringup.launch.py

# Teleoperate both sides
python3 ~/interbotix_ws/src/aloha/scripts/dual_side_teleop.py

# Record one episode, optionally with leader gravity compensation
python3 ~/interbotix_ws/src/aloha/scripts/record_episodes.py \
  --task_name my_task --episode_idx 0 --gravity_compensation

# Or loop it
./scripts/auto_record.sh my_task 50
Commands and flags from the Interbotix/aloha scripts directory.
  • Set INTERBOTIX_ALOHA_IS_MOBILE to false for a stationary cell. It defaults to true.
  • -b / --enable_base_torque keeps the mobile base torqued so a joystick can drive it during recording.
  • -g / --gravity_compensation enables leader gravity compensation at teleop start. Data lands in ~/aloha_data.
  • Leader gripper travel is 0.0185 to 0.0323, follower 0.0440 to 0.0579, so constants.py normalises rather than copying the value across.

You own the GPU, four USB ports, the udev rules and four calibrations. In exchange you get the only setup on this page that can do a mid-air handover.

ACT: what the paper says and what the code does

ACT is the second half of ALOHA and travels further than the hardware. The idea is action chunking: instead of one action per observation, the policy predicts the next k target joint positions and executes them as a unit, dividing the effective horizon by k. The ablation is the strongest number in the paper: success rises from 1 percent at k = 1 to 44 percent at k = 100, then tapers at k = 200 and 400. The LeRobot implementation deviates from the paper in two documented places.

SettingALOHA paper (2023)LeRobot 0.6.2AY-Robots trainer default
Chunk size k100chunk_size 100chunkSize 100
Executed steps per chunkk, or 1 with temporal ensemblingn_action_steps 100nActionSteps 100
Learning rate1e-5optimizer_lr 1e-51e-5
Batch size88 recommended in the docs8
Decoder layers7n_decoder_layers 1not exposed
Temporal ensemblingused, plus 3.3 percent for ACTtemporal_ensemble_coeff None, so offnot exposed

The decoder row is not a typo. LeRobot's config points at issue 25 on the original ACT repository: the reference declares 7 decoder layers, but the action head reads only the first decoder output, so LeRobot sets 1 to match real behaviour. The ensembling row matters too: the paper measured a 3.3 percent gain, and LeRobot leaves it off because it requires n_action_steps of 1, which multiplies your inference latency by the chunk size. If a tutorial promises paper-matching results, check whether it turned ensembling on.

The AY-Robots policy comparison table: parameters, GPU tier, latency and minimum episodes for the five trainable policies
ACT sits at the bottom of this table on size and latency: 80 M parameters and 20 ms per action step, against 152 ms for GR00T N1.7 and 485 ms for Pi0.5.

That latency column is why ACT is still relevant three years on. A 50 Hz loop is a 20 ms budget per step. ACT fits it; a 485 ms model does not. ACT against SmolVLA is the closest comparison, and the arena has 332 benchmark results across 85 models, each linked to its source.

Where this does not transfer

Four honest limits, because bimanual attracts more enthusiasm than it deserves at the hobby end.

  • Remote inference will not work for this. ALOHA's loop is 50 Hz. Public-internet round trips add tens to hundreds of milliseconds and turn a working policy into a hesitant one. Cloud inference suits slow pick-and-place, not a mid-air handover.
  • A bimanual policy is not two single-arm policies. The action space is joint, cameras are shared, and the interesting behaviour lives in the correlation between arms. Two independent policies give you two arms that ignore each other.
  • The SO-100 is not a ViperX. A ViperX has 750 g payload, 1 mm repeatability and 5 to 8 mm accuracy, and the ALOHA authors themselves call the hardware imprecise. An SO-100 pair will do a cube handover, not velcro threading.
  • This platform is single-arm. Teleoperation, recording, training and inference all target one arm. For bimanual, LeRobot's bi_so_follower is the path, and you run it yourself.

None of that argues against trying, only for choosing the task honestly first. If it needs a handover, build two arms. If not, the SO-100 setup guide and the first-policy tutorial get you a working single-arm fine-tune cheaply, and a policy that only works in one setup is a known failure mode, not a hardware problem.

Train ACT on one arm before you buy four

ACT is the ALOHA algorithm and it is the cheapest policy on the platform to train: 80 M parameters, 20 ms per action step, any 24 GB card. The guides carry the exact defaults the trainer sends for each model and arm.

Find your model and arm

Questions people actually ask

What does ALOHA stand for?

A Low-cost Open-source Hardware System for Bimanual Teleoperation: two ViperX 300 followers, two smaller WidowX 250 leaders the operator backdrives by hand, four cameras and an aluminium cage. Published April 2023, under 20,000 USD.

Can I build a bimanual setup with SO-100 arms instead of ViperX?

Yes. LeRobot 0.6.2 ships bi_so_follower and bi_so_leader, composing two SO-100 or SO-101 arms into one robot with left_ and right_ prefixed observations. Four arms cost roughly four times the 110 to 150 EUR per-arm parts figure. You give up payload, repeatability and the RealSense cameras.

Is ACT still the right policy for a bimanual rig in 2026?

For a 50 Hz loop, yes, because of latency. ACT is about 80 M parameters and 20 ms per action step, inside a 20 ms budget; larger VLA models run 152 to 485 ms per step here. ALOHA Unleashed swapped ACT for a 217 M parameter Diffusion Policy at 0.043 s inference on an RTX 4090, executing 50-step chunks open loop to stay above 50 Hz.

How many demonstrations should I plan for?

Fifty for a short, well-posed task with a fixed object and fixed lighting, which is what the original ALOHA tasks used and what the AY-Robots trainer sets as the ACT minimum. For long-horizon or deformable-object tasks, thousands: ALOHA Unleashed used 8,658 for shirt hanging and reached 75 percent.

Why is the recorded action the leader position, not the follower position?

Because the difference between them encodes applied force through the servo's internal PID controller. Recording follower positions as actions throws that away and trains the policy to command the state it is already in. The ALOHA paper says so explicitly, and it is the most common way to ruin a bimanual dataset before training starts.

Ready for high-quality robotics data?

AY-Robots connects your robots to skilled operators worldwide.

Get Started