Настройка программного обеспечения
Установка LeRobot, настройка робота SO-101, калибровка сервопривода, настройка телеоперации лидер-последователь, API Python и устранение неполадок. Все, от новой установки Python до работающей руки.
Перейти в раздел:
Установка ЛеРобота
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]"
Конфигурация робота 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
Вы должны увидеть напечатанные показания положения суставов. Если вы получили ошибку порта, проверьте Поиск неисправностей.
Калибровка сервопривода
В отличие от рычагов с шиной 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
Переместите рычаг вручную (режим соответствия). Позиции суставов дома должны быть близкими к нулю и плавно увеличиваться/уменьшаться по мере движения каждого сустава.
Совет по повторной калибровке: Запускайте калибровку повторно каждый раз, когда вы разбираете шарнир, заменяете сервопривод или обнаруживаете, что положение шарнира смещается. Файлы калибровки сохраняются с серийным номером для каждого рычага и автоматически перезагружаются.
Телеоперация лидера и последователя
СО-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
"
Краткое руководство по 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 распространенных проблемы
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
Сервоприводы физически подключены, но 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()
"
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.