Sim-to-real: как роботов учат в симуляции и переносят в железо
Модель, обученная в идеальной физике симулятора, разваливается на реальном роботе за секунды. Domain randomization намеренно ломает симуляцию, чтобы политика выжила в реальном мире.

Обучить нейросеть управлять роботом в симуляции дёшево: тысячи параллельных сред, миллионы шагов за ночь, никакого риска сломать дорогое железо. Проблема в том, что политика, выученная в идеализированной физике, при переносе на настоящего робота часто отказывает сразу — трение не то, масса звена оценена с ошибкой, задержка команд на десятки миллисекунд, датчики шумят. Этот разрыв называют reality gap, и главный практический ответ на него — dynamics randomization: во время обучения физические параметры симулятора не фиксируют, а случайно меняют от эпизода к эпизоду.
Почему модель из симулятора ломается на роботе
Симулятор — это набор чисел: коэффициенты трения, массы, моменты инерции, жёсткости приводов, задержки в контуре управления. Ни одно из этих чисел не совпадает с реальностью точно. Реальный сервопривод перегревается и слабеет, ремень растягивается, груз в схвате меняет центр масс, камера отдаёт кадр с задержкой.
Если политику учили в одной конкретной конфигурации, она выучивает эксплуатировать именно её — вплоть до артефактов численного интегратора. Перенос на другую динамику для такой политики выглядит как совершенно новая задача, которую она не видела.
Политика, выученная в одном идеальном мире, — это переобучение под симулятор. Задача переноса — заставить её работать в целом семействе миров, одним из которых окажется реальность.
Domain randomization: сделать реальность одним из случаев
Идея, которую в 2017 году продвинули команды из OpenAI и других лабораторий, простая. Вместо того чтобы бесконечно точно калибровать симулятор под реальность, вы делаете симуляцию нарочно разнообразной. В начале каждого эпизода параметры среды сэмплируются из заданных распределений: масса звена берётся из диапазона, трение — из диапазона, задержка команды — из диапазона.
Политика вынуждена стать робастной ко всему семейству динамик сразу. Если реальные параметры робота попадают внутрь этих диапазонов, реальный мир для сети выглядит просто как ещё один сэмпл, который она уже сотни раз проходила.
Что именно рандомизируют
- Динамика тел: массы, моменты инерции, положение центра масс звеньев и груза.
- Контакты: коэффициенты трения, упругость, демпфирование в местах соприкосновения.
- Приводы: максимальный момент, коэффициенты PD-регулятора, люфт, износ.
- Задержки и шум: латентность контура управления, шум датчиков положения и скорости.
- Внешние возмущения: случайные толчки по звеньям и по объекту, чтобы политика училась восстанавливаться.
Отдельно стоит визуальная рандомизация (текстуры, освещение, положение камеры) — она про перенос зрения, а не динамики, но в реальных проектах их обычно комбинируют.
Три подхода к разрыву симуляции и реальности
Dynamics randomization — не единственный инструмент. На практике его сочетают с калибровкой и адаптацией.
| Подход | Что делает | Слабое место |
|---|---|---|
| Точная калибровка (system identification) | Измеряет реальные параметры робота и настраивает симулятор под них | Дорого, параметры дрейфуют со временем, всё не измеришь |
| Dynamics randomization | Учит одну робастную политику на широком диапазоне динамик | Слишком широкие диапазоны дают осторожную, неоптимальную политику |
| Online-адаптация | Политика по истории наблюдений оценивает текущую динамику и подстраивается | Сложнее в обучении, нужен модуль оценки контекста |
Компромисс диапазона
Ключевая настройка — ширина распределений. Слишком узкие — реальный робот выпадает за границы, и перенос не работает. Слишком широкие — политика становится overly conservative: она движется медленно и с запасом, потому что готовится к худшему из всех возможных миров, и теряет в качестве на реальном железе.
Поэтому диапазоны обычно центрируют вокруг грубо измеренных реальных значений и расширяют настолько, чтобы накрыть неопределённость и дрейф, но не больше.
Адаптация вместо жёсткой робастности
Более свежая линия — не просто пережить любую динамику, а быстро понять текущую. Политике на вход дают не только текущее наблюдение, но и короткую историю движений и команд. Из этой истории вспомогательный модуль оценивает скрытый вектор параметров среды, и политика подстраивает поведение под него уже за первые доли секунды на реальном роботе.
Такой подход показал себя, в частности, на четвероногих роботах, которые учатся ходить целиком в симуляции и затем шагают по гравию, траве и лестницам без дообучения на месте. Историю наблюдений здесь используют как способ на лету распознать поверхность и состояние привода.
Что делать инженеру на практике
- Соберите базовую модель робота в симуляторе (MuJoCo, Isaac Sim, PyBullet) и грубо измерьте ключевые параметры — массы, трение, задержку контура.
- Начните с узкой рандомизации вокруг измеренных значений, чтобы убедиться, что задача вообще решается.
- Постепенно расширяйте диапазоны, отслеживая, не начинает ли политика деградировать в симуляции.
- Обязательно добавьте задержку команд и шум датчиков — их часто забывают, а именно они чаще всего убивают перенос.
- Тестируйте на реальном роботе рано и с ограничениями по скорости и моменту, чтобы неудачный перенос не сломал железо.
- Если политика на роботе осторожна и медленна — сузьте диапазоны или добавьте модуль адаптации к контексту.
Где это уже работает и где нет
Sim-to-real с рандомизацией уверенно закрывает локомоцию (ходьба четвероногих и двуногих), удержание равновесия, in-hand манипуляции с простыми объектами. Хуже переносится тонкая контактная манипуляция — сборка, вставка деталей с малыми зазорами, работа с деформируемыми материалами, где физика контакта в симуляторе сама по себе неточна, и никакая рандомизация не спасает от того, что модель контакта не совпадает с реальностью структурно.
Практический вывод простой: рандомизация лечит неопределённость параметров, но не лечит неверную модель физики. Если ваш симулятор в принципе не умеет считать нужный контакт, начинать надо с симулятора, а не с диапазонов.
Prompt-инженер: Идеальные запросы для Midjourney, ChatGPT и других моделей.
Спросить за 15 ₽Источники: OpenAI — Learning Dexterity, MuJoCo Documentation
Частые вопросы
Чем dynamics randomization отличается от visual domain randomization?
Насколько широкими делать диапазоны рандомизации?
Можно ли обойтись без реального робота на этапе обучения?
Почему политика на роботе движется медленно и осторожно?
Решает ли рандомизация задачи точной сборки и вставки деталей?
Материал носит информационный характер и подготовлен редакцией «Агентуры». Он не является офертой, рекламой или индивидуальной консультацией. Упомянутые продукты, компании и торговые знаки принадлежат их правообладателям. Перед принятием решений, влекущих юридические или финансовые последствия, обратитесь к профильному специалисту.