Имитация движений: как научить робота повторять движения с помощью нейросети

Имитация движений: как научить робота повторять движения с помощью нейросети

У робота-манипулятора на дешёвых сервоприводах нет энкодеров — он не знает своего точного положения. Из-за люфтов, износа и неточностей механики его поведение непредсказуемо. Классическая кинематика здесь не работает: модель неточна, а железо не позволяет добиться стабильности.

Вместо попытки построить идеальную модель применяется подход имитационного обучения: роботу не объясняют, как двигаться, а показывают примеры. Он учится повторять траектории, не понимая их — просто копируя.

В этом проекте реализована гибридная система, способная воспроизводить и обобщать движения. Основные этапы:

  • сбор траекторий вручную с помощью внешних потенциометров
  • калибровка целевых точек для точного попадания
  • обучение нейросети предсказывать следующий шаг движения
  • введение механизма «прицеливания» для компенсации накопленной ошибки

Робот рассматривается как «чёрный ящик». Управление строится не на теории, а на измеренных данных. Для сбора информации в конструкцию добавлены внешние потенциометры, считывающие углы суставов. Данные передаются через Arduino на компьютер, где сохраняются и обрабатываются.

Рабочая область и сбор траекторий

Рабочая зона — часть поверхности, до которой манипулятор может дотянуться. В ней выбраны 34 целевые точки по углам клеток, похожих на шахматную доску. Центры не используются, чтобы проверить обобщающую способность модели.

Вместо сбора всех возможных перемещений между точками используется базовая точка — промежуточное положение над рабочей зоной. Все движения строятся как комбинация: точка → база → новая точка. Это сокращает количество необходимых траекторий с тысяч до 68: по одной туда и обратно для каждой из 34 точек.

Траектории собираются вручную: манипулятор плавно перемещают от базы к целевой точке и обратно. Arduino каждые 10 мс считывает значения потенциометров и отправляет их на компьютер. Python-скрипт сохраняет данные в CSV-файлы.

Обработка и нормализация данных

Сырые данные — непрерывный поток измерений. Паузы между движениями позволяют разбить его на отдельные траектории. Далее:

  • сигналы сглаживаются
  • траектории вырезаются по паузам
  • интерполируются до 200 шагов
  • нормализуются в диапазон от 0 до 1

Каждая траектория — последовательность из 200 шагов по 4 значения потенциометров. Нечётные — движение от базы, чётные — обратно.

Калибровка: от потенциометров к углам

Потенциометры дают значения от 0 до 1023. Чтобы управлять сервоприводами, их нужно перевести в углы (0–180°). Для этого проводится ручная калибровка: сервоприводы поочерёдно устанавливаются в известные углы, а с потенциометров снимаются соответствующие значения.

Зависимость оказывается близкой к линейной. Полученные формулы позволяют переводить показания датчиков в углы. Однако при запуске «сырых» траекторий робот не попадает точно в цель — из-за люфтов и погрешностей.

Калибровка целевых точек

Чтобы робот точно попадал в нужную точку, проводится ручная подгонка. Для каждой целевой точки подбираются такие углы сервоприводов, при которых захват действительно оказывается в заданном месте.

Например, для точки 26 исходные значения [118.9, 95.34, 90.08, 100.51]° корректируются до [116, 94, 87, 95]°. Эти откалиброванные значения используются как финальные.

Нейросеть: предсказание следующего шага

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

На вход подаётся:

  • текущее положение (4 значения потенциометров)
  • номер шага (прогресс)
  • целевая точка (4 значения)

На выходе — положение на следующем шаге. Такой подход позволяет строить траекторию шаг за шагом.

Обучающие примеры формируются из ручных траекторий: каждая пара «состояние + цель → следующее состояние» становится примером для обучения.

Архитектура и обучение

Сеть состоит из:

  • входного слоя (9 признаков)
  • двух скрытых слоёв по 512 нейронов
  • выходного слоя (4 значения)

Используется взвешенная MSE: ошибка в конце траектории штрафуется сильнее, чем в начале. Это помогает сети лучше «целиться» в финальную точку.

Добавлен слой LSTM, хотя в итоге он не использовался по назначению — но оставлен для будущих улучшений.

Проблема накопления ошибки

Даже малая ошибка на каждом шаге накапливается за 200 шагов. К концу траектории робот может промахнуться.

Чтобы это исправить, вводится механизм прицеливания: начиная с 120-го шага, предсказание сети постепенно смешивается с откалиброванной целевой точкой.

  • на 120-м шаге: 95% сеть, 5% цель
  • ближе к концу: 50/50
  • на последнем шаге: 100% цель (откалиброванные углы)

Так нейросеть отвечает за форму движения, а калибровка — за точность попадания.

Результаты

Система умеет строить траектории к точкам, которых не было в обучающей выборке — например, к центрам клеток. Это показывает способность к обобщению.

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

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

Возможные улучшения

Чтобы улучшить форму траекторий, можно:

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

⚠️ Важно: робот-манипулятор создаёт значительное усилие. Перед запуском убедитесь, что рабочая зона свободна, предусмотрена аварийная остановка, и вы соблюдаете меры безопасности.

Вывод

Проект показывает, как можно научить неточный робот повторять движения без сложной модели. Вместо попытки «понять» систему — её учат копировать.

Гибридный подход — ручной сбор, калибровка, нейросеть и прицеливание — даёт рабочее решение. Ни один элемент не работает в одиночку, но вместе они обеспечивают баланс между формой и точностью.

Код проекта доступен на GitHub: https://github.com/Iskatel-potenzialov/manipulytor

Читать оригинал