Every joint responds and the arm moves normally, but the gripper does not open or close. It may also be loose enough to push by hand while the other five joints hold their positions.
- SO-100
- SO-101
- LeKiwi
The gripper is the last servo on the chain and the one whose cable flexes most, so a connector that is nearly but not quite seated is the first thing to rule out. Work in a fixed order: does a scan see it at all, does it have torque, and is its calibration sane. Each of those three answers eliminates a whole class of causes, and only the last one requires a recalibration.
Three questions, in this order
The reason to fix the order is that each question is cheaper than the one after it and rules out more. A scan costs seconds and tells you whether the joint is on the bus at all. A torque check costs one push with your hand. Only if both pass does calibration become worth examining, and only then is recalibrating a reasonable use of your time.
| Check | Result | What it means | Next |
|---|---|---|---|
| ay-robots devices | Five servos responding | The gripper is off the bus entirely | Reseat and then swap the last cable |
| ay-robots devices | Six servos responding | Wiring is fine, so this is torque or calibration | Go to the torque check |
| Push the jaws by hand, power on | They move freely while other joints resist | Torque is off on this joint alone | Home the arm, then drive it from the client |
| Push the jaws by hand, power on | They hold firmly | Torque is on, so the commands are the problem | Examine the calibrated range |
| Command open, then closed | Motion is backwards | Open and closed positions are inverted | Recalibrate |
| Command open, then closed | Nothing moves, the servo hums | Commanded position is outside the range, or the jaws are jammed | Clear the jaws, then recalibrate |
| Command open, then closed | It moves a little and gives up | Stall current, usually a marginal supply | Check the supply before anything else |
ay-robots devices
# SERIAL PORTS
# /dev/ttyACM0 SO-100 (5 servos responding)
# id 1 ok
# id 2 ok
# id 3 ok
# id 4 ok
# id 5 ok
# id 6 no replyWhy it is the gripper and not joint 3
Three things stack up against this particular joint. It sits at the end of a daisy chain, so it is downstream of every other connector on the arm and inherits every one of their failure modes. Its cable runs the full length of the arm and flexes on every wrist rotation, which is mechanical fatigue applied to the one component nobody inspects. And it is physically closest to whatever the arm bumps into, because bumping into things is what the business end does.
The pattern of the failure supports the same conclusion. A break anywhere earlier in the chain would take the wrist with it, so a gripper missing on its own can only be the last link. That narrows the physical search to two connectors and one cable, and reseating them is a thirty second job with the power off.
The ordered diagnosis
- 1Scan and count
Six responding or five. This single number decides whether the next half hour is about wiring or about software.
bashay-robots devices - 2Power off, reseat the last cable at both ends
Unplug both connectors, look at the pins for anything bent or pushed back, push them home firmly, power up and rescan. This resolves the majority of cases and costs nothing.
- 3Swap the last cable for a proven one
Take a cable from a link that currently works and use it for the gripper. If the count goes to six, the old cable was the fault. If the fault follows the cable to its new position, the same conclusion arrives from the other direction.
- 4Put the gripper servo alone on the controller
If it answers by itself on a known-good cable, the servo is healthy and everything remaining is wiring or addressing. If it stays silent alone, check its ID and its baud rate before you write it off, especially if it is a replacement unit.
- 5Check torque with your hand
With the arm powered and holding a pose, push the jaws gently. The other joints resist you; if the gripper does not, torque is disabled on that joint alone. Homing the arm re-establishes a commanded pose for every joint, which is the quickest way to bring a single relaxed joint back under control.
bashay-robots home - 6Clear the jaws and look for a mechanical jam
Something wedged in the mechanism, a screw that has worked loose, or a jaw that has shifted on its mount all produce a servo that hums and does not move. Fix this before recalibrating, because calibrating around a jam bakes the jam into the reference.
- 7Recalibrate and verify open and closed
Only now. Guide the joints to neutral, capture the reference, then command fully open and fully closed and watch that both are reached and that they are not swapped.
bashay-robots calibrate - 8Replace the servo last
A servo that is silent alone, on a proven cable, with a unique ID at the right baud rate, has earned it. Recalibrate afterward, because a new unit has a different zero point.
Closing on something rigid is the highest current moment in an ordinary task, so a supply that is only just adequate cuts torque at the gripper before anywhere else. If the gripper starts to close and then gives up while the rest of the arm behaves, look at power. And while you are handling supplies: STS3215 servos are 7.4 V parts, and a 12 V brick destroys all six in seconds with no recovery.
If you record while the gripper is not responding, its action column never changes, and nothing in the pipeline objects. The dataset trains, and the resulting policy approaches objects competently and never closes on them. Confirm six responding servos before a recording session rather than after it.
Calibration that is technically valid and practically wrong
A gripper can be on the bus, torqued, and still useless if its stored range does not match the mechanism. Two variants come up. In the first, open and closed are inverted, so every command does the opposite of what you meant and a grasp releases at exactly the wrong moment. In the second, the stored range is wider than the mechanism, so the commanded closed position is past where the jaws physically meet, and the servo pushes against its own hardware until it stalls.
Both are fixed by recalibrating with the jaws clear and the mechanism free, and both are worth checking with a deliberate open and close before you record anything. Note that calibration captures the whole arm at once, so a gripper recalibration also assigns new zero points to the other five joints, which makes it a boundary in your dataset history rather than a local repair. The full procedure is on /learn/so-100-getting-started.
When it is the policy and not the arm
There is a version of this complaint where the hardware is entirely fine. If you can open and close the gripper from the client, the arm is not the problem and the search moves to the data or the run. The usual cause is a dataset in which the gripper column barely varies, either because it was broken during recording or because the demonstrations closed it at almost the same moment every time from almost the same pose. A policy trained on that has nothing to learn about when to close.
Before blaming the model, run a base model on the arm as a smoke test. It confirms that the whole path from policy to servo works on your machine, without involving your checkpoint at all.
# Smoke test: base model, no checkpoint, local execution
ay-robots run --model act --task "pick up the red cube and place it in the bowl"
# Then your own checkpoint from the run page
ay-robots run \
--model act \
--checkpoint <job-id>:100000 \
--task "pick up the red cube and place it in the bowl"
ay-robots stopFrom there the question is a training question rather than a hardware one: whether the gripper signal in your episodes carries enough variation to learn from, and whether the run was long enough to pick it up. That is covered on /train/act-on-so-100 for the fast, task-specific model and on /train/smolvla-on-so-100 if you are working with the language-conditioned one. If you want to see what a healthy gripper looks like under teleoperation before you decide, /live gives you a working SO-100 in the browser with no signup and no hardware of your own involved.
Frequently asked questions
The gripper buzzes but does not move. What is that?▾
A stall. Either the jaws are physically obstructed, or the commanded position is past where they can go, or the supply cannot deliver the current the servo is asking for. Clear the jaws first, then check the calibrated range, then look at power.
Can I keep working with a broken gripper servo?▾
For driving the arm around, yes. For recording, no: the missing joint produces a column that never changes, and any policy trained on that dataset will never close. Fix it before the session, not after.
Can I test with a servo from another joint?▾
Electrically yes, and it is a decisive test of whether the servo or the wiring is at fault. Check the part number printed on both servos before swapping, put everything back afterward, and recalibrate, because you have just changed two zero points.
Do I have to recalibrate the whole arm to fix the gripper?▾
Yes, calibration is a whole-arm pass. Treat it as a line in your dataset history: recordings made before and after belong to different references and should not be mixed into one dataset.
It worked yesterday and nothing changed. How?▾
Connector fatigue does not announce itself. A contact that has been marginal for weeks finally stops making, usually after a session with a lot of wrist rotation. Reseat before you theorize.
The scan shows six servos but the gripper is limp only sometimes.▾
Intermittent contact on the last link, or a supply that sags at the moment the gripper closes. Reseat the cable first, then repeat a closing motion on a supply you know is good, since those two account for nearly all of it.
A symptom in one part of the chain is regularly produced by the part before it. These pages cover the neighboring areas.