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 — в пространстве суставов.
Предсказательное управление выполняет последовательно:
- по положению и скорости мяча оценивает горизонтальную траекторию;
- определяет, приближается ли мяч, находится ли он в воздухе и вошёл ли в радиус восприятия;
- выбирает и фиксирует направление уклонения, перпендикулярное траектории мяча;
- проецирует номинальную скорость на безопасное полупространство с временным ограничением;
- передаёт безопасное действие стратегии 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.sh | state_link.sh | state_joint.sh |
| fixed camera [неподвижная камера] | vision_none.sh | vision_link.sh | vision_joint.sh |
| gimbal camera [камера на подвесе] | gimbal_none.sh | gimbal_link.sh | gimbal_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/AMP | PyTorch на CUDA | PyTorch на ROCm | Прямой проход, обратный проход, обновление оптимизатора |
| Пакетная физика | MuJoCo Warp на CUDA | MuJoCo Warp от AMD-Ecosystem | Ошибка состояния и пропускная способность при одинаковых начальных состояниях |
| Условный граф | Условные узлы CUDA Graph | Условные узлы HIP Graph [граф вычислений AMD] | Попадание в ветки, эквивалентность физики и ускорение |
| Развёртывание стратегии | ONNX Runtime | ONNX 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 не перезаписывали друг друга. Рекомендуемая последовательность в новом окружении:
- проверка матричных вычислений, обратного распространения и оптимизатора на ROCm PyTorch;
- загрузка ресурсов MJCF для G1 и шаг MuJoCo для одной среды;
- проверка обучения на статическом графе с 64 параллельными средами;
- проверка эквивалентности условного решателя
capture_whileи ветвления спящих острововcapture_if; - сравнение пропускной способности для трёх режимов: пошаговый, статический граф и условный граф;
- затем расширение числа параллельных сред до 1024 или до объёма, который устройство выдерживает стабильно.
Ускорение условного графа учитывается только вместе с порогом ошибки физического состояния. Рост пропускной способности при постоянном дрейфе положения робота или состояния контакта не считается эквивалентным обучением.
8. Метрики оценки
| Метрика | Смысл |
|---|---|
| safe episode [безопасный эпизод] | За весь эпизод ни разу не было столкновения с мячом и падения |
| minimum clearance [минимальный зазор] | Наименьшее расстояние между траекторией мяча и безопасной оболочкой тела |
| inference latency [задержка инференса] | Время одного вызова CBF или стратегии |
| moving joints [число движущихся суставов] | Стратегия действительно использует всё тело, а не подменяет его переносом |
| dodge mode [режим уклонения] | Приседание, сдвиг влево, сдвиг вправо или составное движение |