SO101 Arm - Elbow servo (joint 3) grinds/jitters and only drives one direction during teleop

Product model / kit: SO-101 follower arm , STS3215 servos
Version / specs: SO101 Arm Advanced kit
Purchase channel: HiWonder
Controller / main board: Via USB connection to laptop
OS / software / firmware version:

  • lerobot 0.6.1 , Python 3.12.13, Ubuntu 22.04.5 LTS
  • feetech-servo-sdk 1.0.0, pyserial 3.5
  • Servo firmware: 3.14 on all 6 servos
    Image version: n/a

Tutorial or steps followed: LeRobot SO-101 setup + calibration (lerobot-calibrate), custom joint-space teleop script driving the arm via Xbox gamepad (also tried keyboard teleop)

Problem description:
The elbow_flex servo (joint 3 / motor ID 3) grinds/jitters and only actually moves in one direction during teleop, commanding it upward/backward produces grinding noise and no motion, while the other direction works normally. All 5 other joints behave normally. Servo firmware is confirmed matching (3.14) across all 6 servos, the fault only shows up under active load in one direction. Saw a similar issue with joint 2 but that got fixed by tweaking PID valyes and allowing higher max load / torque.

Error messages / logs / screenshots:

Steps to reproduce:

  1. Power on arm, connect via lerobot-calibrated config, torque enabled
  2. Command elbow_flex via right-stick deflection in either direction during teleop
  3. One direction moves normally; the other produces grinding/jitter with no actual movement

What you have already tried:

  • Increased read retries and tolerance for transient bus read failures (unrelated bus glitch, ruled out as the cause here)
  • Raised Max_Torque_Limit and tuned P/I/D gains (P=24/I=8/D=32) on elbow_flex + shoulder_lift for extra holding torque, did not resolve the directional nature for elbow but fixed for shoulder
  • Verified all 6 servos report matching firmware (3.14)
  • Verified elbow is not resting at a calibration range limit (37% of range at rest)
  • swapped this servo with a known-good one from leader arm

Looking forward to your response.

Please stop the test whenever grinding starts, and do not increase the torque limit further.

For the SO-101 follower, elbow_flex is motor ID 3. The official follower configuration uses position mode with P_Coefficient=16, I_Coefficient=0, and D_Coefficient=32. Please perform these checks:

  1. Restore those PID values. Return any torque or protection settings you changed to their recorded original values; if you did not record them, do not guess.
  2. After the servo swap, confirm that the replacement is also an STS3215 and is configured as ID 3. Run follower calibration again and type c when prompted so the old calibration is not reused. Start with the arm near the middle of its range, then move every joint through its complete range before saving.
  3. With torque disabled, slowly move the elbow through its full physical range. Check for a hard spot, abnormal resistance, bracket contact, or cable tension in the failing direction.
  4. Reproduce the issue using the unmodified official SO-101 teleoperation path. The documented environment uses Python 3.10.18, while your environment uses Python 3.12.13, so testing in the documented environment will also exclude an environment or custom-script difference.
  5. During a slow, no-payload test, record ID 3 values for Goal_Position, Present_Position, Min_Position_Limit, Max_Position_Limit, Present_Load, Present_Current, Present_Voltage, Present_Temperature, and Status in both directions. Stop immediately if load or current rises while position does not change.

Please also clarify the servo-swap result: Did the problem follow the physical servo, or did it remain at the elbow joint? If it remained at the elbow with a correctly configured and recalibrated known-good servo, provide a short video of both torque-on behavior and torque-off hand movement together with the register readings. If it followed the servo, provide the same readings for both servos. This will isolate calibration, mechanical binding, and servo-specific behavior without assuming a hardware failure.


If this reply was helpful, you can mark it as the solution using the button below.