
在人形机器人领域,将人类运动数据转换为机器人可执行的关节轨迹是一项基础而关键的技术挑战。GMR (General Motion Retargeting) 是一个开源的通用运动重定向框架,旨在解决从多源人体运动数据到多平台人形机器人的高质量、实时运动转换问题。该系统由斯坦福大学和相关研究机构开发,相关研究成果已发表于 arXiv (2505.02833, 2510.02252),并在 GitHub 上开源(MIT 许可证)。
GMR 的核心创新在于提供了一套统一的运动重定向解决方案,支持多种主流人形机器人平台和多种人体运动数据格式,同时实现了实时性能(60-70 FPS),为人形机器人的远程操控和强化学习策略训练提供了技术基础。

GMR 的运动重定向系统基于逆运动学(Inverse Kinematics)求解,核心实现构建在 mink 库和 MuJoCo 物理引擎之上。系统采用了基于任务空间(Task Space)的分层 IK 求解策略:
算法流程:
{body_name: (3D_position, quaternion_rotation)}核心求解器参数:
GMR 实现了自定义的运动学模型类(KinematicsModel),能够从 MuJoCo XML 格式的机器人描述文件中自动构建运动学树:
核心功能模块:
- 正向运动学(FK): 根据关节角度计算末端执行器位置
- 逆向运动学(IK): 根据目标位置求解关节角度
- 坐标系变换: 局部坐标系与全局坐标系的相互转换
- 关节限制: 自动解析并强制执行关节角度和速度限制运动学模型支持两种关节自由度表示:
系统使用 FrameTask 定义控制目标,每个任务包含:
典型权重配置(以 pelvis 为例):
"pelvis": [
"pelvis", // 对应的人体部位名称
100, // 位置跟踪权重
10, // 旋转跟踪权重
[0.0, 0.0, 0.0], // 位置偏移量(x, y, z)
[0.5, -0.5, -0.5, -0.5] // 旋转偏移量(四元数 wxyz)
]GMR 系统由以下核心模块组成:
职责: 运动重定向的主控制器
关键方法:
setup_retarget_configuration(): 初始化 IK 任务和约束update_targets(): 更新目标位姿(包含尺度缩放和坐标变换)retarget(): 执行 IK 求解,返回机器人关节配置 qposscale_human_data(): 人体数据尺度缩放offset_human_data(): 应用坐标系偏移输出格式: qpos = [root_pos(3), root_quat(4), joint_angles(n_dof)]
职责: 机器人运动学计算
核心功能:
forward_kinematics(root_pos, root_rot, dof_pos)dof_to_rot(), rot_to_dof()职责: 基于 MuJoCo 的实时可视化
功能特性:
[人体运动数据源]
↓
[数据加载器] (load_smplx_file / load_bvh_file / fbx_importer)
↓
[数据标准化] → {body_name: (pos, quat)}
↓
[人体尺度缩放] (scale_human_data)
↓
[坐标系映射] (offset_human_data)
↓
[IK 求解器] (mink.solve_ik)
↓
[机器人关节配置] → qpos = [base_pos, base_quat, joint_angles]
↓
[可视化/保存] (RobotMotionViewer / pickle 序列化)GMR 采用 JSON 配置文件定义人体-机器人映射关系,配置文件组织在 general_motion_retargeting/ik_configs/ 目录:
配置文件命名规范:
smplx_to_{robot_name}.jsonbvh_lafan1_to_{robot_name}.json 或 bvh_nokov_to_{robot_name}.jsonfbx_to_{robot_name}.json配置参数说明:
human_height_assumption: 配置假设的人体身高(米)human_scale_table: 各身体部位的缩放系数ik_match_table1/2: 两阶段 IK 匹配表,定义机器人部位与人体部位的映射关系及权重GMR 目前支持 16 个主流人形机器人平台:
ID | 机器人型号 | 标识符 | 自由度 (DOF) | 配置文件 |
|---|---|---|---|---|
0 | Unitree G1 |
| 29 (腿12+腰3+臂14) | ✅ |
1 | Unitree G1 with Dex Hands |
| 43 (含灵巧手14) | ✅ |
2 | Unitree H1 |
| 19 (腿10+腰1+臂8) | ✅ |
3 | Unitree H1 2 |
| 27 (腿12+腰1+臂14) | ✅ |
4 | Booster T1 |
| 23 | ✅ |
5 | Booster T1 29dof |
| 29 | ✅ |
6 | Booster K1 |
| 22 (颈2+臂8+腿12) | ✅ |
7 | Stanford ToddlerBot |
| - | ✅ |
8 | Fourier N1 |
| - | ✅ |
9 | ENGINEAI PM01 |
| - | ✅ |
10 | HighTorque Hi |
| 25 (头2+臂10+腰1+腿12) | ✅ |
11 | Galaxea R1 Pro |
| 24 (基座6+躯干4+臂14) 轮式 | ✅ |
12 | Kuavo S45 |
| 28 (头2+臂14+腿12) | ✅ |
13 | Berkeley Humanoid Lite |
| 22 (腿12+臂10) | ⚠️ 需进一步调优 |
14 | PND Adam Lite |
| 25 (腿12+腰3+臂10) | ✅ |
15 | Tienkung |
| 20 (腿12+臂8) | ✅ |
16 | PAL Robotics Talos |
| 30 (头2+臂14+腰2+腿12) | ✅ |
注: Galaxea R1 Pro 是 GMR 支持的首个轮式人形机器人,基座具有 6-DOF 虚拟关节。
数据格式 | 来源 | 支持的机器人数量 | 典型应用场景 |
|---|---|---|---|
SMPL-X | AMASS / OMOMO 数据集 | 16 个(全部) | 离线运动数据集批处理 |
BVH (LAFAN1) | Ubisoft LAFAN1 数据集 | 7 个 | 游戏动画数据转换 |
BVH (Nokov) | Nokov 动捕系统 | 1 个(G1) | 实时/离线动捕数据 |
FBX | OptiTrack Motive 导出 | 2 个(G1 系列) | 离线 OptiTrack 数据 |
OptiTrack 流式 | NatNet SDK 实时流 | 2 个(G1 系列) | 实时远程操控 |
GVHMR | 单目视频姿态估计 | 全部 | 视频转机器人轨迹 |
数据格式统一: 所有输入数据最终转换为统一的标准格式:
{
"body_name": [
np.array([x, y, z]), # 3D 全局位置
np.array([w, x, y, z]) # 四元数旋转(标量在前,遵循 MuJoCo 约定)
]
}GMR 针对实时远程操控场景进行了深度优化:
性能基准:
CPU 型号 | 重定向速率 (FPS) |
|---|---|
AMD Ryzen Threadripper 7960X (24核) | 60-70 |
Intel Core i9-13900K (24核) | 35-45 |
优化策略:
系统支持基于实际人体身高的自动缩放:
ratio = actual_human_height / config["human_height_assumption"]
for body_part in human_scale_table:
scaled_offset = original_offset * ratio * scale_factor[body_part]缩放策略:
两阶段求解策略提高了收敛性和运动质量:
第一阶段 (ik_match_table1):
第二阶段 (ik_match_table2):
系统支持电机速度限制(v0.2.0 新增):
VELOCITY_LIMITS = {motor_name: 3*π for motor_name in robot_motors}这一特性对于生成可在真实机器人上执行的轨迹至关重要,避免产生超出硬件能力的关节速度命令。
系统包含自动地面对齐功能:
def offset_human_data_to_ground(self, human_data):
# 检测脚部最低点
lowest_foot_z = min([pos[2] for name, (pos, _) in human_data.items()
if "foot" in name.lower()])
# 将整体运动抬升至地面以上 0.1m
return apply_offset(human_data, z_offset=-lowest_foot_z + 0.1)GMR 是 TWIST (Teleoperated Whole-Body Imitation System) 项目的核心技术组件。TWIST 利用 GMR 的实时性能,实现了人形机器人的实时全身远程操控:
技术链路:
OptiTrack 动捕系统 → GMR 实时重定向 → RL 跟踪策略 → 真实机器人执行关键指标:
GMR 生成的运动轨迹可直接用于训练 RL 跟踪策略:
输出格式兼容性:
scripts/batch_gmr_pkl_to_csv.py)优势:
利用 AMASS 等大型人体运动数据集构建机器人动作库:
典型工作流:
# 批量转换 AMASS 数据集
python scripts/smplx_to_robot_dataset.py \
--src_folder /path/to/AMASS \
--tgt_folder /path/to/robot_motions \
--robot unitree_g1数据规模: AMASS 包含 >11,000 个运动序列,GMR 能够高效批量处理并生成机器人可执行的运动库。
集成 GVHMR 姿态估计系统,实现视频到机器人的端到端转换:
# 1. 从视频提取人体姿态 (GVHMR)
cd GVHMR && python tools/demo/demo.py --video tennis.mp4
# 2. 姿态数据重定向到机器人 (GMR)
python scripts/gvhmr_to_robot.py \
--gvhmr_pred_file outputs/demo/tennis/hmr4d_results.pt \
--robot unitree_g1 \
--record_video这一能力极大降低了获取机器人训练数据的成本。
问题: 人体和机器人在自由度数量、关节限制、肢体比例上存在显著差异。
GMR 解决方案:
问题: 直接映射可能产生违反物理约束的轨迹(关节超限、速度过快)。
GMR 解决方案:
问题: 远程操控需要 >60 Hz 的重定向频率,计算开销大。
GMR 解决方案:
问题: 每个机器人需要手动调整大量 IK 参数。
GMR 解决方案:
GMR/
├── general_motion_retargeting/ # 核心库
│ ├── __init__.py
│ ├── motion_retarget.py # 主重定向类
│ ├── kinematics_model.py # 运动学计算
│ ├── robot_motion_viewer.py # 可视化
│ ├── data_loader.py # 数据 I/O
│ ├── params.py # 机器人参数配置
│ ├── rot_utils.py # 旋转表示转换
│ ├── ik_configs/ # IK 配置文件
│ │ ├── smplx_to_*.json
│ │ ├── bvh_*_to_*.json
│ │ └── fbx_to_*.json
│ └── utils/ # 工具模块
│ ├── smpl.py # SMPL-X 处理
│ └── lafan1.py # LAFAN1 处理
├── scripts/ # 命令行工具
│ ├── smplx_to_robot.py # 单文件转换
│ ├── smplx_to_robot_dataset.py # 批量转换
│ ├── bvh_to_robot.py
│ ├── fbx_offline_to_robot.py
│ ├── gvhmr_to_robot.py
│ ├── optitrack_to_robot.py # 实时流式处理
│ └── vis_robot_motion.py # 可视化工具
├── assets/ # 资源文件
│ ├── body_models/smplx/ # SMPL-X 模型
│ └── {robot_name}/ # 各机器人模型
│ ├── *.xml # MuJoCo XML
│ ├── *.urdf # URDF 描述
│ └── meshes/ # 3D 网格
├── setup.py # 安装配置
├── README.md # 用户文档
├── DOC.md # IK 配置文档
└── CLAUDE.md # AI 辅助开发文档核心依赖 (setup.py):
install_requires=[
"mink", # IK 求解器
"mujoco", # 物理引擎
"numpy", "scipy", # 数值计算
"qpsolvers[proxqp]", # QP 求解器
"smplx", # SMPL-X 模型
"opencv-python", "imageio", # 视频处理
]
python_requires='>=3.10'特性 | GMR | 传统 IK (如 IKPy, ROS MoveIt) |
|---|---|---|
多机器人支持 | 16个平台,统一接口 | 每个机器人需独立配置 |
多数据源 | SMPL-X/BVH/FBX/流式 | 通常仅支持自定义格式 |
实时性能 | 60-70 Hz | 通常 <30 Hz |
人体尺度适配 | 自动缩放 | 需手动调整 |
应用导向 | 针对远程操控和 RL 优化 | 通用机器人运动规划 |
GMR 不是姿态估计系统,而是姿态转换系统:
[动捕硬件] → [GMR 重定向] → [RL 跟踪策略] → [真实机器人]
↑ 核心模块 ↑ TWIST 训练框架GMR 作为 TWIST 项目的核心组件,专注于高质量实时重定向;而 TWIST 框架负责 RL 策略训练和部署。
基于 GMR 的相关研究论文:
# 1. 创建 Conda 环境
conda create -n gmr python=3.10 -y
conda activate gmr
# 2. 安装 GMR
git clone https://github.com/YanjieZe/GMR.git
cd GMR
pip install -e .
# 3. 解决渲染库依赖
conda install -c conda-forge libstdcxx-ng -y
# 4. (重要)修改 SMPL-X 配置
# 编辑 {conda_env}/lib/python3.10/site-packages/smplx/body_models.py
# 将 ext='npz' 改为 ext='pkl' (如果使用 .pkl 文件)# 下载 SMPL-X 模型 (需注册账号)
# 网址: https://smpl-x.is.tue.mpg.de/
# 放置在: assets/body_models/smplx/
# 文件: SMPLX_NEUTRAL.pkl, SMPLX_MALE.pkl, SMPLX_FEMALE.pkl
# 下载 AMASS 数据集 (可选)
# 网址: https://amass.is.tue.mpg.de/
# 注意: 下载 SMPL-X 版本(不是 SMPL+H)
# 下载 LAFAN1 数据集 (可选)
# 网址: https://github.com/ubisoft/ubisoft-laforge-animation-dataset# 示例 1: SMPL-X 转 Unitree G1
python scripts/smplx_to_robot.py \
--smplx_file datasets/ACCAD/Stand.npz \
--robot unitree_g1 \
--save_path trajectory/stand_g1.pkl \
--rate_limit
# 示例 2: BVH 转 Fourier N1
python scripts/bvh_to_robot.py \
--bvh_file datasets/lafan1/dance1_subject2.bvh \
--robot fourier_n1 \
--format lafan1 \
--record_video \
--video_path videos/n1_dance.mp4
# 示例 3: 可视化已保存的轨迹
python scripts/vis_robot_motion.py \
--robot unitree_g1 \
--robot_motion_path trajectory/stand_g1.pkl
# 示例 4: 批量转换数据集
python scripts/smplx_to_robot_dataset.py \
--src_folder /path/to/AMASS \
--tgt_folder /path/to/robot_dataset \
--robot unitree_g1在 MuJoCo 可视化窗口中:
Space: 暂停/播放[: 上一个运动序列(仅数据集可视化模式)]: 下一个运动序列(仅数据集可视化模式)# 方法 1: 减少迭代次数
retarget.max_iter = 5 # 默认 10
# 方法 2: 降低阻尼系数(可能影响稳定性)
retarget = GMR(..., damping=1e-1) # 默认 5e-1
# 方法 3: 禁用速度限制(如果不需要物理约束)
retarget = GMR(..., use_velocity_limit=False)# 方法 1: 增加迭代次数
retarget.max_iter = 20
# 方法 2: 调整 IK 配置权重
# 编辑 general_motion_retargeting/ik_configs/smplx_to_{robot}.json
# 提高关键部位的 position_cost 和 orientation_cost
# 方法 3: 提供准确的人体身高
retarget = GMR(..., actual_human_height=1.75)创建新的配置文件 custom_config.json:
{
"human_height_assumption": 1.8,
"robot_root_name": "pelvis",
"human_root_name": "pelvis",
"human_scale_table": {
"pelvis": 0.9,
"left_foot": 0.9,
...
},
"ik_match_table1": {
"robot_body_name": [
"human_body_name",
position_weight,
orientation_weight,
[x_offset, y_offset, z_offset],
[qw, qx, qy, qz]
],
...
}
}参考 DOC.md 了解参数详细说明。
GMR (General Motion Retargeting) 是一个成熟的开源运动重定向框架,具有以下核心优势:
技术优势:
应用价值:
生态系统:
GMR 为人形机器人领域的研究者和工程师提供了一个强大、灵活、开箱即用的运动重定向解决方案,显著降低了从人体运动数据到机器人执行之间的技术门槛。随着人形机器人技术的快速发展,GMR 作为基础设施组件,将在远程操控、模仿学习、运动生成等多个方向发挥重要作用。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。