LeRobot documentation
SO-100
SO-100
В шагах ниже мы объясняем, как собрать робота SO-100.
Заказать компоненты
Следуйте этому README. В нём содержится список материалов со ссылками на источники для закупки деталей, а также инструкции по 3D-печати. Также даны рекомендации на случай, если вы печатаете впервые или у вас нет 3D-принтера.
Установка LeRobot 🤗
Чтобы установить LeRobot, следуйте нашему Руководству по установке
Помимо этих инструкций, вам необходимо установить Feetech SDK (если вы установили LeRobot из PyPI, выполните pip install 'lerobot[feetech]'):
pip install -e ".[feetech]"Настройка двигателей
Примечание: В отличие от SO-101, разъёмы двигателей не имеют удобного доступа после сборки руки, поэтому этап конфигурации необходимо выполнить заранее.
1. Найдите USB-порты, связанные с каждой рукой
Чтобы найти порт для каждого адаптера сервопривода шины, выполните этот скрипт:
lerobot-find-port
Пример вывода:
Finding all available ports for the MotorBus.
['/dev/tty.usbmodem575E0032081', '/dev/tty.usbmodem575E0031751']
Remove the USB cable from your MotorsBus and press Enter when done.
[...Disconnect corresponding leader or follower arm and press Enter...]
The port of this MotorsBus is /dev/tty.usbmodem575E0032081
Reconnect the USB cable.Найденный порт: /dev/tty.usbmodem575E0032081, соответствующий ведущей или ведомой руке.
В Linux может потребоваться предоставить доступ к USB-портам, выполнив команду:
sudo chmod 666 /dev/ttyACM0
sudo chmod 666 /dev/ttyACM1Пример вывода:
Finding all available ports for the MotorBus.
['/dev/ttyACM0', '/dev/ttyACM1']
Remove the usb cable from your MotorsBus and press Enter when done.
[...Disconnect corresponding leader or follower arm and press Enter...]
The port of this MotorsBus is /dev/ttyACM1
Reconnect the USB cable.Найденный порт: /dev/ttyACM1, соответствующий ведущей или ведомой руке.
2. Установите идентификаторы и скорости передачи данных для двигателей
Каждый двигатель идентифицируется уникальным id на шине. В заводском состоянии двигатели обычно имеют id по умолчанию 1. Чтобы обеспечить корректную связь между двигателями и контроллером, сначала необходимо задать каждому двигателю уникальный, отличный от других id. Кроме того, скорость передачи данных по шине определяется baudrate. Чтобы контроллер и все двигатели могли обмениваться данными, их необходимо настроить на одинаковый baudrate.
Для этого нам сначала необходимо подключить контроллер к каждому мотору по отдельности, чтобы установить эти параметры. Поскольку мы будем записывать эти параметры в энергонезависимую область внутренней памяти моторов (EEPROM), это нужно будет сделать только один раз.
Если вы используете двигатели от другого робота, вам, скорее всего, также потребуется выполнить этот шаг, так как идентификаторы и скорость передачи данных, вероятно, не будут совпадать.
Подписчик
Подключите USB-кабель от компьютера и блок питания к контроллерной плате манипулятора. Затем выполните следующую команду или запустите пример API с портом, полученным на предыдущем шаге. Также необходимо указать имя манипулятора с помощью параметра id.
Для наглядного примера того, как задать идентификаторы моторов, смотрите это видео, в котором мы проходим этот процесс на примере руки SO101.
lerobot-setup-motors \
--robot.type=so100_follower \
--robot.port=/dev/tty.usbmodem585A0076841 # <- paste here the port found at previous stepfrom lerobot.robots.so_follower import SO100Follower, SO100FollowerConfig
config = SO100FollowerConfig(
port="/dev/tty.usbmodem585A0076841",
id="my_awesome_follower_arm",
)
follower = SO100Follower(config)
follower.setup_motors()Вы должны увидеть следующую инструкцию
Connect the controller board to the 'gripper' motor only and press enter.Как указано в инструкции, подключите мотор захвата. Убедитесь, что это единственный мотор, подключённый к плате, и что сам мотор пока не соединён последовательно с другими моторами. При нажатии [Enter] скрипт автоматически установит id и baudrate для этого мотора.
Troubleshooting
Если на этом этапе возникает ошибка, проверьте кабели и убедитесь, что они правильно подключены:
- Питание
- USB-кабель между вашим компьютером и контроллерной платой
- 3-контактный кабель от платы контроллера к мотору
Если вы используете контроллерную плату Waveshare, убедитесь, что два перемычки установлены на канале B (USB).
Затем вы должны увидеть следующее сообщение:
'gripper' motor id set to 6За ним следует следующая инструкция:
Connect the controller board to the 'wrist_roll' motor only and press enter.Можно отсоединить 3-контактный кабель от контрольной платы, но на другом конце можно оставить его подключённым к мотору захвата, так как он уже будет в нужном месте. Теперь подключите другой 3-контактный кабель к мотору вращения запястья и соедините его с контрольной платой. Как и в случае с предыдущим мотором, убедитесь, что это единственный мотор, подключённый к плате, и что сам мотор не подключён ни к какому другому.
Повторите операцию для каждого мотора, следуя инструкциям.
Проверяйте подключение кабелей на каждом этапе перед нажатием Enter. Например, кабель питания может отсоединиться при манипуляциях с платой.
Когда вы закончите, скрипт просто завершится, после чего моторы будут готовы к использованию. Теперь можно подключить 3-контактный кабель от каждого мотора к следующему, а кабель от первого мотора (‘shoulder pan’ с id=1) — к контроллерной плате, которую теперь можно закрепить на основании руки.
Лидер
Выполните те же шаги для ведущей руки.
lerobot-setup-motors \
--teleop.type=so100_leader \
--teleop.port=/dev/tty.usbmodem575E0031751 # <- paste here the port found at previous stepfrom lerobot.teleoperators.so_leader import SO100Leader, SO100LeaderConfig
config = SO100LeaderConfig(
port="/dev/tty.usbmodem585A0076841",
id="my_awesome_leader_arm",
)
leader = SO100Leader(config)
leader.setup_motors()Пошаговая инструкция по сборке
Снимите шестерни с 6 ведущих двигателей
Video removing gears
Смотрите видео о снятии шестерёнок. Вам нужно снять шестерёнки с моторов ведущего манипулятора. В результате вы будете использовать только позиционное кодирование моторов и снизите трение, чтобы легче управлять ведущим манипулятором.
Очистить части
Удалите все поддерживающие материалы с 3D-отпечатанных деталей. Самый простой способ сделать это — использовать маленькую отвёртку, чтобы поддеть материал поддержки снизу.
Дополнительные рекомендации
Video assembling arms
Примечание: Это видео наглядно показывает, как собрать руки, но не указывает, когда и как выполнять подключение проводов. Гораздо проще вставить кабели заранее, чем делать это после сборки. На сборку первой руки может уйти чуть больше 1 часа, но, освоившись, вы сможете собрать вторую менее чем за час.
Первый мотор
Шаг 2: Вставьте провода
- Вставьте два провода в первый мотор.
Шаг 3: Установка в Base
- Установите первый мотор в основание.
Шаг 4: Крепление мотора
- Закрепите мотор четырьмя винтами: двумя снизу и двумя сверху.
Шаг 5: Прикрепите держатель двигателя
- Наденьте первый держатель мотора и закрепите его двумя винтами (по одному с каждой стороны).
Шаг 6: Прикрепите рожки двигателя
- Установите оба моторных рожка, закрепив верхний рожок винтом. Старайтесь не смещать положение мотора при установке моторного рожка, особенно для ведущих рычагов, где мы сняли шестерни.
Video adding motor horn
Шаг 7: Прикрепите плечевую часть
- Подключите один провод к задней части робота, а другой — к левой стороне или на себя (см. фото).
- Прикрепите плечевую часть.
Шаг 8: Защита плеча
- Закрепите плечевую часть четырьмя винтами сверху и четырьмя снизу (доступ к нижним отверстиям обеспечивается поворотом плеча).
Второй моторный узел
Шаг 9: Установка Motor 2
- Вставьте второй мотор сверху и соедините провод от мотора 1 к мотору 2.
Шаг 10: Прикрепите держатель для плеча
- Добавьте держатель мотора плеча.
- Убедитесь, что провод от мотора 1 к мотору 2 проходит за держателем, а другой провод направлен вверх (см. фото).
- Эта деталь может быть сложной в сборке. Вы можете использовать верстак, как на изображении, или аналогичную установку, чтобы надеть деталь на мотор.

