Перевод статьи Physical AI Tutorial: Train the SO-ARM101 Robot Arm with LeRobot and Jetson Orin NXVedha, Circuit Digest.

В этом руководстве по Physical AI мы обучим реальную роботизированную руку с помощью Hugging Face LeRobot и обучения с имитацией. В проекте используются рука Seeed Studio SO-ARM101 в конфигурации «ведущий — ведомый» и reComputer J4012 на базе NVIDIA Jetson Orin NX.

Мы начнём с настройки и калибровки SO-ARM101, затем перейдём к телеуправлению и сбору датасета. После этого запишем около 120 человеческих демонстраций, обучим политику ACT средствами LeRobot и проверим, сможет ли рука автономно сортировать помидоры и картофель. Пошаговое руководство охватывает весь процесс: сборку железа, настройку моторов, калибровку, телеуправление, запись датасета, обучение модели, разбор ошибок и проверку в реальных условиях.

Что понадобится#

Компоненты проекта

Основные компоненты проекта

КомпонентКол-воНазначение
1Ведущая рука Seeed Studio (Leader)1Ею оператор управляет вручную и показывает нужные движения
2Ведомая рука Seeed Studio (Follower)1Рабочая рука: повторяет за ведущей, а потом исполняет обученную политику
3reComputer J4012 с NVIDIA Jetson Orin NX1Основной вычислитель: обучение модели и инференс на роботе
4USB-камера1Снимает рабочую зону, объекты, захват и миски для обучения по изображению
5Блок питания 12 В2Питание моторов ведомой руки и Jetson Orin
6Блок питания 5 В1Питание моторов ведущей руки (моторы 7,4 В / 5 В)
7Ноутбук1Первоначальная настройка, телеуправление, запись датасета
8Кабели USB Type-C2Подключение рук, камер и Jetson к ноутбуку
9Монитор, мышь, клавиатураопциональноИнтерфейс для reComputer с Jetson Orin NX

Разбираемся с железом и софтом#

Рука SO-101#

SO-101 — недорогая роботизированная рука с открытым исходным кодом и шестью степенями свободы, предназначенная для исследований и обучения. Она состоит из двух рук: ведущей (Leader) и ведомой (Follower). Ведущей управляет человек, показывая нужные движения, а ведомая повторяет их при телеуправлении и позже самостоятельно исполняет обученную политику. Такая связка «ведущий — ведомый» позволяет легко собирать качественные демонстрационные данные для обучения с имитацией.

Ведущая рука

Ведущая рука (Leader)

Ведомая рука

Ведомая рука (Follower)

В отличие от многих промышленных манипуляторов, SO-101 не имеет отдельного внешнего контроллера робота. Вместо этого в комплекте идут две платы драйверов моторов — по одной на каждую руку. Эти платы служат в основном интерфейсом связи и распределения питания между компьютером и моторами.

Моторы: умные сервоприводы Feetech STS3215#

В SO-101 используются умные шинные сервоприводы Feetech STS3215. Это не обычные двигатели постоянного тока: внутри каждого STS3215 есть собственный контроллер, который отвечает за управление положением, скоростью и моментом, а также за обратную связь по текущему положению сустава.

Умный сервопривод

Умный сервопривод Feetech STS3215

Поскольку «мозги» уже находятся внутри мотора, внешняя плата драйвера не занимается сложным планированием движения — она просто передаёт команды от компьютера к моторам и подаёт питание. Проще говоря: контроллер сидит в моторе, плата драйвера работает мостом связи, а компьютер с LeRobot отправляет целевые положения. Для разных суставов используются разные передаточные отношения, чтобы сбалансировать момент и скорость. В ведущей руке обычно стоят моторы на более низкое напряжение (7,4 В), чтобы её было легко двигать рукой, а ведомая рассчитана на реальное выполнение задачи.

reComputer J4012 с NVIDIA Jetson Orin NX#

