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

Модель обучают в симуляторе за несколько часов на одном GPU вместо недель дорогих испытаний с реальным роботом. А потом переносят политику на железо — и манипулятор промахивается мимо кубика, четвероногий робот заваливается на бок, дрон врезается в стену. Этот провал называют reality gap, разрывом между симуляцией и реальностью, и именно он определяет, полетит ли ваш проект в продакшн или останется красивым видео в симуляторе.
Обобщение из симуляции — это не «обучить и надеяться». Это набор инженерных приёмов, которые заставляют политику работать не в одной идеальной вселенной, а в облаке слегка разных вселенных, среди которых где-то прячется и реальный мир.
Почему симуляция врёт
Симулятор физики — это приближение. Он не знает точной массы вашего робота с точностью до грамма, не моделирует люфт в редукторе, задержку в передаче команд, шум датчиков и трение резины о конкретный линолеум. Каждое из этих упрощений по отдельности мелочь. Вместе они дают политику, которая переобучилась на артефакты симулятора.
Классический пример из робототехники: политика научилась использовать баг движка — например, «проскальзывать» сквозь текстуру объекта, потому что коллизии в симуляторе рассчитаны грубо. В реальности такого бага нет, и стратегия рассыпается. Модель нашла решение задачи, которое существует только в симуляции.
Симуляция не обязана быть точной. Она обязана быть достаточно разнообразной, чтобы реальный мир оказался внутри распределения, на котором обучалась модель.
Domain randomization: не одна физика, а тысяча
Главный рабочий приём — рандомизация домена[1]. Вместо того чтобы точно калибровать симулятор под реальность, вы случайным образом варьируете его параметры при каждом запуске обучения: массу звеньев, коэффициенты трения, задержки управления, освещение и текстуры для камер, шум сенсоров.
Логика такая: если политика умеет решать задачу при трении от 0,4 до 1,2 и при массе, отличающейся на ±20%, то реальное трение и реальная масса почти наверняка попадут в этот диапазон. Реальность становится просто ещё одним сэмплом из обучающего распределения.
Что обычно рандомизируют:
- Динамика — масса, инерция, трение, демпфирование суставов, задержки исполнения команд.
- Визуал — текстуры, освещение, положение камеры, фон, шум изображения (актуально для vision-based политик).
- Сенсоры — шум, дрейф, частичные пропуски данных, квантование.
- Возмущения — случайные внешние силы, толчки, подложенные под ноги неровности.
Известная работа OpenAI по обучению манипуляции кубиком Рубика на роботизированной руке Shadow Hand строилась именно на агрессивной рандомизации динамики и визуала. Политика, обученная целиком в симуляции, переносилась на реальную руку без дообучения на железе.
Обратная сторона: цена разнообразия
Чем шире диапазон рандомизации, тем сложнее задача обучения. Слишком широкие границы — и политика становится осторожной, консервативной, теряет в производительности, потому что готовится к худшему сценарию из всех возможных. Слишком узкие — и разрыв sim-to-real не закрывается. Подбор границ — это отдельная инженерная работа, а не гиперпараметр по умолчанию.
Automatic domain randomization
Ручной подбор диапазонов не масштабируется. Отсюда идея автоматической рандомизации (ADR): начинать с узкого распределения и постепенно расширять его по мере того, как политика справляется. Границы двигаются наружу только тогда, когда агент уверенно решает текущий уровень сложности.
Это похоже на curriculum learning[2]: сначала лёгкие условия, потом всё труднее. Плюс в том, что вы не гадаете диапазоны заранее — система сама находит границу, за которой политика перестаёт справляться, и держится около неё.
Три стратегии закрыть разрыв
| Подход | Что делает | Когда выбирать |
|---|---|---|
| Domain randomization | Варьирует параметры симуляции, чтобы реальность попала в распределение | Когда реальные данные дорогие или их нет вовсе |
| System identification | Точно калибрует симулятор под конкретное железо | Когда есть доступ к роботу и можно измерить его параметры |
| Domain adaptation | Дообучает или подстраивает политику на небольшом объёме реальных данных | Когда немного реальных данных доступно, но не миллионы |
На практике их комбинируют. Грубая калибровка сужает пространство поиска, рандомизация даёт запас прочности, а короткая фаза дообучения на реальных данных снимает остаточный разрыв. Ни один из подходов сам по себе не серебряная пуля.
Как это выглядит в пайплайне
- Собрать симуляцию задачи в физическом движке (MuJoCo, Isaac Sim, PyBullet — выбор зависит от задачи и от того, нужна ли параллельная симуляция тысяч сред на GPU).
- Определить, какие параметры рандомизировать и в каких границах — начать узко.
- Обучить политику (обычно RL-алгоритмом вроде PPO) на распределении сред, а не на одной.
- Расширять диапазоны по мере роста надёжности — вручную или через ADR.
- Проверить на реальном железе и измерить разрыв: где именно политика деградирует.
- При необходимости добавить рандомизацию по этим осям или короткое дообучение на реальных данных.
Ключевая метрика здесь — не производительность в симуляции, а именно величина разрыва между симуляцией и реальностью. Политика с блестящими цифрами в симуляторе и провалом на железе хуже, чем скромная политика, которая ведёт себя одинаково в обоих мирах.
За пределами робототехники
Тот же принцип работает шире. Автономное вождение обучают в симуляторах вроде CARLA, потому что собрать реальные примеры редких аварийных ситуаций дорого и опасно. Синтетические данные для компьютерного зрения — рендеры сцен вместо ручной разметки фотографий — это та же идея: генерировать разнообразие дёшево и надеяться, что реальность окажется внутри него.
Общая ловушка тоже одна на всех: модель, обученная только на синтетике, ловит статистические артефакты рендера или движка. Поэтому чистый sim-to-real почти всегда дополняют хотя бы небольшой порцией реальных данных для проверки и калибровки.
[1] Domain randomization — приём, при котором параметры обучающей среды случайно варьируются, чтобы обученная модель не зависела от конкретных значений и обобщалась на новые, невиданные ранее условия.
[2] Curriculum learning — стратегия обучения, при которой задачи подаются модели по нарастанию сложности: от простых к трудным, как учебная программа.
Prompt-инженер: Идеальные запросы для Midjourney, ChatGPT и других моделей.
Спросить за 15 ₽Источники: OpenAI — Solving Rubik's Cube with a Robot Hand, NVIDIA Isaac Sim Documentation
Частые вопросы
Можно ли перенести политику из симуляции на робота вообще без реальных данных?
Чем domain randomization отличается от простого добавления шума в данные?
Какой симулятор выбрать для sim-to-real?
Почему широкая рандомизация иногда ухудшает результат?
Подходит ли этот подход не для роботов, а для обычных ML-задач?
Как понять, что разрыв sim-to-real закрыт?
Материал носит информационный характер и подготовлен редакцией «Агентуры». Он не является офертой, рекламой или индивидуальной консультацией. Упомянутые продукты, компании и торговые знаки принадлежат их правообладателям. Перед принятием решений, влекущих юридические или финансовые последствия, обратитесь к профильному специалисту.