Настройка программного обеспечения

Установка LeRobot, настройка робота SO-101, калибровка сервопривода, настройка телеоперации лидер-последователь, API Python и устранение неполадок. Все, от новой установки Python до работающей руки.

Перейти в раздел:

Шаг 1 — Установка LeRobot

Установка ЛеРобота

LeRobot — единственный пакет программного обеспечения, необходимый для SO-101. Он обеспечивает сервосвязь, калибровку, телеоптику и запись данных.

Создайте виртуальную среду

python -m venv ~/.venvs/so101
source ~/.venvs/so101/bin/activate   # Windows: .venvs\so101\Scripts\activate

Установить ЛеРобот

pip install lerobot

Проверка установки

python -c "import lerobot; print(lerobot.__version__)"

Установить из исходного кода (необязательно — для получения новейших функций)

git clone https://github.com/huggingface/lerobot.git
cd lerobot
pip install -e ".[so101]"
Шаг 2 — Настройка робота

Конфигурация робота SO-101

LeRobot включает в себя встроенную конфигурацию робота SO-101. Вы указываете порт USB для ведомого рычага (и ведущего рычага, если используется двуручный телеоператор).

Найдите свой USB-порт

# Linux / macOS
ls /dev/ttyUSB*    # typical: /dev/ttyUSB0, /dev/ttyUSB1
ls /dev/tty.usbserial*   # macOS alternative

# Windows — check Device Manager → Ports → COMx

Конфигурация SO-101 YAML

LeRobot использует встроенную конфигурацию в командной строке или файл YAML. Для установки с одной рукой:

# ~/.lerobot/robots/so101_follower.yaml
robot_type: so101
port: /dev/ttyUSB0   # update to your port
cameras:
  wrist_cam:
    type: opencv
    index_or_path: 0
    fps: 30
    width: 640
    height: 480

Двурукая конфигурация (лидер-ведомый)

# ~/.lerobot/robots/so101_bimanual.yaml
robot_type: so101
port: /dev/ttyUSB1      # follower arm
leader_arms:
  main:
    type: so101
    port: /dev/ttyUSB0   # leader arm
cameras:
  top_cam:
    type: opencv
    index_or_path: 0
    fps: 30
    width: 640
    height: 480

Тестовое соединение

python -m lerobot.scripts.control_robot \
  --robot.type=so101 \
  --robot.port=/dev/ttyUSB0 \
  --control.type=none   # just connects and reads state

Вы должны увидеть напечатанные показания положения суставов. Если вы получили ошибку порта, проверьте Поиск неисправностей.

Шаг 3 — Калибровка сервопривода

Калибровка сервопривода

В отличие от рычагов с шиной CAN, в которых используются абсолютные энкодеры, сервоприводы Feetech STS3215 нуждаются в калибровке для определения нулевых положений. LeRobot сделает это автоматически.

Запустите калибровку

python -m lerobot.scripts.control_robot \
  --robot.type=so101 \
  --robot.port=/dev/ttyUSB0 \
  --control.type=calibrate

Скрипт предложит вам переместить руку в определенные позиции (исходное, минимальное, максимальное для каждого сустава) и нажать Enter в каждой позиции. Он сохраняет данные калибровки в ~/.cache/huggingface/lerobot/calibration/so101/.

Калибровочные позиции

LeRobot попросит вас расположить каждый сустав в трех позах:

  • Исходное положение: рука полностью вытянута, рабочий орган направлен вперед
  • Положение нулевого крутящего момента: рука естественным образом висит под действием силы тяжести
  • Ссылка на 90 градусов: каждый сустав в своей средней точке

Проверка калибровки

python -m lerobot.scripts.control_robot \
  --robot.type=so101 \
  --robot.port=/dev/ttyUSB0 \
  --control.type=teleoperate   # move arm by hand to verify joint readout

Переместите рычаг вручную (режим соответствия). Позиции суставов дома должны быть близкими к нулю и плавно увеличиваться/уменьшаться по мере движения каждого сустава.

Совет по повторной калибровке: Запускайте калибровку повторно каждый раз, когда вы разбираете шарнир, заменяете сервопривод или обнаруживаете, что положение шарнира смещается. Файлы калибровки сохраняются с серийным номером для каждого рычага и автоматически перезагружаются.

Шаг 4 — Телеоп «лидер-последователь»

Телеоперация лидера и последователя

СО-101 предназначен для телеоперации лидер-последователь: одна рука (лидер) фиксирует движения вашей руки, а вторая рука (ведомый) отражает их в реальном времени. Это обеспечивает высочайшее качество обучающих демонстраций.

Начать телеоптику «лидер-последователь»

python -m lerobot.scripts.control_robot \
  --robot.type=so101 \
  --robot.port=/dev/ttyUSB1 \
  --robot.leader_arms.main.type=so101 \
  --robot.leader_arms.main.port=/dev/ttyUSB0 \
  --control.type=teleoperate

