Skip to content

SO-101 follower disconnects during teleoperation #3131

@Verlyba

Description

@Verlyba

Ticket Type

🐛 Bug Report (Something isn't working)

Environment & System Info

LeRobot version:
- LeRobot version: 0.4.4
- Platform: Linux-6.17.0-14-generic-x86_64-with-glibc2.42
- Python version: 3.10.18
- Huggingface Hub version: 0.35.3
- Datasets version: 4.1.1
- Numpy version: 2.2.6
- FFmpeg version: 7.1.1
- PyTorch version: 2.7.1+cu126
- Is PyTorch built with CUDA support?: True
- Cuda version: 12.6
- GPU model: NVIDIA GeForce RTX 4070

Python version: 3.10
OS: Ubuntu 22.04
Hardware: SO-101 robot arm (leader + follower)
Servos: Hiwonder HX-30HM, HX-10HM
Power supply: 12V 20A
Connection: USB serial (/dev/serial/by-id)

Description

I am experiencing persistent disconnections when using teleoperation with an SO-101 leader/follower setup.

The issue occurs even after:

  • recalibrating both arms
  • verifying motor IDs
  • replacing the power supply
  • checking wiring
  • resetting calibration files

Initially the teleoperation would run for a few seconds and then crash with:

ConnectionError: Failed to sync read 'Present_Position'

After further debugging and recalibration attempts, the error now occurs during robot connection:

RuntimeError: FeetechMotorsBus motor check failed

Here is the full code error:

(lerobot) verlyba@verlyba-PC:~/robotics/lerobot$ lerobot-teleoperate \
  --robot.type=so101_follower \
  --robot.port=$FOLLOWER \
  --robot.id=F1 \
  --teleop.type=so101_leader \
  --teleop.port=$LEADER \
  --teleop.id=L1 \
  --robot.disable_torque_on_disconnect=False
INFO 2026-03-11 20:33:00 eoperate.py:207 {'display_compressed_images': False,
 'display_data': False,
 'display_ip': None,
 'display_port': None,
 'fps': 60,
 'robot': {'calibration_dir': None,
           'cameras': {},
           'disable_torque_on_disconnect': False,
           'id': 'F1',
           'max_relative_target': None,
           'port': '/dev/serial/by-id/usb-1a86_USB_Single_Serial_5B3E119428-if00',
           'use_degrees': False},
 'teleop': {'calibration_dir': None,
            'id': 'L1',
            'port': '/dev/serial/by-id/usb-1a86_USB_Single_Serial_5B3E121827-if00',
            'use_degrees': False},
 'teleop_time_s': None}
INFO 2026-03-11 20:33:00 so_leader.py:79 L1 SOLeader connected.
INFO 2026-03-11 20:33:00 follower.py:106 F1 SOFollower connected.
Teleop loop time: 16.74ms (60 Hz)
INFO 2026-03-11 20:33:05 o_leader.py:156 L1 SOLeader disconnected.
Traceback (most recent call last):py:230 F1 SOFollower disconnected.
  File "/home/verlyba/miniconda3/envs/lerobot/bin/lerobot-teleoperate", line 6, in <module>
    sys.exit(main())
  File "/home/verlyba/robotics/lerobot/src/lerobot/scripts/lerobot_teleoperate.py", line 246, in main
    teleoperate()
  File "/home/verlyba/robotics/lerobot/src/lerobot/configs/parser.py", line 233, in wrapper_inner
    response = fn(cfg, *args, **kwargs)
  File "/home/verlyba/robotics/lerobot/src/lerobot/scripts/lerobot_teleoperate.py", line 224, in teleoperate
    teleop_loop(
  File "/home/verlyba/robotics/lerobot/src/lerobot/scripts/lerobot_teleoperate.py", line 163, in teleop_loop
    obs = robot.get_observation()
  File "/home/verlyba/robotics/lerobot/src/lerobot/utils/decorators.py", line 29, in wrapper
    return func(self, *args, **kwargs)
  File "/home/verlyba/robotics/lerobot/src/lerobot/robots/so_follower/so_follower.py", line 182, in get_observation
    obs_dict = self.bus.sync_read("Present_Position")
  File "/home/verlyba/robotics/lerobot/src/lerobot/utils/decorators.py", line 29, in wrapper
    return func(self, *args, **kwargs)
  File "/home/verlyba/robotics/lerobot/src/lerobot/motors/motors_bus.py", line 1146, in sync_read
    ids_values, _ = self._sync_read(
  File "/home/verlyba/robotics/lerobot/src/lerobot/motors/motors_bus.py", line 1178, in _sync_read
    raise ConnectionError(f"{err_msg} {self.packet_handler.getTxRxResult(comm)}")
ConnectionError: Failed to sync read 'Present_Position' on ids=[1, 2, 3, 4, 5, 6] after 1 tries. [TxRxResult] Incorrect status packet!

I tried checking the kernel for USB disconnections, but none appear.

Context & Reproduction

No response

Relevant logs or stack trace

Checklist

  • I have searched existing tickets to ensure this isn't a duplicate.
  • I am using the latest version of the main branch.
  • I have verified this is not an environment-specific problem.

Additional Info / Workarounds

No response

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn’t working correctlyrobotsIssues concerning robots HW interfacesteleoperatorsEverything related to teleoperators

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions