Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Unitree G1: воспроизведение предсказательного CBF на ROCm

В этой главе воспроизводится путь управления predictive CBF [предсказательная функция барьера управления] из PAC-MAN и на модели Unitree G1 создаются видео уклонения всем телом. Полное обучение в исходном проекте состоит из mjlab, MuJoCo Warp, AMP [состязательный априорный моторный] и PPO [проксимальная оптимизация политики]. В этом учебнике сначала выносятся отдельно проверяемое безопасное управление и развёртывание стратегии ONNX [открытый формат обмена нейросетями] на AMD PyTorch.

Результаты главы

  • фиксированная траектория броска мяча и повтор позы всего тела G1;
  • статистика минимального зазора, столкновений, падений и режимов уклонения;
  • проверка входов и выходов стратегии ONNX или PyTorch;
  • команды для небольшого обучения, полного обучения и оценки фиксированной модели;
  • маршрут переноса MuJoCo Warp на AMD для статических и условных графов.

1. Загрузка исходного кода и ресурсов upstream

cd "$SRC_ROOT"
git clone https://github.com/lzyang2000/perceptive_cbf_rl.git
git clone https://github.com/Ethan-Chen-plus/radeon-physical-ai-evidence-suite.git

python -m pip install mujoco imageio imageio-ffmpeg onnxruntime

Репозиторий upstream содержит MJCF модели G1, сетки, данные движений и файл deploy/ckpts/dodge_link_cbf.onnx.

2. Путь управления CBF

Функция барьера управления задаёт запас безопасности h(x) до препятствия; безопасное множество — h(x) ≥ 0. В дискретном управлении слой безопасности выбирает действие u, ближайшее к номинальному u_nom, и при этом выполняет ограничение безопасности на следующем шаге:

minimize    ||u - u_nom||²
subject to  h(x_next(u)) ≥ (1 - α) h(x)

Параметр α задаёт скорость, с которой сужается запас безопасности. Link-CBF строит ограничение по расстоянию между звеном робота и мячом, Joint-CBF — в пространстве суставов.

Предсказательное управление выполняет последовательно:

  1. по положению и скорости мяча оценивает горизонтальную траекторию;
  2. определяет, приближается ли мяч, находится ли он в воздухе и вошёл ли в радиус восприятия;
  3. выбирает и фиксирует направление уклонения, перпендикулярное траектории мяча;
  4. проецирует номинальную скорость на безопасное полупространство с временным ограничением;
  5. передаёт безопасное действие стратегии G1 или контроллеру воспроизведения.

Этот тензорный расчёт можно запускать пакетно на ROCm [открытая платформа вычислений AMD].

3. Проверка управления на AMD

cd "$SRC_ROOT/radeon-physical-ai-evidence-suite"
python code/perceptive_cbf_rl_amd/amd_pacman_cbf_smoke.py \
  --output-dir "$RUN_ROOT/pacman/cbf_gate" \
  --episodes 12 \
  --device rocm

Результат содержит показатели безопасности при фиксированных seed [random seed], минимальный зазор и видео с двух точек обзора.

4. Повтор позы всего тела G1

export MUJOCO_GL=egl
python code/perceptive_cbf_rl_amd/g1_amd_dodge_replay.py \
  --upstream-xml "$SRC_ROOT/perceptive_cbf_rl/src/assets/robots/unitree_g1/xmls/scene_g1.xml" \
  --output-dir "$RUN_ROOT/pacman/g1_replay" \
  --episodes 8

Выходные файлы:

g1_replay/
├── eval_info.json
├── run_manifest.json
└── unitree-g1-predictive-cbf-amd-replay.mp4

При повторе с 8 фиксированными seed 8/8 эпизодов сохраняют безопасный зазор; минимальный зазор составляет около 0,42 м.

5. Инференс стратегии ONNX

python - <<'PY'
import onnxruntime as ort

path = "src/perceptive_cbf_rl/deploy/ckpts/dodge_link_cbf.onnx"
session = ort.InferenceSession(path, providers=["CPUExecutionProvider"])
for value in session.get_inputs():
    print(value.name, value.shape, value.type)
for value in session.get_outputs():
    print(value.name, value.shape, value.type)
PY

Если используется версия стратегии на PyTorch, вход — это 960-мерный признак, а выход покрывает 29 суставов. Перед запуском проверьте стек входных кадров, нормализацию, порядок суставов и частоту управления.

6. Полная конфигурация обучения

Обучение upstream состоит из mjlab, MuJoCo Warp, AMP и rsl_rl [библиотека обучения с подкреплением для роботов]. Перед обучением синхронизируйте зависимости и выведите список зарегистрированных сред:

cd "$SRC_ROOT/perceptive_cbf_rl"
uv sync
uv run python scripts/list_envs.py

Матрица обучения состоит из трёх видов входных данных о восприятии и трёх вариантов ограничения безопасности:

Вход восприятияБез барьераLink-CBF [CBF по звеньям]Joint-CBF [CBF по суставам]
state oracle [эталонное состояние]state_none.shstate_link.shstate_joint.sh
fixed camera [неподвижная камера]vision_none.shvision_link.shvision_joint.sh
gimbal camera [камера на подвесе]gimbal_none.shgimbal_link.shgimbal_joint.sh