reComputer J4012 с NVIDIA Jetson Orin NX — компактная и мощная платформа граничных вычислений, рассчитанная на задачи ИИ. В этом проекте она служит основной системой для обучения модели и для запуска обученной политики на роботе.

reComputer J4012

reComputer J4012 с Jetson Orin NX

Ускорение на GPU делает её пригодной для обучения моделей вроде ACT (Action Chunking with Transformers), что на обычном ноутбуке без отдельной видеокарты NVIDIA было бы очень медленно или вовсе непрактично.

Что такое LeRobot#

LeRobot — открытый робототехнический фреймворк, разработанный Hugging Face. Он предоставляет полный набор инструментов для обучения роботов в реальном мире: связь с железом, телеуправление, запись датасетов, обучение моделей и оценку политик. Без LeRobot почти весь этот программный конвейер пришлось бы писать с нуля.

Фреймворк LeRobot

LeRobot от Hugging Face

Установка LeRobot на Windows#

Цель этого этапа на Windows — настроить моторы, откалибровать руки, освоить телеуправление, запись и воспроизведение датасета.

Сначала установите Miniconda: скачайте 64-битный установщик для Windows с официальной страницы и запустите его. Во время установки обязательно отметьте пункт «Add Miniconda3 to my PATH environment variable». После установки перезагрузите компьютер. Затем откройте командную строку и создайте отдельное окружение для LeRobot:

conda --version
conda create -n lerobot python=3.10 -y
conda activate lerobot

Если появится ошибка про Terms of Service, сначала выполните:

conda tos accept --override-channels --channel https://repo.anaconda.com/pkgs/main
conda tos accept --override-channels --channel https://repo.anaconda.com/pkgs/r
conda tos accept --override-channels --channel https://repo.anaconda.com/pkgs/msys2

После активации окружения клонируйте официальный репозиторий LeRobot и установите его с поддержкой моторов Feetech:

git clone https://github.com/huggingface/lerobot.git
cd lerobot
pip install -e ".[feetech]"

Проверьте установку:

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

Если всё прошло успешно, появится номер версии (например, 0.4.x или выше).

Подключение железа и настройка моторов#

Перед настройкой моторов их рекомендуется явно промаркировать: F1–F6 для суставов ведомой руки и L1–L6 для ведущей. К питанию нужно отнестись внимательно: ведущая рука всегда использует моторы на 7,4 В и питается от адаптера 5 В, а ведомая в зависимости от конфигурации может использовать моторы на 12 В. Подключить нужно и питание, и USB-кабель — одного USB для питания моторов недостаточно.

Сначала подключите адаптер 12 В к плате драйвера ведомой руки, затем адаптер 5 В к ведущей. После этого подключите USB-кабели обеих плат к ноутбуку. Чтобы определить нужные COM-порты, выполните:

lerobot-find-port

Следуйте инструкциям на экране и запишите номера портов для обеих рук.

Настройка ID сервоприводов#

Когда порты определены, нужно задать ID моторов. Важно: перед установкой ID каждого мотора разорвите шлейфовое (daisy-chain) соединение, иначе возможны ошибки. Начните с ведущей руки (подставьте свой COM-порт):

lerobot-setup-motors --teleop.type=so101_leader --teleop.port=COM26
Настройка ID моторов

Настройка ID моторов

Внимательно следуйте инструкциям и подключайте по одному мотору за раз. Закончив с ведущей рукой, повторите то же для ведомой:

lerobot-setup-motors --robot.type=so101_follower --robot.port=COM23

Каждому мотору нужно назначить уникальный ID от 1 до 6, чтобы софт мог обращаться к ним по отдельности.

Калибровка руки#

После установки ID подключите все моторы как положено и переходите к калибровке. Когда программа попросит, аккуратно подвигайте каждый сустав вперёд-назад, а затем доведите его до минимального и максимального положения — значения на экране будут меняться. Нажмите Enter, чтобы сохранить калибровку. Сначала калибруем ведущую руку:

