The left arm's zero point has drifted. Every scripted motion today stopped short on shoulder_lift by 3–5°. This guide is what to do at the robot. Takes about 10 minutes.
Running calibration of …, nothing was calibrated.shoulder_lift must really be at mid-travel. If it isn't, the encoder wraps and you get a full 0–4095 range. The arm is then commanded to positions it physically cannot reach — it stalls against the stop and overheats.
cp -r ~/.cache/huggingface/lerobot/calibration ~/calib-backup-$(date +%Y%m%d)
Redoing a calibration is tedious. Always back up first.
systemctl --user stop leader-follower
Two programs on one bus crash each other. On 2026-08-17 this exact collision dropped both arms onto the table.
shoulder_lift at MID-TRAVEL by handTorque is off, so the arm moves freely. Swing joint 2 to each end to feel where the stops are, then leave it halfway between them.
Why this matters: the encoder is 12-bit and wraps at 0/4095. Starting away from the middle makes the sweep cross that wrap, and you get a bogus full-turn range.
lerobot-calibrate --robot.type=so101_follower \
--robot.port=/dev/ttyACM0 --robot.id=left_arm
--robot.id is not a label — it picks the file:
~/.cache/huggingface/lerobot/calibration/robots/so_follower/left_arm.json
When it asks, press c then ENTER. You must then see:
Running calibration of …
Move the arm to the middle of its range …
Then sweep every joint through its full range, slowly, and return to the middle.
Spans should match the right arm within a few percent:
| Joint | Expected span | Right arm |
|---|---|---|
| shoulder_pan | 2736 | 2727 |
| shoulder_lift | 2426 | 2405 |
| elbow_flex | 2251 | 2215 |
| wrist_flex | 2380 | 2367 |
| wrist_roll | full turn by design | full turn |
| gripper | 1558 | 1554 |
trial_start_pose.json → left shoulder_lift: -26.0 → back to -29.54arm_home.py → TOL_DEG = 8.0 → back to 3.0Today, with the arm carrying a cup, every scripted move stopped short by 3–5° on shoulder_lift while every other joint landed within 0.6°. That is the signature of a shifted zero, not of a weak motor or a slow move — the servo reported it had reached its Min_Position_Limit while still 4.39° away from the commanded goal.
03-software/SETUP.md §6 · calibration files in
~/.cache/huggingface/lerobot/calibration/robots/so_follower/shoulder_lift range 1440–3866 ticks (span 2426, correct), homing_offset 1617.