Каждый скрипт по умолчанию использует 8192 параллельных среды и 25000 итераций; результаты статьи берутся из checkpoint на 20000-й итерации. Конфигурация vision_link.sh — та, которая разворачивается на реальном роботе и экспортирует deploy/ckpts/dodge_link_cbf.onnx.

6.1 Проверка обучения на малом масштабе

Сначала уменьшите число параллельных сред и итераций и проверьте загрузку ресурсов, рендеринг глубины, прямой проход стратегии, обратное распространение и сохранение checkpoint:

cd "$SRC_ROOT/perceptive_cbf_rl"
NUM_ENVS=64 ./train_runs/vision_link.sh \
  --agent.max-iterations=10 \
  --video False

В журнале обучения должны быть задача Unitree-G1-AMP-Dodge-Depth-Single-BallOnly-Flat, имя эксперимента vision_link_64 и постоянно обновляющийся loss [значение функции потерь]. Результаты записываются в:

logs/rsl_rl/vision_link_64/{run}/

Этот шаг проверяет только цепочку обучения; на его основе не следует сообщать процент успешного уклонения.

6.2 Полное обучение визуальной стратегии

Если памяти хватает, запускайте конфигурацию статьи напрямую:

cd "$SRC_ROOT/perceptive_cbf_rl"
NUM_ENVS=8192 ./train_runs/vision_link.sh

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

NUM_ENVS=1024 ./train_runs/vision_link.sh

Визуальная стратегия читает глубинное изображение с маской только для мяча (BallOnly masked depth), по умолчанию камера наклонена вверх на 20 градусов, а кадры берутся со смещениями (0,3,8,18). Установочный угол камеры, порядок суставов, частота управления и предобработка глубины при обучении и развёртывании должны совпадать.

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

NUM_ENVS=8192 ./train_runs/state_link.sh

6.3 Оценка фиксированного checkpoint

Upstream-статья сравнивает checkpoint на 20000-й итерации. Сначала определите каталог запуска и явно передайте файл модели:

cd "$SRC_ROOT/perceptive_cbf_rl"
export DODGE_CKPT="$(find logs/rsl_rl/vision_link -name model_20000.pt -print -quit)"
test -f "$DODGE_CKPT"
echo "$DODGE_CKPT"

uv run python scripts/dodge_benchmark.py \
  --only vision_link \
  --ckpt "$DODGE_CKPT"

DODGE_CKPT берёт первый найденный файл модели. Если для одного эксперимента было несколько запусков, сначала удалите старые результаты или явно выберите нужный файл по времени обучения. В режиме развёртывания между бросками вызывается стратегия ходьбы, которая возвращает G1 в стойку:

uv run python scripts/dodge_benchmark.py \
  --only vision_link \
  --walk-recover \
  --ckpt "$DODGE_CKPT"

Полная оценка матрицы из девяти вариантов запускается так:

uv run python scripts/dodge_benchmark.py

В оценке фиксируются число столкновений, число падений, минимальный безопасный зазор, режимы приседания, сдвига влево и вправо и задержка одного вызова инференса. Публичные видео можно выбирать из успешных эпизодов, но итоговая таблица статистики опирается на полный знаменатель при фиксированном checkpoint и фиксированных seed.

7. Маршрут переноса на AMD

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

УровеньПуть upstreamПуть на AMDКритерий проверки
PPO/AMPPyTorch на CUDAPyTorch на ROCmПрямой проход, обратный проход, обновление оптимизатора
Пакетная физикаMuJoCo Warp на CUDAMuJoCo Warp от AMD-EcosystemОшибка состояния и пропускная способность при одинаковых начальных состояниях
Условный графУсловные узлы CUDA GraphУсловные узлы HIP Graph [граф вычислений AMD]Попадание в ветки, эквивалентность физики и ускорение
Развёртывание стратегииONNX RuntimeONNX Runtime или PyTorch на ROCmФорма входа, порядок суставов и задержка

Сначала загрузите Warp и MuJoCo Warp, поддерживаемые AMD:

cd "$SRC_ROOT"
git clone https://github.com/AMD-Ecosystem/warp.git warp-amd
git clone https://github.com/AMD-Ecosystem/mujoco_warp.git mujoco-warp-amd

Окружение обучения AMD должно быть изолировано от окружения воспроизведения, чтобы разные версии API MuJoCo не перезаписывали друг друга. Рекомендуемая последовательность в новом окружении:

  1. проверка матричных вычислений, обратного распространения и оптимизатора на ROCm PyTorch;
  2. загрузка ресурсов MJCF для G1 и шаг MuJoCo для одной среды;
  3. проверка обучения на статическом графе с 64 параллельными средами;
  4. проверка эквивалентности условного решателя capture_while и ветвления спящих островов capture_if;
  5. сравнение пропускной способности для трёх режимов: пошаговый, статический граф и условный граф;
  6. затем расширение числа параллельных сред до 1024 или до объёма, который устройство выдерживает стабильно.

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

8. Метрики оценки

МетрикаСмысл
safe episode [безопасный эпизод]За весь эпизод ни разу не было столкновения с мячом и падения
minimum clearance [минимальный зазор]Наименьшее расстояние между траекторией мяча и безопасной оболочкой тела
inference latency [задержка инференса]Время одного вызова CBF или стратегии
moving joints [число движущихся суставов]Стратегия действительно использует всё тело, а не подменяет его переносом
dodge mode [режим уклонения]Приседание, сдвиг влево, сдвиг вправо или составное движение

9. Официальные материалы