lerobot-calibrate --teleop.type=so101_leader --teleop.port=COM26 --teleop.id=my_leader_arm

Затем то же для ведомой:

lerobot-calibrate --robot.type=so101_follower --robot.port=COM23 --robot.id=my_follower_arm
Калибровка каждой руки

Калибровка каждой руки

Советы по калибровке:

  • двигайте суставы медленно;
  • не продавливайте механические упоры;
  • убедитесь, что ID моторов назначены правильно;
  • проверьте, что рука нормально запитана;
  • если калибровка выдаёт странные значения — остановитесь и проверьте ID моторов и соответствие суставов;
  • сохраняйте калибровку только после того, как убедились в правильности движения суставов.

Телеуправление#

Когда обе руки откалиброваны, можно проверить телеуправление:

lerobot-teleoperate --robot.type=so101_follower --robot.port=COM23 --robot.id=my_follower_arm --teleop.type=so101_leader --teleop.port=COM26 --teleop.id=my_leader_arm

При движении ведущей руки ведомая в реальном времени повторяет её движения. Для остановки нажмите Ctrl+C.

Запись датасета без камеры#

Чтобы записать датасет без камер, используйте команду:

lerobot-record --robot.type=so101_follower --robot.port=COM23 --robot.id=my_follower_arm --teleop.type=so101_leader --teleop.port=COM26 --teleop.id=my_leader_arm --dataset.repo_id=semicon/arm_only_v1 --dataset.root="D:/lerobot_datasets/arm_only_v1" --dataset.num_episodes=3 --dataset.single_task="Pick and place small object" --dataset.push_to_hub=false --dataset.fps=30 --display_data=false

Не забудьте поменять номера COM-портов и путь к датасету под свою систему.

Воспроизведение записанного датасета#

Чтобы воспроизвести записанный эпизод:

lerobot-replay --robot.type=so101_follower --robot.port=COM23 --robot.id=my_follower_arm --dataset.repo_id=semicon/arm_only_v1 --dataset.root="D:/lerobot_datasets/arm_only_v1" --dataset.episode=0

Ведомая рука повторит движение, записанное в выбранном эпизоде.

Команды на каждый день#

Каждый раз, начиная работу, активируйте окружение и переходите в папку LeRobot:

conda activate lerobot
cd path\to\lerobot

После этого можно выполнять любую из приведённых выше команд.

Почему обучать нужно на Jetson Orin NX#

Хотя базовые операции — телеуправление, запись и воспроизведение — рука спокойно выполняет на Windows, полноценное обучение модели там непрактично. Сама запись датасета на Windows проходит без особых проблем, а вот обучение требует CUDA для эффективного ускорения на GPU. Если в компьютере нет видеокарты NVIDIA или мало оперативной памяти, обучение становится крайне медленным или вовсе не идёт. Поэтому обучение перенесли на reComputer J4012 с Jetson Orin NX.

Что такое CUDA#

CUDA (Compute Unified Device Architecture) — платформа параллельных вычислений от NVIDIA. Она позволяет программам использовать мощность видеокарты NVIDIA для вычислений общего назначения, а не только для графики. Процессор обычно обрабатывает задачи одну за другой, а графический процессор способен выполнять тысячи мелких операций одновременно. Именно CUDA даёт ИИ-фреймворкам доступ к этому ускорению.

Это важно, потому что обучение модели вроде ACT включает огромное количество математических вычислений, а на GPU с CUDA они идут значительно быстрее.

Какие модели применяют в обучении роботов#

В зависимости от задачи используются разные модели:

  • ACT (Action Chunking with Transformers) — модель, использованная в этом проекте. Учится на человеческих демонстрациях и предсказывает последовательность действий робота. Эффективна и хорошо работает на небольших датасетах.
  • Diffusion Policy — генерирует действия шаг за шагом, полезна для сложных или точных движений, но требует больше вычислительных ресурсов.
  • VLM (Vision-Language Model) — понимает и изображения, и текст; полезна, когда робот должен следовать словесным инструкциям.
  • VLA (Vision-Language-Action Model) — объединяет зрение, язык и действия для более универсального управления. Такие модели крупнее и требуют больше данных.

