在人形机器人,如何高效地训练和部署强化学习策略成为关键挑战,Holosoma作提供了解决方案。
本文将深入剖析Holosoma的技术架构、核心代码算法实现及创新设计,包括代码分析、代码复现。
开源地址:https://github.com/amazon-far/holosoma
G1机器人全身跟踪训练后,跳舞的示例效果: 
速度跟踪,示例效果: 
一、项目概述
Holosoma 是一个专注于人形机器人强化学习的综合框架,旨在统一训练、部署和运动重定向工作流。其核心目标是解决人形机器人控制中的关键挑战:数据效率、训练稳定性和sim-to-real迁移能力。
核心功能
- 多模拟器支持:IsaacGym、IsaacSim、MuJoCo Warp (MJWarp)、MuJoCo
- 强化学习算法:PPO 和 FastSAC,针对人形机器人专门优化
- 机器人支持:Unitree G1 和 Booster T1 人形机器人
- 任务类型:
- 运动控制(速度跟踪,输入线速度、角速度等,输出电机信号)
- 全身跟踪(whole-body tracking,学习一套动作,比如跳舞)
- 部署能力:支持 sim-to-sim 和 sim-to-real 部署
- 运动重定向:将人类动作捕捉数据转换为机器人动作,保留与物体和地形的交互
技术栈
- Python (96.7%) – 主要开发语言
- Shell (2.9%) – 用于脚本和自动化
- 核心依赖:IsaacGym、MuJoCo、Wandb、PyTorch、Tyro
二、代码架构设计
Holosoma采用模块化设计,代码结构清晰且高度可扩展:
src/
├── holosoma/ # 核心训练框架
├── holosoma_inference/ # 推理和部署管道
└── holosoma_retargeting/ # 运动重定向模块
核心模块详解
src/holosoma/
├── train_agent.py # 核心训练入口
├── eval_agent.py # 模型评估
├── replay.py # 动作重放和可视化
├── config/ # 配置系统
│ ├── __init__.py
│ ├── experiment.py # 实验配置预设
│ ├── simulator.py # 模拟器配置
│ ├── algorithm.py # 算法配置
│ └── task.py # 任务配置
├── envs/ # 环境实现
│ ├── locomotion/ # 运动控制环境
│ ├── whole_body_tracking/ # 全身跟踪环境
│ └── base_env.py # 环境基类
├── algorithms/ # 强化学习算法
│ ├── ppo.py # PPO实现
│ ├── fast_sac.py # FastSAC实现
│ └── base_algorithm.py # 算法基类
└── utils/ # 工具函数
├── logger.py # 日志记录
├── video.py # 视频录制
└── curriculum.py # 课程学习
配置系统设计
Holosoma采用分层配置系统,使用Tyro库实现命令行参数解析,提供灵活的实验管理:
# 配置层次结构示例
exp:g1–29dof–fast–sac # 基础实验配置
simulator:isaacgym # 模拟器配置
logger:wandb # 日志配置
––training.seed 1 # 具体参数覆盖
关键设计特点:
- 预设优先:实验配置(exp:)必须在其他配置片段之前声明
- 动态覆盖:命令行参数可以覆盖任何配置层级
- 类型安全:使用Python类型注解确保配置正确性
三、核心算法实现
PPO (Proximal Policy Optimization) 算法
PPO是人形机器人运动控制的稳定选择,Holosoma的实现针对高维控制进行了优化:
class PPOAlgorithm:
def __init__(self, cfg, actor_critic, device):
self.actor_critic = actor_critic
self.gamma = cfg.gamma # 折扣因子
self.lam = cfg.lam # GAE lambda参数
self.clip_range = cfg.clip_range # PPO裁剪范围
self.value_coef = cfg.value_coef # 价值函数系数
self.entropy_coef = cfg.entropy_coef # 熵正则化系数
self.max_grad_norm = cfg.max_grad_norm
self.device = device
# 优化器配置
self.optimizer = torch.optim.Adam(
self.actor_critic.parameters(),
lr=cfg.learning_rate,
eps=cfg.adam_eps
)
人形机器人特定优化
- 对称性约束:利用人形机器人的左右对称性,减少学习难度
- 历史观测堆叠:整合过去多帧观测,提高状态估计准确性
- 课程学习:逐步增加任务难度,从简单地形到复杂环境
- 价值函数裁剪:稳定价值估计,防止训练崩溃
FastSAC (Fast Soft Actor-Critic) 算法
FastSAC是SAC算法的高效变体,专为数据效率和训练速度优化,特别适合全身跟踪任务:
class FastSACAlgorithm:
def __init__(self, cfg, actor, critic1, critic2, device):
self.actor = actor
self.critic1 = critic1
self.critic2 = critic2
self.target_critic1 = copy.deepcopy(critic1)
self.target_critic2 = copy.deepcopy(critic2)
# 自动调节熵温度
self.log_alpha = torch.zeros(1, requires_grad=True, device=device)
self.alpha_optimizer = torch.optim.Adam([self.log_alpha], lr=cfg.alpha_lr)
# 优化器
self.actor_optimizer = torch.optim.Adam(actor.parameters(), lr=cfg.actor_lr)
self.critic_optimizer = torch.optim.Adam(
list(critic1.parameters()) + list(critic2.parameters()),
lr=cfg.critic_lr
)
self.gamma = cfg.gamma
self.tau = cfg.tau # 目标网络软更新系数
self.target_entropy = –torch.prod(torch.tensor(cfg.action_space.shape)).item()
人形机器人优化特性
- 批量归一化:加速训练收敛,提高稳定性
- 优先级经验回放:重点关注高误差样本,提升样本效率
- 域随机化集成:在训练中自动应用随机化,提高泛化性
- 多GPU支持:使用Distributed Data Parallel进行大规模训练,支持单GPU 15分钟收敛目标
算法对比与选择指南
| 数据效率 | 中等 | 高 |
| 训练稳定性 | 高 | 中等 |
| 收敛速度 | 慢 | 快 |
| 样本复杂度 | 高 | 低 |
| 超参数敏感性 | 低 | 中等 |
| 人形机器人适用性 | 运动控制 | 全身跟踪 |
选择PPO当:
- 需要稳定的训练过程
- 计算资源充足,可以收集大量样本
- 任务相对简单,如基本运动控制
- 对超参数调优经验不足
选择FastSAC当:
- 需要快速收敛(15分钟训练目标)
- 计算资源有限(单RTX 4090 GPU)
- 任务复杂,需要高效利用样本
- 有经验进行超参数调优
- 需要良好的sim-to-real迁移性能
四、奖励函数设计
奖励函数是人形机器人强化学习的核心,Holosoma提供了模块化、可配置的奖励系统。
运动控制(速度跟踪)奖励函数
def compute_locomotion_reward(self, obs, actions, dones):
rewards = {}
# 1. 线速度跟踪奖励
lin_vel_error = torch.sum(torch.square(self.commands[:, :2] – self.base_lin_vel[:, :2]), dim=1)
rewards['tracking_lin_vel'] = torch.exp(–lin_vel_error / self.cfg.reward_tracking_sigma)
# 2. 角速度跟踪奖励
ang_vel_error = torch.square(self.commands[:, 2] – self.base_ang_vel[:, 2])
rewards['tracking_ang_vel'] = torch.exp(–ang_vel_error / self.cfg.reward_tracking_sigma)
# 3. 姿态奖励(保持直立)
z_axis = quat_rotate_inverse(self.base_quat, self.grav_vec)
rewards['orientation'] = torch.exp(–torch.sum(torch.square(z_axis[:, :2]), dim=1) / 0.25)
# 4. 能量效率奖励
torque_reward = torch.sum(torch.square(self.torques), dim=1)
rewards['torque'] = torch.exp(–torque_reward / self.cfg.reward_torque_sigma)
# 5. 平滑性奖励
action_rate = torch.sum(torch.square(actions – self.last_actions), dim=1)
rewards['action_rate'] = torch.exp(–action_rate / self.cfg.reward_action_rate_sigma)
# 6. 足部接触时间奖励
contact_reward = self._compute_feet_air_time_reward()
rewards['feet_air_time'] = contact_reward
# 7. 终止惩罚
rewards['termination'] = self._compute_termination_penalty(dones)
# 加权总和
total_reward = sum(self.cfg.reward_weights[k] * v for k, v in rewards.items())
return total_reward, rewards
全身跟踪(Whole-Body Tracking)奖励函数
def compute_wholebody_reward(self, obs, reference_motion):
rewards = {}
# 1. 根位置跟踪
root_pos_error = torch.sum(torch.square(self.root_pos – reference_motion.root_pos), dim=1)
rewards['root_position'] = torch.exp(–root_pos_error / 0.25)
# 2. 根朝向跟踪
root_rot_error = quat_distance(self.root_rot, reference_motion.root_rot)
rewards['root_orientation'] = torch.exp(–root_rot_error / 0.1)
# 3. 关节位置跟踪
joint_pos_error = torch.sum(torch.square(self.dof_pos – reference_motion.dof_pos), dim=1)
rewards['joint_positions'] = torch.exp(–joint_pos_error / 0.5)
# 4. 关节速度跟踪
joint_vel_error = torch.sum(torch.square(self.dof_vel – reference_motion.dof_vel), dim=1)
rewards['joint_velocities'] = torch.exp(–joint_vel_error / 1.0)
# 5. 末端执行器跟踪
ee_pos_error = self._compute_end_effector_error(reference_motion)
rewards['end_effector'] = torch.exp(–ee_pos_error / 0.1)
# 6. 运动连续性奖励
motion_continuity = self._compute_motion_continuity_reward()
rewards['motion_continuity'] = motion_continuity
# 7. 任务完成奖励
task_completion = self._compute_task_completion_reward(reference_motion)
rewards['task_completion'] = task_completion
# 加权组合
total_reward = sum(self.cfg.reward_weights[k] * v for k, v in rewards.items())
return total_reward, rewards
高级奖励特性
- 相位感知奖励:根据运动周期的相位调整奖励权重
- 关键帧重点奖励:对重要动作帧给予更高权重
- 对称性奖励:鼓励左右对称的运动
- 接触一致性奖励:确保足部接触与参考运动一致
- 课程学习集成:动态调整奖励权重,根据学习进度增加难度
五、其他设计
域随机化 (Domain Randomization)
class DomainRandomizer:
def __init__(self, cfg):
self.randomization_terms = cfg.randomization.setup_terms
def apply_randomization(self, env):
"""在每次重置时应用随机化"""
if self.randomization_terms.push_randomizer.enabled:
self._apply_push_randomization(env)
if self.randomization_terms.mass_randomizer.enabled:
self._apply_mass_randomization(env)
if self.randomization_terms.friction_randomizer.enabled:
self._apply_friction_randomization(env)
def _apply_push_randomization(self, env):
"""随机推力模拟外部扰动"""
if np.random.random() < self.randomization_terms.push_randomizer.probability:
force_magnitude = np.random.uniform(*self.randomization_terms.push_randomizer.force_range)
force_direction = np.random.uniform(0, 2*np.pi)
env.apply_external_force(force_magnitude, force_direction)
课程学习 (Curriculum Learning)
class PenaltyCurriculum:
def __init__(self, cfg):
self.current_level = 0
self.level_up_threshold = cfg.level_up_threshold
self.max_level = cfg.max_level
def update(self, episode_rewards):
"""基于性能自动调整课程难度"""
avg_reward = np.mean(episode_rewards[–100:])
if avg_reward > self.level_up_threshold and self.current_level < self.max_level:
self.current_level += 1
self._update_environment_difficulty()
return True
return False
def _update_environment_difficulty(self):
"""调整环境参数增加难度"""
difficulty_factor = self.current_level / self.max_level
self.env.set_terrain_complexity(difficulty_factor)
self.env.set_command_range(difficulty_factor)
self.env.set_perturbation_magnitude(difficulty_factor)
性能优化关键点
-
模拟器特定优化:
- IsaacGym: 利用GPU并行,支持16K+环境
- MJWarp: GPU加速的MuJoCo,平衡性能和物理精度
- IsaacSim: 高保真渲染,适合视觉输入任务
-
内存优化:
# 经验回放缓冲区优化
class OptimizedReplayBuffer:
def __init__(self, max_size, obs_shape, action_shape):
# 预分配内存
self.observations = torch.zeros(max_size, *obs_shape, dtype=torch.float32)
self.actions = torch.zeros(max_size, *action_shape, dtype=torch.float32)
self.rewards = torch.zeros(max_size, 1, dtype=torch.float32)
self.dones = torch.zeros(max_size, 1, dtype=torch.bool)
self.ptr = 0
self.size = 0
self.max_size = max_size
六、部署与实践指南
环境搭建
根据使用场景,需要选择合适的安装脚本:(以下有四个环境,需要分别进行搭建;官网中还有其他环境,就不推荐了,下面的够用了)
# For IsaacSim training
# Requires Ubuntu 22.04 or later due to IsaacSim dependencies
bash scripts/setup_isaacsim.sh
# For MJWarp training and MuJoCo simulation (inference) — conda
bash scripts/setup_mujoco.sh
# For inference/deployment
bash scripts/setup_inference.sh
# For motion retargeting
bash scripts/setup_retargeting.sh
在安装 isaacsim 可能会出错,需要修改安装文件,setup_isaacsim.sh 文件参考如下:
#!/usr/bin/env bash
# Exit on error, and print commands
set -ex
# 多重环境变量隔离,彻底屏蔽IsaacSim路径污染conda启动
unset PYTHONPATH
unset OMNI_PYTHONPATH
unset ISAACSIM_PATH
unset CARB_APP_PATH
SCRIPT_DIR=$( cd — "$( dirname — "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
ROOT_DIR=$(dirname "$SCRIPT_DIR")
if ! command -v sudo &> /dev/null; then
echo "Warning: sudo could not be found, you may need to run this script with sudo"
function sudo { "$@"; }
export -f sudo
fi
# 环境名默认 hssim
CONDA_ENV_NAME=${CONDA_ENV_NAME:-hssim}
echo "conda environment name is set to: $CONDA_ENV_NAME"
source ${SCRIPT_DIR}/source_common.sh
ENV_ROOT=$CONDA_ROOT/envs/$CONDA_ENV_NAME
SENTINEL_FILE=${WORKSPACE_DIR}/.env_setup_finished_$CONDA_ENV_NAME
echo "SENTINEL_FILE: $SENTINEL_FILE"
mkdir -p $WORKSPACE_DIR
if [[ ! -f $SENTINEL_FILE ]]; then
# 安装miniconda – 清华镜像下载,速度更快
if [[ ! -d $CONDA_ROOT ]]; then
mkdir -p $CONDA_ROOT
curl https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/Miniconda3-latest-Linux-x86_64.sh -o $CONDA_ROOT/miniconda.sh
bash $CONDA_ROOT/miniconda.sh -b -u -p $CONDA_ROOT
rm $CONDA_ROOT/miniconda.sh
fi
if [[ ! -d $ENV_ROOT ]]; then
# 静默安装配置
$CONDA_ROOT/bin/conda config –set always_yes yes
# 清空旧源配置,容错处理:无配置时不报错终止
$CONDA_ROOT/bin/conda config –remove-key channels 2>/dev/null || true
# 清华大学TUNA全量conda镜像
$CONDA_ROOT/bin/conda config –add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
$CONDA_ROOT/bin/conda config –add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r
$CONDA_ROOT/bin/conda config –add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge
$CONDA_ROOT/bin/conda config –set show_channel_urls yes
$CONDA_ROOT/bin/conda config –set channel_priority strict
# 安装mamba加速环境创建
if [[ ! -f $CONDA_ROOT/bin/mamba ]]; then
$CONDA_ROOT/bin/conda install -y mamba -n base
fi
MAMBA_ROOT_PREFIX=$CONDA_ROOT $CONDA_ROOT/bin/mamba create -y -n $CONDA_ENV_NAME python=3.11
fi
source $CONDA_ROOT/bin/activate $CONDA_ENV_NAME
# conda系统依赖
conda install -y ffmpeg libiconv libglu
# PyTorch & IsaacSim
pip install –upgrade pip
pip install -U torch==2.7.0 torchvision==0.22.0 –index-url https://download.pytorch.org/whl/cu128
pip install pyperclip
pip install "isaacsim[all,extscache]==5.1.0" –extra-index-url https://pypi.nvidia.com
# GitHub国内加速克隆IsaacLab
if [[ ! -d $WORKSPACE_DIR/IsaacLab ]]; then
git clone https://github.com/isaac-sim/IsaacLab.git –branch v2.3.0 $WORKSPACE_DIR/IsaacLab
fi
sudo apt install -y cmake build-essential
cd $WORKSPACE_DIR/IsaacLab
# IsaacLab官方兼容补丁
pip install 'setuptools<81'
echo 'setuptools<81' > build-constraints.txt
export PIP_BUILD_CONSTRAINT="$(realpath build-constraints.txt)"
sed -i 's/flatdict==4.0.1/flatdict==4.1.0/' source/isaaclab/setup.py
export CMAKE_POLICY_VERSION_MINIMUM=3.5
export OMNI_KIT_ACCEPT_EULA=${OMNI_KIT_ACCEPT_EULA:-1}
./isaaclab.sh –install
unset PIP_BUILD_CONSTRAINT
# 安装holosoma本地包
pip install -U pip
pip install -e $ROOT_DIR/src/holosoma[unitree,booster]
pip install –upgrade 'wandb>=0.21.1'
touch $SENTINEL_FILE
fi
其他环境的安装,基本每什么太大问题,就是修改conda、mamba、uv等为国内源,进行加速安装即可
训练示例
主要参考:https://github.com/amazon-far/holosoma/blob/main/src/holosoma/README.md
A、速度跟踪(训练机器人跟踪速度指令)
下面是关键的两条指令:
# 1、进入训练的环境,isaacsim中
source scripts/source_isaacsim_setup.sh
# 2、启动速度跟踪训练
# 机器人:Unitree G1 29 、Booster T1
# 不同形态,其中exp参数:g1-29dof-fast-sac , g1-29dof , g1-23dof , t1-29dof-fast-sac , t1-29dof
python src/holosoma/holosoma/train_agent.py \\
exp:g1-29dof \\
simulator:isaacsim \\
logger:wandb \\
–training.seed 1
或者编写一个sh基本,进行快速进入环境,并进行训练,比如:run_train.sh
#!/bin/bash
set -ex
# 屏蔽isaacsim污染变量
unset PYTHONPATH OMNI_PYTHONPATH ISAACSIM_PATH CARB_APP_PATH
# 激活环境
source scripts/source_isaacsim_setup.sh
export PYTHONNOUSERSITE=1
# 强制优先系统ffmpeg
export PATH="/usr/bin:$PATH"
# 校验ffmpeg
ffmpeg -version
# 启动训练1
# 速度跟踪(训练机器人跟踪速度指令)
# 机器人:Unitree G1 29 、Booster T1
# 不同形态:g1-29dof-fast-sac , g1-29dof , g1-23dof , t1-29dof-fast-sac , t1-29dof
python src/holosoma/holosoma/train_agent.py \\
exp:g1-29dof \\
simulator:isaacsim \\
logger:wandb \\
–training.seed 1
训练过程,可以在wandb中查看: 
才训练了5000多轮,整体效果不错了(官网默认,推荐训练25000轮的 ) 
B、全身追踪(训练机器人跟踪全身运动序列)
下面是关键的两条指令:
# 1、进入训练的环境,isaacsim中
source scripts/source_isaacsim_setup.sh
# 2、全身追踪(训练机器人跟踪全身运动序列)
# 机器人:Unitree G1 29
# 不同形态:g1-29dof-wbt-fast-sac (FastSAC), g1-29dof-wbt (PPO)
# 可视化预览:使用 replay.py 在训练前查看动作
python src/holosoma/holosoma/train_agent.py \\
exp:g1-29dof-wbt \\
simulator:isaacsim \\
logger:wandb \\
algo:ppo \\
–training.seed 1 \\
# –training.num-envs 2048 # 默认是4096
或者编写一个sh基本,进行快速进入环境,并进行训练,比如:run_train_wbt.sh
#!/bin/bash
set -ex
# 屏蔽isaacsim污染变量
unset PYTHONPATH OMNI_PYTHONPATH ISAACSIM_PATH CARB_APP_PATH
# 激活环境
source scripts/source_isaacsim_setup.sh
export PYTHONNOUSERSITE=1
# 强制优先系统ffmpeg
export PATH="/usr/bin:$PATH"
# 校验ffmpeg
ffmpeg -version
# 启动训练2
# 全身追踪(训练机器人跟踪全身运动序列)
# 机器人:Unitree G1 29
# 不同形态:g1-29dof-wbt-fast-sac (FastSAC), g1-29dof-wbt (PPO)
# 可视化预览:使用 replay.py 在训练前查看动作
python src/holosoma/holosoma/train_agent.py \\
exp:g1-29dof-wbt \\
simulator:isaacsim \\
logger:wandb \\
algo:ppo \\
–training.seed 1 \\
# –training.num-envs 2048
训练过程,可以在wandb中查看: 
全身追踪训练的效果看起来还可以,但是在仿真验证后,发现挺差的,经常摔倒;即使训练了3万轮,也是这个样,诶。。。。。。
七、仿真验证
在完成训练后,需要在仿真环境中验证策略的效果。
Holosoma支持两种主要的仿真验证工作流:速度跟踪(Locomotion)和全身跟踪(Whole Body Tracking)。以下详细说明两种验证流程。
速度跟踪参考:https://github.com/amazon-far/holosoma/blob/main/src/holosoma_inference/docs/workflows/sim-to-sim-locomotion.md
全身跟踪参考:https://github.com/amazon-far/holosoma/blob/main/src/holosoma_inference/docs/workflows/sim-to-sim-wbt.md
7.1 速度跟踪仿真验证
速度跟踪验证用于测试机器人在MuJoCo环境中执行速度指令的能力。该工作流允许在MuJoCo中回放IsaacSim/IsaacGym训练的运动控制策略。
前提条件
- 已配置MuJoCo环境(scripts/source_mujoco_setup.sh)
- 已配置Holosoma推理环境(scripts/source_inference_setup.sh)
- 准备好ONNX模型检查点
- 键盘或游戏手柄用于控制(在同一台机器上运行时,始终使用–task.interface lo参数)
验证流程
Unitree G1 (29-DOF) 验证步骤
1. 启动MuJoCo环境 在第一个终端中,启动MuJoCo仿真环境:
# 键盘控制模式
source scripts/source_mujoco_setup.sh
python src/holosoma/holosoma/run_sim.py robot:g1-29dof
# 或游戏手柄控制模式
source scripts/source_mujoco_setup.sh
python src/holosoma/holosoma/run_sim.py robot:g1-29dof \\
–simulator.config.bridge.enabled=True \\
–simulator.config.bridge.use-joystick=True
机器人将在模拟器中生成,悬挂在龙门架上。
2. 启动策略推理 在第二个终端中,运行策略推理:
# 键盘控制模式
source scripts/source_inference_setup.sh
python3 src/holosoma_inference/holosoma_inference/run_policy.py inference:g1-29dof-loco \\
–task.model-path src/holosoma_inference/holosoma_inference/models/loco/g1_29dof/fastsac_g1_29dof.onnx \\
–task.no-use-joystick \\
–task.interface lo
# 或游戏手柄控制模式
source scripts/source_inference_setup.sh
python3 src/holosoma_inference/holosoma_inference/run_policy.py inference:g1-29dof-loco \\
–task.model-path src/holosoma_inference/holosoma_inference/models/loco/g1_29dof/fastsac_g1_29dof.onnx \\
–task.use-joystick \\
–task.interface lo
3. 部署机器人 在MuJoCo窗口中操作:
- 按 8 键:降低龙门架直到机器人接触地面
- 按 9 键:移除龙门架
4. 启动策略 在策略终端中,按 ] 键(或游戏手柄的A按钮)激活策略。
5. 进入行走模式 在策略终端中,按 = 键(或游戏手柄的Start按钮)进入行走模式。
6. 控制机器人
- 键盘控制:使用 wasd 控制线性运动(前后左右),qe 控制角速度(左右转向)
- 游戏手柄控制:左摇杆控制前后左右移动,右摇杆控制左右转向
上面的权重是官网默认的,可以使用自己训练的权重
# 键盘控制模式,使用自己训练的权重
source scripts/source_inference_setup.sh
python3 src/holosoma_inference/holosoma_inference/run_policy.py inference:g1-29dof-loco \\
–task.model-path logs/hv-g1-manager/20260616_034846-g1_29dof_manager-locomotion/model_05300.onnx \\
–task.no-use-joystick \\
–task.interface lo
示例效果: 
Booster T1 (29-DOF) 验证步骤
Booster T1的验证流程与G1类似,但使用不同的模型和配置:
1. 启动MuJoCo环境
# 键盘控制模式
source scripts/source_mujoco_setup.sh
python src/holosoma/holosoma/run_sim.py robot:t1-29dof-waist-wrist
# 或游戏手柄控制模式
source scripts/source_mujoco_setup.sh
python src/holosoma/holosoma/run_sim.py robot:t1-29dof-waist-wrist \\
–simulator.config.bridge.enabled=True \\
–simulator.config.bridge.use-joystick=True
2. 启动策略推理
# 键盘控制模式
source scripts/source_inference_setup.sh
python3 src/holosoma_inference/holosoma_inference/run_policy.py inference:t1-29dof-loco \\
–task.model-path src/holosoma_inference/holosoma_inference/models/loco/t1_29dof/ppo_t1_29dof.onnx \\
–task.no-use-joystick \\
–task.interface lo
# 或游戏手柄控制模式
source scripts/source_inference_setup.sh
python3 src/holosoma_inference/holosoma_inference/run_policy.py inference:t1-29dof-loco \\
–task.model-path src/holosoma_inference/holosoma_inference/models/loco/t1_29dof/ppo_t1_29dof.onnx \\
–task.use-joystick \\
–task.interface lo
3-6步:与G1相同,使用相同的控制命令部署机器人、启动策略、进入行走模式和控制运动。
控制参考表
MuJoCo窗口控制(在MuJoCo窗口中输入):
| 提升龙门架 | 7 |
| 降低龙门架 | 8 |
| 移除龙门架 | 9 |
| 重置仿真 | Backspace |
策略终端控制(在运行run_policy.py的终端中输入):
| 启动策略 | ] | A按钮 |
| 停止策略 | o | B按钮 |
| 设置默认姿态 | i | Y按钮 |
| 切换行走/站立模式 | = | Start按钮 |
| 调整线性速度 | wasd | 左摇杆 |
| 调整角速度 | qe | 右摇杆 |
提示与故障排除
- 随时重置:在MuJoCo窗口按 Backspace 重置仿真
- 接口设置:同一台机器上运行时,始终使用 lo (loopback) 接口
- 站立模式:机器人启动时处于站立模式,按 = 或 Start 切换到行走模式
- 默认姿态:按 i 或 Y按钮 将机器人恢复到站立姿态
7.2 全身跟踪仿真验证
全身跟踪验证用于测试机器人跟踪预定义全身运动序列的能力。该工作流在MuJoCo中回放训练好的WBT策略进行评估。
前提条件
- 已配置MuJoCo环境(scripts/source_mujoco_setup.sh)
- 已配置Holosoma推理环境(scripts/source_inference_setup.sh)
- 准备好ONNX模型检查点
- 键盘用于控制(在同一台机器上运行时,始终使用–task.interface lo参数)
验证流程
Unitree G1 (29-DOF) 验证步骤
1. 启动MuJoCo环境 在第一个终端中,启动MuJoCo仿真环境:
source scripts/source_mujoco_setup.sh
python src/holosoma/holosoma/run_sim.py robot:g1-29dof
机器人将在模拟器中生成,悬挂在龙门架上。
2. 启动策略推理 在第二个终端中,运行策略推理:
source scripts/source_inference_setup.sh
python3 src/holosoma_inference/holosoma_inference/run_policy.py inference:g1-29dof-wbt \\
–task.model-path src/holosoma_inference/holosoma_inference/models/wbt/ppo_g1_29dof_dancing.onnx \\
–task.no-use-joystick \\
–task.use-sim-time \\
–task.rl-rate 50 \\
–task.interface lo
这里全身跟踪时,ppo_g1_29dof_dancing.onnx权重能完成舞蹈演示,fastsac_g1_29dof_dancing.onnx经常跌到,无法表演的。
3. 初始化刚性控制模式 在策略终端中,当提示时按 Enter 键。机器人将进入刚性控制模式并保持初始姿态。
4. 部署机器人 在MuJoCo窗口中操作:
- 按 8 键:降低龙门架直到机器人接触地面
- 按 9 键:移除龙门架
- 等待几秒钟,让刚性控制器稳定机器人姿态
5. 启动策略 在策略终端中,按 ] 键激活策略。
6. 启动运动片段 在策略终端中,按 m 键开始运动片段。机器人将开始跟踪全身运动。
控制参考表
MuJoCo窗口控制(在MuJoCo窗口中输入):
| 提升龙门架 | 7 |
| 降低龙门架 | 8 |
| 移除龙门架 | 9 |
| 重置仿真 | Backspace |
策略终端控制(在运行run_policy.py的终端中输入):
| 启动策略 | ] | A按钮 |
| 停止策略 | o | B按钮 |
| 设置默认姿态 | i | Y按钮 |
| 启动运动片段 | m | Select+A组合键 |
默认姿态:站立,双臂抬起
提示与故障排除
- 随时重置:在MuJoCo窗口按 Backspace 重置仿真
- 接口设置:同一台机器上运行时,始终使用 lo (loopback) 接口
- 刚性模式:Enter 提示用于初始化刚性控制模式,这是WBT策略在启动前保持平衡所必需的
- 稳定时间:移除龙门架后(第4步),等待几秒钟再启动策略,让刚性控制器有时间稳定机器人
- 控制频率:WBT策略使用 –task.rl-rate 50 参数(50 Hz控制频率)
- 时间同步:使用 –task.use-sim-time 参数与MuJoCo的仿真时间同步
通过上述仿真验证流程,可以全面评估训练策略在更接近真实物理环境的MuJoCo仿真器中的表现,为后续的真实机器人部署提供重要参考。
仿真完成后,可以进行实际部署: 速度跟踪参考:https://github.com/amazon-far/holosoma/blob/main/src/holosoma_inference/docs/workflows/real-robot-locomotion.md
全身跟踪参考:https://github.com/amazon-far/holosoma/blob/main/src/holosoma_inference/docs/workflows/real-robot-wbt.md
整体推理部署参考:https://github.com/amazon-far/holosoma/blob/main/src/holosoma_inference/README.md
示例效果: 
分享完成~