Шаг 11: Закрепление двигателя 2
- Закрепите второй мотор 4 винтами.
Шаг 12: Прикрепите моторный гудок
- Прикрепите оба рожковых ключа к мотору 2, снова используя винт для рожкового ключа.
Шаг 13: Прикрепите основание
- Установите базовое крепление с помощью 2 винтов.
Шаг 14: Прикрепите верхнюю часть руки
- Прикрепите верхнюю часть руки с помощью 4 винтов с каждой стороны.
Третья сборка мотора
Шаг 15: Установка Motor 3
- Проложите моторный кабель от мотора 2 через кабельный зажим к мотору 3, затем закрепите мотор 3 четырьмя винтами.
Шаг 16: Прикрепите моторный гудок
- Прикрепите оба рожковых ключа к мотору 3 и снова закрепите один из них с помощью винта для рожкового ключа.
Шаг 17: Прикрепите предплечье
- Подключите предплечье к мотору 3, используя по 4 винта с каждой стороны.
Четвертый моторный узел
Шаг 18: Установка Motor 4
- Вставьте мотор 4, подключите кабель от мотора 3 и закрепите кабель в его держателе с помощью винта.

Шаг 19: Прикрепите держатель мотора 4
- Установите четвёртый держатель мотора (плотная посадка). Убедитесь, что один провод проложен вверх, а провод от мотора 3 — вниз (см. фото).
Шаг 20: Закрепите двигатель 4 и установите клаксон
- Закрепите мотор 4 четырьмя винтами и установите его моторные кронштейны, используя для одного из них винт кронштейна.
Сборка запястья
Шаг 21: Установка Motor 5
- Вставьте мотор 5 в держатель запястья и закрепите его с помощью двух передних винтов.
Шаг 22: Прикрепите запястье
- Подключите провод от мотора 4 к мотору 5. И уже вставьте другой провод для захвата.
- Закрепите запястье на моторе 4 с помощью 4 винтов с обеих сторон.
Шаг 23: Прикрепите рог на запястье
- Установите только один рупор на мотор запястья и закрепите его винтом рупора.
Конфигурация последователя
Шаг 24: Прикрепите захват
- Прикрепите захват к мотору 5.
Шаг 25: Установка мотора захвата
- Вставьте мотор захвата, соедините провод мотора от мотора 5 к мотору 6 и закрепите его тремя винтами с каждой стороны.
Шаг 26: Прикрепите рог захвата и коготь
- Прикрепите рожки мотора и снова используйте винт рожка.
- Установите захват и закрепите его с обеих сторон с помощью 4 винтов.
Шаг 27: Установка контроллера
- Подключите контроллер двигателя к задней части робота.