Для этого проекта выбрали ACT: она подходит для задач обучения с имитацией на демонстрационных данных и практична для довольно узкой задачи «взять и положить».

Первоначальная настройка на Jetson Orin NX#

Сначала Jetson Orin NX нужно прошить JetPack 6.1 или новее для совместимости и производительности. После этого базовая настройка робота выполняется так же, как на Windows:

  • назначение ID моторов;
  • калибровка;
  • телеуправление;
  • проверка записи и воспроизведения.

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

Сбор датасета для сортировки овощей#

Чтобы рука научилась сортировать овощи, нужно собрать демонстрационные данные. Они записываются в виде эпизодов.

Что такое эпизод? Это одна полная демонстрация задачи. Например:

  • взять помидор и положить в левую миску — 1 эпизод;
  • взять картофелину и положить в правую миску — 1 эпизод.

Модель учится, изучая множество таких примеров, — поэтому эпизодов нужно много.

Почему около 120 эпизодов? Одной демонстрации недостаточно, чтобы модель научилась надёжно. Собирая много эпизодов, модель видит небольшие вариации в движении, тайминге и обращении с объектом. В этом проекте собрали около 120 эпизодов тремя группами:

  • только помидор;
  • только картофель;
  • оба объекта вместе.
Запись датасета для каждого овоща

Запись датасета для каждого овоща

Это помогает модели освоить и обращение с отдельными объектами, и совмещённое поведение при сортировке.

Команда записи датасета#

Следующая команда записывает датасет, используя только камеру на запястье:

conda activate lerobot
lerobot-record \
 --robot.type=so101_follower \
 --robot.port=/dev/ttyACM1 \
 --robot.id=my_follower_arm \
 --robot.cameras="{ wrist: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30} }" \
 --teleop.type=so101_leader \
 --teleop.port=/dev/ttyACM0 \
 --teleop.id=my_leader_arm \
 --dataset.repo_id=local/tomato_potato_wrist_fixed \
 --dataset.push_to_hub=false \
 --dataset.num_episodes=120 \
 --dataset.single_task="Sort the tomato into the left bowl and the potato into the right bowl" \
 --dataset.episode_time_s=45 \
 --dataset.reset_time_s=15 \
 --display_data=true

Если хотите записать все эпизоды за один заход, используйте команду выше. Если же собирать данные поэтапно — сначала только помидор, потом только картофель, затем оба, — запускайте ту же команду с --dataset.num_episodes=40 для каждой группы, добавляя --resume=true во второй и третий запуски, чтобы продолжить запись в тот же датасет.

Обучение политики ACT#

После сбора датасета модель ACT обучается такой командой:

conda activate lerobot
lerobot-train \
 --dataset.repo_id=local/tomato_potato_wrist_fixed \
 --policy.type=act \
 --policy.repo_id=local/tomato_potato_wrist_fixed_act \
 --output_dir=outputs/train/tomato_potato_wrist_fixed_act \
 --job_name=tomato_potato_wrist_fixed_act \
 --policy.device=cuda \
 --batch_size=4 \
 --steps=100000 \
 --eval_freq=5000 \
 --save_freq=10000 \
 --log_freq=100 \
 --wandb.enable=false

Зачем нужны эти параметры:

  • --policy.type=act — выбирает модель ACT;
  • --policy.device=cuda — задействует ускорение на GPU;
  • --steps=100000 — количество шагов обучения;
  • --save_freq=10000 — регулярное сохранение контрольных точек.

Если обучение прервалось, его можно продолжить с последней контрольной точки:

conda activate lerobot
lerobot-train \
config_path=outputs/train/tomato_potato_wrist_fixed_act/checkpoints/last/pretrained_model/train_config.json \
 --resume=true

