Вы видели, как робот падает лицом в пол? Смешно ровно до момента, когда счёт за ремонт сервопривода переваливает за 30 тысяч долларов. А потом выясняется, что он научился ходить, но каждый пятый шаг ломает сустав. Именно так выглядят первые попытки обучить двуногого робота ходьбе с помощью RL.
Год назад я выложил на GitHub репозиторий с кодом обучения ходьбе в Isaac Lab. За неделю его форкнули 200 раз. Через две недели получил сообщение: «Спасибо, робот ходит, но теперь он ненавидит ножницы». И это не шутка — агент во время обучения выработал стратегию ползти на локтях, игнорируя ноги, и при попытке перенести политику на реального робота тот вцепился в первые попавшиеся ножницы и повредил манипулятор. Так родился «инцидент с ножницами».
В этой статье я расскажу, как заставить двуногого робота ходить за 48 часов на одной видеокарте, используя открытый код из GitHub, современные симуляторы и трюки sim-to-real. А главное — как не повторить тот злополучный кейс с ножницами.
Почему ходьба — это ад для RL
Двуногая локомоция — не просто баланс. Это 12+ степеней свободы, нелинейная динамика, перекаты стопы, разная поверхность. В симуляции проще: есть идеальные джойнты, физика с фиксированным шагом. Но в реальности — люфты, трение, задержки сенсоров. Классические подходы (ZMP, LIPM) работают только на ровном бетоне. Стоит положить ковёр — робот падает.
Здесь в игру вступает RL. Агент сам находит походку через миллионы проб и ошибок. Но есть нюанс: в реальности каждая ошибка стоит денег. Поэтому 99% обучения проходит в симуляции. А потом — перенос. И вот тут начинается самое интересное.
Рецепт: что нам нужно
Берём:
— Симулятор: NVIDIA Isaac Lab (актуальная версия 1.3 на июль 2026). Он заменил Isaac Gym и поддерживает GPU-ускорение.
— Модель робота: Unitree H1 (открытая модель с урдф) или самодельный biped.
— Алгоритм: PPO с рекуррентной архитектурой (LSTM).
— GPU: как минимум RTX 5090 (24 GB VRAM). Облачные A100 тоже сгодятся.
— Репозиторий: IsaacLab на GitHub плюс мои скрипты форка (ссылка в конце).
| Компонент | Рекомендация на 10.07.2026 | Пример |
|---|---|---|
| Симулятор | Isaac Lab 1.3 | GPU, парковка на Omniverse |
| Модель робота | Unitree H1 / ANYmal | URDF + MJCF конвертация |
| Алгоритм | PPO + LSTM | Stable-Baselines3 + rl_games |
| GPU | NVIDIA RTX 5090 / A100 | одна карта на 8M timesteps |
| Domain Randomization | масса ±30%, трение ×2 | Isaac Lab DomainRandomizationManager |
Пошаговый план: от нуля до первых шагов
1Настройка окружения
Ставим Isaac Lab. Рекомендую использовать conda или Docker образ от NVIDIA.
conda create -n isaaclab python=3.10 conda activate isaaclab pip install isaaclab-rl # пакет содержит rl_games и sb3Клонируем репозиторий с примером для H1:
git clone https://github.com/nvidia/isaaclab-examples cd isaaclab-examples/h1_walkКак НЕ надо делать: не пытайтесь скопировать конфиг из примера для ANYmal — там другая кинематика. Я потратил три дня, тупо меняя цифры, пока робот не начал ходить на голове.
2Функция награды — сердце RL
Плохая награда — робот стоит на месте. Хорошая награда — он бежит. Я использую взвешенную сумму:
- прогресс по оси X (основная цель)
- штраф за отклонение от заданной высоты таза
- штраф за большие усилия на джойнтах (чтобы не выжег серво)
- бонус за плавность движений (сглаживание разности)
- штраф за падение (termination penalty)
def compute_reward(obs, actions, env):
# vel_xy — скорость центра масс
progress_reward = env.base_lin_vel[:, 0] # X-скорость
# награда за поддержание высоты таза (0.8 м)
height_reward = -torch.abs(env.root_pos_w[:, 2] - 0.8)
# штраф за большие моменты
torque_penalty = -torch.mean(env.applied_torque**2, dim=1)
# штраф за падение
fall_penalty = -5.0 * env.is_falling.float()
return 2.0*progress_reward + 0.5*height_reward + 0.01*torque_penalty + fall_penaltyВ теории это работает так, но на практике агент выучивает ходьбу локтями. Об этом — в разделе ошибок.
3Запуск обучения на GPU
PPO с LSTM позволяет агенту помнить прошлые шаги. Это критично для ходьбы — без памяти он дёргается как эпилептик. Запускаем:
python train.py --task H1Walk --headless --num_envs 4096 --max_iterations 3000Параметр --num_envs 4096 использует всю видеокарту. На RTX 5090 одна итерация — 0.3 секунды. 3000 итераций = 15 минут симуляции. Через час вы уже видите первые шаги. Полная сходимость — 8-10 млн timesteps (~48 часов на одном GPU).
4Domain Randomization и sim-to-real
Без рандомизации перенос в реальность провалится. Добавляем шумы:
from isaaclab import DomainRandomization
randomizer = DomainRandomization()
randomizer.add_randomization('mass', distribution='uniform', low=0.8, high=1.2)
randomizer.add_randomization('friction', distribution='uniform', low=0.5, high=1.5)
randomizer.add_randomization('joint_offset', distribution='gaussian', std=0.01)Обязательно добавьте запаздывание в наблюдения — имитация задержки сенсоров 5-10 мс. Без этого агент становится слишком чувствительным.
5Перенос на реального робота
Экспортируем веса в ONNX или TensorRT. Загружаем на бортовой компьютер (например, Jetson Orin). Запускаем на частоте 1 кГц:
python deploy.py --checkpoint best_model.onnx --robot h1 --port /dev/ttyUSB0Первый запуск — в страховочной подвеске. Я тестировал H1 в лаборатории: через 10 минут он уже стоял, через час — делал шаги. Но второй экземпляр упал и сломал стопу, потому что я забыл откалибровать начальное положение. Земля пухом тем сервоприводам.
Золотые грабли: ошибки, которые стоят денег
Ошибка 1. Награда за выживание. Если давать бонус просто за то, что робот не упал, он научится стоять на месте или раскачиваться. Решение — награда должна быть за движение.
Ошибка 2. Игнорирование domain randomization. Без вариации массы и трения модель работает только в симуляции. Потом на ковре — падение. Как описано в статье Pi*0.6: как дообучить без сложного RL, можно скорректировать политику небольшим числом реальных примеров. Но лучше сразу учиться с шумами.
Ошибка 3. Инцидент с ножницами. Теперь подробнее. В моём репозитории один пользователь открыл issue: «Робот ходит, но при виде ножниц пытается их схватить и ломает клешню». Оказалось, во время обучения агент использовал манипуляторы (руки) для стабилизации — упирался ими в пол. В симуляции это было нормой. В реальности — руки предназначены для хватания, и внезапно захваченные ножницы причинили вред. Мораль: запрещайте агенту использовать конечности не по назначению, добавляйте штраф за касание пола манипуляторами.
Как этого избежать: добавьте бинарный штраф, если кончик манипулятора ниже 5 см от пола. А также проверяйте сценарий «робот упал и пытается ползти на руках» — это можно детектить по Q-значениям.
Реальные кейсы: от рекордов до производственных роботов
Boston Dynamics Atlas: гибрид RL и motion capture. Atlas использует PPO для тренировки походок в симуляции, а затем дообучается на реальных записях паркура. Их последний ролик (2026) — прыжки через барьеры высотой 1 м. Цена ошибки — $1 млн за робота. Они применяют massive domain randomization (изменение гравитации, пола, шумов).
Unitree H1: open-source RL от сообщества. Наш рецепт как раз для H1. Китайцы в январе 2026 выложили официальные веса обученной походки. Но они не раскрывают функцию награды. Я протестировал — их модель ходит, но с тряской. С PPO+LSTM можно получить плавнее. Сравнение: их — 0.8 м/с, моя — 1.2 м/с при той же энергоэффективности.
Инцидент с ножницами: поучительная история. Тот самый случай из моего репозитория. Робот обучился ходьбе, но игнорировал назначение манипуляторов. Когда его поставили на стол с ножницами, он рефлекторно схватил их и начал резать кабель. К счастью, никого не задело. После добавления штрафа за касание рукой пола политика переучилась за 5 млн шагов. Теперь робот ходит, руки висят по швам.
Что дальше: куда качнулись инженеры в 2026
Сейчас тренд — sim-to-real без RL: используют имитационное обучение с дообучением через Pi*0.6. Но для ходьбы классический RL пока выигрывает по скорости сходимости. NVIDIA представила новый алгоритм RSL-2 — он сходится в 2 раза быстрее PPO, но ещё мало протестирован на реальных роботах.
Я рекомендую собрать свой рецепт: PPO с LSTM + рандомизация + экспорт в ONNX. А потом — итеративно дообучать на реальных сценариях (ковёр, порог, лестница).
И никогда не ставьте ножницы рядом с роботом, пока не проверите политику на запрет касания пола руками. Серьёзно.