Телеоп с одной рукой (без второй руки)

Если у вас только одна рука, используйте режим управления с клавиатуры:

python -m lerobot.scripts.control_robot \
  --robot.type=so101 \
  --robot.port=/dev/ttyUSB0 \
  --control.type=teleoperate \
  --control.teleop_keys=true

Режим соответствия / гравитационной компенсации

Переведите ведущий рычаг в режим низкого крутящего момента, чтобы вы могли свободно перемещать его рукой:

python -c "
from lerobot.common.robot_devices.robots.so101 import SO101Robot
robot = SO101Robot(port='/dev/ttyUSB0')
robot.connect()
robot.set_compliance_mode(True)   # arm moves freely under hand guidance
"
Шаг 5 — API Python

Краткое руководство по API Python

Вы можете управлять SO-101 напрямую через API робота LeRobot без сценариев CLI.

Базовый совместный контроль

from lerobot.common.robot_devices.robots.so101 import SO101Robot
import torch

robot = SO101Robot(port="/dev/ttyUSB0")
robot.connect()

# Read current joint positions (6 DOF)
obs = robot.capture_observation()
print("Joint positions:", obs["observation.state"])

# Send joint position command (in degrees, normalized to [-1, 1] range)
action = torch.zeros(6)   # all joints to zero position
robot.send_action(action)

robot.disconnect()

Компенсация гравитации (режим заднего хода)

from lerobot.common.robot_devices.robots.so101 import SO101Robot

robot = SO101Robot(port="/dev/ttyUSB0")
robot.connect()

# Enable backdrive — arm can be moved freely by hand
robot.set_compliance_mode(True)

import time
for _ in range(100):
    obs = robot.capture_observation()
    print(obs["observation.state"])   # prints live joint positions as you move arm
    time.sleep(0.02)

robot.disconnect()

Чтение статуса сервопривода

from lerobot.common.robot_devices.motors.feetech import FeetechMotorsBus

bus = FeetechMotorsBus(port="/dev/ttyUSB0",
                       motors={"joint1": (1, "sts3215"),
                               "joint2": (2, "sts3215"),
                               "joint3": (3, "sts3215"),
                               "joint4": (4, "sts3215"),
                               "joint5": (5, "sts3215"),
                               "gripper": (6, "sts3215")})
bus.connect()
positions = bus.read("Present_Position", ["joint1", "joint2", "joint3"])
print("Positions:", positions)
bus.disconnect()
Поиск неисправностей

Топ-3 распространенных проблемы

Ошибка 1 Последовательный порт не найден: FileNotFoundError: /dev/ttyUSB0

Сервоконтроллер USB не обнаружен. Обычно отсутствует драйвер или отсоединен кабель.

Исправить:

# Check if the device is listed
ls /dev/ttyUSB*   # Linux
ls /dev/tty.usbserial*   # macOS

# Linux: add yourself to the dialout group (requires logout)
sudo usermod -aG dialout $USER

# Windows: install CP2102 or CH340 USB driver,
# then check Device Manager for COM port number
Ошибка 2 Сервоприводы не отвечают после подключения

Сервоприводы физически подключены, но LeRobot не может прочитать их положение. Обычно проблема с питанием или неправильной скоростью передачи данных.

Исправить:

# 1. Verify 5V power supply is connected and LED on servo board is on
# 2. Check all servo daisy-chain cables are fully seated
# 3. Try scanning for servos directly:
python -c "
from lerobot.common.robot_devices.motors.feetech import FeetechMotorsBus
bus = FeetechMotorsBus('/dev/ttyUSB0', motors={})
bus.connect()
ids = bus.find_motor_ids()
print('Found motor IDs:', ids)
bus.disconnect()
"
Ошибка 3 Данные калибровки не найдены при следующем запуске

LeRobot сохраняет калибровку для каждого серийного номера руки. Если он не сможет найти файл калибровки, он выдаст предупреждение и будет использовать необработанные значения энкодера.

Исправить:

# Check calibration file location
ls ~/.cache/huggingface/lerobot/calibration/so101/

# Re-run calibration if the file is missing
python -m lerobot.scripts.control_robot \
  --robot.type=so101 \
  --robot.port=/dev/ttyUSB0 \
  --control.type=calibrate

# Pass explicit calibration path if needed
python -m lerobot.scripts.control_robot \
  --robot.type=so101 \
  --robot.port=/dev/ttyUSB0 \
  --robot.calibration_dir=/path/to/calibration \
  --control.type=teleoperate

Все еще застрял? Спросите на Форум СО-101 или проверьте Проблемы с LeRobot на GitHub.

Программное обеспечение работает? Начните сбор данных.

Как только рука начнет двигаться, следующим шагом будет запись вашего первого набора данных LeRobot.