1)综述:
GMR 是一个通用的运动重定向框架,专注于将人类运动数据高精度、实时地重定向到多款人形机器人,同时适配 RL 跟踪策略优化,支持多类人类运动格式和人形机器人型号。
以下从仓库结构 、核心文件 / 目录 、脚本文件功能三个维度进行超详细解析
GMR/
├── .gitignore # Git忽略规则:指定无需版本控制的文件(如缓存、日志、依赖包)
├── CLAUDE.md # 与Claude大模型相关的说明(如prompt、集成方式)
├── DOC.md # 核心文档:IK配置、机器人参数、运动重定向关键参数说明
├── LICENSE # 开源许可证:MIT协议(自由使用、修改、分发)
├── README.md # 仓库主说明:功能、更新、演示、快速开始(核心入口)
├── TEST_MOTIONS.md # 运动测试文档:测试用例、运动数据格式校验、结果评估
├── setup.py # 安装配置文件:定义包依赖、安装方式、版本信息
├── third_party/ # 第三方依赖目录
│ └── poselib/ # 姿态处理库:提供人体/机器人姿态估计、IK/FK计算核心能力
├── scripts/ # 核心脚本目录:各类格式转换、可视化、实时流处理
│ ├── batch_gmr_pkl_to_csv.py
│ ├── bvh_to_robot.py
│ ├── bvh_to_robot_dataset.py
│ ├── convert_omomo_to_smplx.py
│ ├── fbx_offline_to_robot.py
│ ├── gvhmr_to_robot.py
│ ├── optitrack_to_robot.py
│ ├── smpl_to_smplx.py
│ ├── smplx_to_robot.py
│ ├── smplx_to_robot_dataset.py
│ ├── vis_robot_motion.py
│ ├── vis_robot_motion_dataset.py
│ ├── vis_robot_urdf.py
│ ├── xsens_bvh_to_robot.py
│ └── xsens_live_streaming.py
├── assets/ # 静态资源:图片(banner、流程图)、视频演示、机器人URDF/XML文件
│ ├── GMR.png # GMR框架logo/封面图
│ └── ...(其他资源:如机器人模型、测试运动数据)
└── general_motion_retargeting/ # 核心源码目录:运动重定向算法、机器人接口、数据解析
└── ...(核心模块:如GMR核心类、IK求解器、机器人适配层)
核心文件:
1,配置/说明类文件
| 文件名称 | 核心功能与细节 |
|---|---|
.gitignore |
标准 Git 忽略配置,通常包含:- Python 缓存(__pycache__/、*.pyc)- 系统缓存(.DS_Store、*.log)- 依赖包(venv/、env/)- 大型数据文件(*.pkl、*.bvh、*.fbx,除非是测试用例)- IDE 配置(.vscode/、.idea/) |
CLAUDE.md |
大概率是使用 Claude 辅助开发的记录:- 可能包含 Prompt 工程(如生成机器人 IK 配置、代码重构提示)- Claude 调试的问题记录、解决方案- 大模型辅助处理运动数据的脚本示例 |
DOC.md |
核心技术文档,重点是IK 配置(仓库更新日志明确提及):- 不同机器人的 IK 参数(如关节权重、求解器类型、迭代次数)- 运动重定向的关键参数(如速度限制、姿态对齐阈值)- 机器人 DoF(自由度)/Body/Motor 名称与 ID 映射表- 常见问题排查(如 IK 求解失败、运动抖动) |
LICENSE |
MIT 许可证文本:- 允许商业 / 非商业使用、修改、分发- 免责声明:作者不承担使用风险- 要求保留版权声明和许可证文件 |
README.md |
仓库总入口,包含:- 项目定位(通用运动重定向、实时遥操作、RL 适配)- 核心特性(多机器人 / 多格式支持、速度限制、RL 友好)- 更新日志(新增机器人 / 格式、功能优化)- 演示视频(多机器人运动重定向效果)- 快速开始(安装、基础使用)- 贡献方式(新增机器人 / 格式的提交流程) |
TEST_MOTIONS.md |
运动测试规范:- 测试数据集(如 LAFAN1 舞蹈数据、Xsens BVH 数据)- 测试指标(运动平滑度、关节限位合规性、RL 跟踪精度)- 测试流程(单帧 / 序列测试、多机器人对比测试)- 测试结果可视化方法 |
setup.py |
Python 包安装配置:- 依赖声明(如 poselib、PyBullet、NumPy、SMPlX、XRoboToolkit)- 包版本(0.2.0)- 安装命令(pip install -e .)- 可选依赖(如 GVHMR、Xsens SDK) |
2,第三方依赖目录 third_party
third_party/poselib/
Poselib 是姿态处理核心库,为 GMR 提供:
- 人体姿态估计(如 SMPL/SMPLX 模型解析)
- 机器人 FK(前向运动学)/IK(逆运动学)求解
- 姿态插值、平滑处理(解决运动抖动问题)
- 关节限位、速度限制的约束处理
- 与 PyBullet/ROS 的接口适配
3.scripts/目录:核心脚本逐文本就诶西
该目录是 GMR 的工具集,覆盖「格式转换、运动重定向、可视化」三大核心场景,每个脚本均为独立可执行文件,以下是逐文件详解:
a. 格式转换类脚本
| 脚本名称 | 核心功能 | 输入 / 输出 | 关键细节 |
|---|---|---|---|
batch_gmr_pkl_to_csv.py |
批量将 GMR 格式的 pickle 文件转为 CSV(适配 beyondmimic 框架) | 输入:GMR .pkl(含机器人关节数据)输出:CSV(关节 ID / 角度 / 速度) | - 支持批量处理文件夹下所有 pkl- CSV 列:时间戳、关节 ID、关节角度、角速度- 适配 beyondmimic 的数据集格式 |
convert_omomo_to_smplx.py |
将 Omomo 格式的人体运动数据转为 SMPLX 格式 | 输入:Omomo .npy/.pkl输出:SMPLX .pkl/.npz | - Omomo 是特定人体运动数据集格式- 补全 SMPLX 缺失的手部 / 足部细节- 姿态对齐(根节点、朝向统一) |
smpl_to_smplx.py |
将 SMPL(无手部 / 少关节)转为 SMPLX(全身体关节,含手部 / 面部) | 输入:SMPL .pkl/.obj输出:SMPLX .pkl | - 填充手部 21DoF、足部 6DoF- 保持根关节、躯干姿态一致- 支持批量转换数据集 |
b.运动重定向类脚本(核心)
这类脚本的核心逻辑是「解析源运动数据 → 调用 GMR 核心算法 → 输出机器人可执行的关节数据」,支持多类输入格式和机器人型号。
| 脚本名称 | 核心功能 | 输入格式 | 适配场景 | 关键参数 / 特性 |
|---|---|---|---|---|
bvh_to_robot.py |
单文件 BVH(人体运动捕获)数据重定向到机器人 | BVH(如 Nokov/Xsens 离线 BVH) | 单段运动测试(如舞蹈、行走) | - 指定机器人型号(如--robot unitree_h1)- 启用速度限制(--use_velocity_limit)- 输出 GMR .pkl/ 机器人关节 .csv |
bvh_to_robot_dataset.py |
批量 BVH 数据集重定向到机器人 | 文件夹下所有 BVH 文件 | 大规模数据集生成(如 RL 训练数据) | - 多进程处理(加速批量转换)- 自动过滤异常帧(如关节超限)- 输出数据集索引文件 |
fbx_offline_to_robot.py |
OptiTrack 导出的离线 FBX 运动数据重定向到机器人 | FBX(含人体骨骼动画) | 动捕室离线数据处理 | - 解析 FBX 骨骼层级(对齐人体 - 机器人关节)- 补全 FBX 缺失的根节点速度- 支持 OptiTrack 动捕系统标定参数 |
gvhmr_to_robot.py |
基于 GVHMR 从单目视频提取人体姿态,并重定向到机器人 | 单目视频(.mp4/.avi) | 无动捕设备场景(仅视频) | - 调用 GVHMR 模型提取 SMPLX 姿态- 实时 / 离线模式切换- 视频帧率适配(如 30fps→机器人控制频率 100Hz) |
optitrack_to_robot.py |
OptiTrack 实时 / 离线数据重定向到机器人 | OptiTrack SDK 数据 / CSV | 实时遥操作、动捕室在线测试 | - 对接 OptiTrack NatNet SDK- 低延迟(<50ms)实时重定向- 支持多刚体跟踪(如手持物体) |
smplx_to_robot.py |
单文件 SMPLX 人体姿态数据重定向到机器人 | SMPLX .pkl/.npz | 合成人体姿态测试(如算法生成的运动) | - 自定义 SMPLX - 机器人关节映射- 手部精细重定向(如 Dex31 手)- 姿态平滑(减少抖动) |
smplx_to_robot_dataset.py |
批量 SMPLX 数据集重定向到机器人 | SMPLX 数据集文件夹 | RL 训练数据集生成 | - 数据集划分(训练 / 验证 / 测试)- 关节角度归一化- 兼容 HuggingFace 数据集格式 |
xsens_bvh_to_robot.py |
Xsens 专用 BVH 离线数据重定向到机器人 | Xsens BVH(含 IMU 校准数据) | Xsens 动捕系统离线处理 | - 解析 Xsens IMU 数据(补偿姿态漂移)- 适配 Xsens 骨骼命名规则- 支持全身 / 上半身重定向 |
xsens_live_streaming.py |
Xsens 实时 BVH 数据流重定向到机器人 | Xsens Live SDK 数据流 | 实时遥操作(如人形机器人在线控制) | - 低延迟数据流解析(<30ms)- 断线重连机制- 支持 TWIST2/XRoboToolkit 对接 |
c.可视化类脚本
用于验证运动重定向结果,直观查看机器人运动效果,调试IK/关节限位问题
| 脚本名称 | 核心功能 | 输入格式 | 可视化方式 | 关键特性 |
|---|---|---|---|---|
vis_robot_motion.py |
可视化单段机器人运动数据(如重定向后的 GMR .pkl) | GMR .pkl/ 机器人关节 .csv/BVH | 3D 可视化(PyBullet/Matplotlib) | - 实时播放 / 暂停 / 调速- 显示关节角度曲线(排查超限)- 切换机器人模型渲染- 保存视频 / 截图 |
vis_robot_motion_dataset.py |
批量可视化机器人数据集,对比多段运动效果 | 数据集文件夹(含多个.pkl/.csv) | 批量播放、统计可视化 | - 自动生成运动统计报告(如平均关节速度、抖动率)- 多机器人同屏对比- 支持数据集筛选(如仅看行走运动) |
vis_robot_urdf.py |
可视化机器人 URDF 模型,校验关节 / 连杆结构 | 机器人 URDF/.xml 文件 | 3D 模型预览(PyBullet) | - 显示关节 DoF/ID/ 限位- 手动拖动关节测试运动范围- 校验模型碰撞体 / 视觉体- 输出机器人结构报告 |
4.asserts/目录
存储仓库运行所需的静态资源,核心内容包括:
- 图片资源 :
GMR.png(框架封面)、GMR_pipeline.png(运动重定向流程图)、机器人外观贴图; - 机器人模型:各型号机器人的 URDF/.xml 文件、网格模型(.obj/.stl)、碰撞体配置;
- 测试数据:少量示例 BVH/SMPLX/FBX 文件(用于快速测试脚本);
- 演示视频:README 中引用的运动重定向演示视频(如 LAFAN1 舞蹈重定向到 5 款机器人)。
5.general_motion_retargeting/核心源码目录(逻辑分析)
该目录是 GMR 的算法核心,虽未展示具体文件,但结合 README 和脚本功能,可推断核心模块:
core/:general_motion_retargeting.py:定义GeneralMotionRetargeting核心类,实现:- 人体 - 机器人关节映射(SMPLX→机器人 DoF);
- IK 求解(带速度限制、关节限位);
- 姿态平滑、根节点对齐、重力补偿;
- 多机器人适配接口(如 Unitree H1、Talos、Galexea R1 Pro)。
ik_solver.py:定制化 IK 求解器(适配不同机器人的关节权重、迭代策略);motion_smoother.py:运动平滑算法(如低通滤波、样条插值,解决抖动)。
robots/:- 各机器人的适配文件(如
unitree_h1.py、talos.py):定义关节映射、限位、速度限制、URDF 路径; robot_registry.py:机器人注册表(新增机器人需注册到此处)。
- 各机器人的适配文件(如
data/:- 各格式解析器(
bvh_parser.py、smplx_parser.py、fbx_parser.py); - 数据预处理(如姿态归一化、异常帧过滤)。
- 各格式解析器(
utils/:- 通用工具(如日志、文件 IO、3D 变换);
- 与第三方库对接(如 Poselib、GVHMR、XRoboToolkit)。
6.核心特性与技术亮点
- 多机器人适配:支持 17 + 款人形机器人(如 Unitree H1、Talos、Galexea R1 Pro),仅需修改参数即可切换;
- 多格式支持:覆盖 BVH(Xsens/Nokov)、FBX(OptiTrack)、SMPL/SMPLX、单目视频(GVHMR);
- 实时性:支持低延迟(<50ms)实时遥操作(如 Xsens Live、OptiTrack 实时流);
- RL 友好:针对 RL 跟踪策略调优,支持速度限制、运动平滑,降低训练难度;
- 可扩展性:支持新增机器人 / 运动格式(提交 URDF / 数据格式即可适配)。
7.典型使用流程
- 安装:
pip install -e .; - 单文件测试:
python scripts/bvh_to_robot.py --bvh_path test.bvh --robot unitree_h1; - 可视化结果:
python scripts/vis_robot_motion.py --motion_path output.pkl; - 批量生成数据集:
python scripts/bvh_to_robot_dataset.py --bvh_dir bvh_dataset --robot talos --output_dir robot_dataset; - 实时遥操作:
python scripts/xsens_live_streaming.py --robot galaxea_r1_pro。
该仓库的核心价值是降低人形机器人运动重定向的门槛,无需从零开发 IK / 关节映射,仅需调用脚本即可完成从各类人体运动数据到多款机器人的重定向,同时适配 RL 训练和实时遥操作场景。
2)机器人 FK 前向运动学 & IK 逆运动学通俗
GMR 做人体动作转到机器人本体,底层全靠 FK+IK:
FK:已知各个关节转角 → 算出末端 / 连杆在世界坐标系空间位置
IK:想要末端到达指定空间坐标 → 反推每个关节该转多少角度
一、FK 前向运动学 Forward Kinematics
1. 核心定义
输入:所有关节角度 θ₁,θ₂...θₙ 输出:机器人各连杆、躯干、手脚末端在全局 3D 坐标 (x,y,z)+ 旋转姿态 依靠D-H 参数法 / URDF 坐标系逐级坐标变换(齐次变换矩阵 T)。
2. 数学原理:齐次变换矩阵
每一个关节对应一个 4×4 变换矩阵:
Ti=[R3×3 P3×1
0 1]
- R:连杆旋转
- P:连杆偏移 从基座一路乘到末端: Tbase→end=T1⋅T2⋅T3...Tn 矩阵最后一列前三行就是末端坐标 xyz。
3. GMR 中 FK 用途
- 给定 IK 算出的机器人关节角度,用 FK 算出机器人手脚实际位置,和人体 SMPLX 手脚坐标做误差对比;
- 碰撞校验:通过 FK 算出所有连杆空间位置,判断自碰撞;
- 可视化:PyBullet 渲染机器人靠 FK 实时更新各连杆位置。
4. FK 特点
- 唯一解:一组关节角只会得到唯一末端位置
- 计算快:纯矩阵乘法,无迭代
二、IK 逆运动学 Inverse Kinematics
(1)解析 IK(闭式解)
少数结构(6 自由度机械臂、3R 串联腿)可以用三角函数直接推公式,一步算出精确解。 缺点:人形机器人(H1/Talos 二三十个 DOF 冗余)基本无法写出解析解。
(2)数值迭代 IK(GMR、poselib 在用主流方案)
靠雅各比矩阵 Jacobian 迭代优化,不断微调关节角,缩小「FK 算出当前末端位置」和「目标人体末端位置」的误差。
迭代逻辑:
- 当前关节角→FK 得到当前末端Pcurr
- 误差ΔP=Ptarget−Pcurr
- 雅各比 J:末端位置随关节角变化的偏导矩阵 ΔP=J⋅Δθ
- 求解:Δθ=J+⋅ΔP(J 伪逆),更新θ=θ+α⋅Δθ,α 步长
- 循环直到误差小于阈值
GMR 加约束:迭代时强制关节上下限位、最大角速度限制,避免跑出机械极限。
3. 冗余自由度(人形机器人关键)
人形机器人单条腿 6~7DOF、全身 20~30+DOF > 末端 6 维约束 (3 位置 + 3 旋转) → 无穷多组关节解可以满足同一个手脚目标位置 GMR 优化策略(poselib 内置):
- 最小关节运动量(尽量贴近上一帧姿态,运动平滑不跳变)
- 关节限位硬约束
- 躯干姿态跟随人体 SMPLX 躯干朝向
4. IK 缺点
- 多解、无解(目标超出机器人可达空间→IK 发散)
- 奇异位形:J 矩阵奇异,迭代抖动(GMR 加阻尼伪逆 Damped Least Squares 防止) Δθ=JT(JJT+λI)−1ΔP λ 阻尼系数,GMR 配置文件可调。
三、GMR 运动重定向完整链路(FK&IK 串联)
BVH/SMPLX人体动捕 → 人体手脚3D目标坐标
↓
【IK求解】:以人体3D点位为目标,求解机器人全身关节角
↓
【FK校验】:用解出的关节角正向算出机器人手脚实际坐标,对比误差 ↓ 约束滤波(限速、限位、平滑)→ 最终机器人关节指令 → 导出pkl/csv或下发真机
四、一句话区分 FK/IK
- FK:给角度,算在哪(正算)
- IK:想要在哪,求角度(反算)
五、补充:GMR 中 poselib 封装细节
poselib 内部:
- 加载机器人 URDF 自动生成 D-H / 变换树
- FK 模块预计算各连杆变换
- IK 封装带约束阻尼最小二乘迭代,支持多目标(左右手 + 双脚 + 躯干同时约束),正是 GMR 实现全身运动重定向的底层。