Сборка завершена – переходите к сборке руки лидера.
Конфигурация лидера
Для конфигурации лидера выполните шаги 1–23. Убедитесь, что вы сняли шестерни с моторов.
Шаг 24: Прикрепите держатель лидера
- Закрепите держатель лидера на запястье с помощью винта.
Шаг 25: Прикрепите ручку
- Прикрепите рукоятку к мотору 5 с помощью 4 винтов.
Шаг 26: Установка мотора захвата
- Вставьте мотор захвата, закрепите его тремя винтами с каждой стороны, установите шестерню мотора с помощью винта шестерни и подключите провод мотора.
Шаг 27: Подключение триггера
- Прикрепите привод ведомого элемента четырьмя винтами.
Шаг 28: Установка контроллера
- Подключите контроллер двигателя к задней части робота.

Калибровка
Далее вам потребуется откалибровать робота, чтобы убедиться, что значения позиций ведущего и ведомого манипуляторов совпадают, когда они находятся в одном и том же физическом положении. Процесс калибровки очень важен, поскольку он позволяет нейронной сети, обученной на одном роботе, работать на другом.
Подписчик
Выполните следующую команду или пример API для калибровки руки-последователя:
# Use the port of your follower arm, and give the arm a unique name with --robot.id
lerobot-calibrate \
--robot.type=so100_follower \
--robot.port=/dev/tty.usbmodem58760431551 \
--robot.id=my_awesome_follower_armfrom lerobot.robots.so_follower import SO100FollowerConfig, SO100Follower
config = SO100FollowerConfig(
port="/dev/tty.usbmodem585A0076891",
id="my_awesome_follower_arm",
)
follower = SO100Follower(config)
follower.connect(calibrate=False)
follower.calibrate()
follower.disconnect()Мы унифицировали метод калибровки для большинства роботов. Таким образом, шаги калибровки для этой руки SO100 совпадают с шагами для Koch и SO101. Во-первых, необходимо переместить робота в положение, в котором каждый сустав находится в середине своего диапазона, затем нажать Enter. Во-вторых, мы перемещаем все суставы через их полный диапазон движения. Видео этого же процесса для SO101 в качестве примера можно найти здесь
Лидер
Выполните те же шаги для калибровки ведущего манипулятора, запустив следующую команду или пример API:
# Use the port of your leader arm, and give the arm a unique name with --teleop.id
lerobot-calibrate \
--teleop.type=so100_leader \
--teleop.port=/dev/tty.usbmodem58760431551 \
--teleop.id=my_awesome_leader_armfrom lerobot.teleoperators.so_leader import SO100LeaderConfig, SO100Leader
config = SO100LeaderConfig(
port="/dev/tty.usbmodem58760431551",
id="my_awesome_leader_arm",
)
leader = SO100Leader(config)
leader.connect(calibrate=False)
leader.calibrate()
leader.disconnect()Поздравляем 🎉, ваш робот готов самостоятельно обучаться задаче. Начните обучение, следуя этому руководству: Начало работы с реальными роботами
Update on GitHubЕсли у вас есть вопросы или нужна помощь, напишите нам в Discord.