Проверка на реальном роботе#

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

conda activate lerobot
lerobot-record \
 --robot.type=so101_follower \
 --robot.port=/dev/ttyACM1 \
 --robot.id=my_follower_arm \
 --robot.cameras="{ wrist: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30} }" \
 --dataset.repo_id=local/eval_wrist_fixed \
 --dataset.push_to_hub=false \
 --dataset.num_episodes=1 \
 --dataset.single_task="Sort the tomato into the left bowl and the potato into the right bowl" \
 --dataset.episode_time_s=600 \
 --dataset.reset_time_s=15 \
 --display_data=true \
 --policy.path=outputs/train/tomato_potato_wrist_fixed_act/checkpoints/last/pretrained_model

На этом шаге роботом больше не управляет ведущая рука — ведомой управляет обученная модель, опираясь на изображение с камеры и выученное поведение. Проверить модель можно, подкладывая помидор и картофелину по очереди.

Частые ошибки и их решения#

ПроблемаПричинаРешение
1Ошибка «датасет уже существует» при запуске оценкиLeRobot по умолчанию не перезаписывает существующую папку датасетаУдалить существующую папку через rm -rf и перезапустить команду оценки
2Камеры отваливаются во время оценкиНехватка пропускной способности USB или нестабильное подключение камерыПереподключить камеры, проверить индексы через lerobot-find-cameras opencv и перезапустить оценку
3Обучение прервалось до завершенияДолгое обучение и прерывание работы системыПродолжить с последней контрольной точки с опцией --resume=true, а не начинать с нуля
4Рука не возвращается в исходное положение после эпизодов оценкиПри оценке политики без ведущей руки на фазе сброса нет управляющего входаВручную возвращать руку в стартовое положение перед каждым новым эпизодом
5Ошибка диапазона при калибровкеСустав не прошёл весь диапазон или мотор двигался слишком мало / слишком многоЗаново аккуратно откалибровать, медленно проводя каждый сустав от минимума к максимуму
6Не удаётся задать ID мотора / ошибка связиМоторы оставались соединёнными шлейфом при назначении IDРазорвать шлейф, подключать по одному мотору, задать ID, затем собрать обратно

Что можно улучшить#

Текущая система успешно демонстрирует обучение с имитацией для сортировки помидоров и картофеля, но пространство для улучшений остаётся большим. Сейчас всё держится в основном на камере запястья и фиксированных положениях объектов, поэтому дополнительная внешняя камера сверху или сбоку дала бы лучшее понимание сцены и помогла бы надёжнее работать с объектами в разных местах.

За пределами лабораторных экспериментов тот же конвейер обучения можно приспособить к практическим задачам: сортировке на складе, образовательным робототехническим платформам и простым промышленным операциям «взять и положить». Систему также можно расширить на более широкий набор объектов, обучив её сортировать разные фрукты или цветные кубики. Добавление силовых или тактильных датчиков в захват улучшило бы стабильность хвата, особенно для мягких или неровных предметов. В более отдалённой перспективе установка руки на мобильную платформу позволила бы роботу сортировать в разных местах, а не оставаться привязанным к одному столу.

Заключение#

Проект показал, как недорогая роботизированная рука может научиться реальной задаче, наблюдая за человеческими демонстрациями. С помощью руки SO-101 и LeRobot мы прошли весь путь: от сборки железа и телеуправления до записи данных, обучения модели и финального тестирования. Робота обучили раскладывать помидор и картофелину по разным мискам.

По ходу работы использовались и Windows, и Jetson Orin NX, что помогло понять, какие шаги легко делаются на обычном ноутбуке, а какие требуют более серьёзных вычислений. Пришлось столкнуться и с практическими проблемами — отваливающимися камерами, прерываниями обучения и просадкой качества, когда в кадре оба объекта сразу. Решая их шаг за шагом, систему удалось сделать стабильнее и полезнее.