
用 5080 训 23 小时,我把“狗熊哆嗦毛”装进了宇树 G1
“闪身步”,大概是过去一个月里最让人“上头”的一组动作,如果让人形机器人来跳,它跳得动吗?
从技术角度看,“闪身步”、“狗熊哆嗦毛”恰好是一类很有代表性的测试动作:
它们不是缓慢的摆拍,而是腰腹驱动、重心快速转移、四肢在短时间窗口内高频协调的动态运动。
一个策略如果能把这些动作跟稳,说明它在全身协调、接触处理和参考动作跟踪上已经跨过了一道不低的门槛。
这篇分享记录的,正是用宇树 G1 把这几支舞从短视频一路“搬”到机器人身上的一次完整实践。
本文的项目实现过程基于深蓝学院课程《人形机器人运动控制》,新一期即将开课。

参考动作数据生成
首先下载狗熊哆嗦毛和闪身步的舞蹈视频,然后按照动作分割视频,其中选取视频片段时应注意保持视频中可以持续看到人物全身,动作完整。
这个标准会直接筛掉很多素材。之所以比较“苛刻”,是因为整条流水线的精度上限在第一步就被决定了。下一步的姿态恢复算法对输入很敏感:画面中只能有一个人、全身可见、背景相对简洁、光照均匀。
如果视频里存在严重遮挡或多人交叉,恢复出的运动轨迹会明显劣化,而且这个误差会一路传导到最后的策略训练,后面再怎么调都救不回来。
GVHMR:从视频到人体运动轨迹
传统的人体姿态估计方法通常只能得到相对于相机坐标系的局部姿态:它能告诉你“手臂抬了多高”,但告诉不了你“人在空间里走了多远、转了多少”。
像闪身步、浪子踢球这类动作,精髓恰恰在于身体的大范围移动和旋转。
GVHMR(Global-View Human Motion Recovery,浙江大学开源的一个从单目 RGB 视频中恢复全局人体运动的算法)的核心贡献在于能够恢复人体在世界坐标系下的全局运动轨迹,包括全局平移和旋转。
它输出是一个 PyTorch 的 .pt 文件,其中包含了 SMPLX 人体模型的完整参数序列:
全局位移(global translation)、全局朝向(global orientation)、身体姿态参数(body pose)以及手部姿态参数。
这些参数足以在任意时刻重建出完整的人体三维网格。
环境配置
按照官方安装文档来安装即可, 同下载 yolo 等权重文件到指定文件夹。
如果使用的是 50 系显卡, 可能会遇到 python 版本兼容问题,可以参考 Issue: Feature Request: Support NVIDIA Blackwell (RTX 50 Series GPUs, etc.) 里的建议安装。
转换数据
环境配置完成后,执行以下命令即可将视频转换为 SMPLX 运动轨迹:
cd /path/to/GVHMR
python tools/demo/demo.py --video /opt/data/yangge/baishi.mp4 -s其中 --video 参数指定输入视频的路径, -s 参数表示保存结果。程序运行完成后会输出一个 .pt 文件,务必记录该文件的完整路径,因为下一步 GMR 需要用到它。
├── outputs
│ └── demo
│ ├── baishi
│ │ ├── 0_input_video.mp4
│ │ ├── 1_incam.mp4
│ │ ├── 2_global.mp4
│ │ ├── baishi_3_incam_global_horiz.mp4
│ │ ├── hmr4d_results.pt
│ │ └── preprocess
│ │ ├── bbx.pt
│ │ ├── vit_features.pt
│ │ └── vitpose.pt
│ ├── biandanshi
│ │ ├── 0_input_video.mp4
│ │ ├── 1_incam.mp4
│ │ ├── 2_global.mp4
│ │ ├── biandanshi_3_incam_global_horiz.mp4
│ │ ├── hmr4d_results.pt
│ │ └── preprocess
│ │ ├── bbx.pt
│ │ ├── vit_features.pt
│ │ └── vitpose.pt上面展示了 GVHMR 处理视频后的输出,包括中间产生的视频以及最终产生的 SMPLX 数据。
在实际操作中,建议将视频文件放在项目目录下的统一位置,并为每个视频建立独立的输出目录,方便后续管理多个动作数据。其中 hmr4d_results.pt 的后续会作为 GMR 的输入。

GMR:把人的动作"翻译"给机器人
拿到了人体运动轨迹,下一个问题是:人的身体,机器人没有。
人体有超过 200 块骨骼和数百个自由度,而 Unitree G1 机器人只有 23 或 29 个可控关节。
两者在骨骼拓扑结构、关节运动范围、肢体长度比例上都存在本质差异。
例如,人类的肩关节是一个球窝关节,可以在三个轴上自由旋转,而机器人的肩关节通常由三个串联的旋转关节来近似实现。
直接将 SMPLX 的关节角度赋值给机器人关节,不仅物理上不可行,还可能导致自碰撞或关节超限。
这就是运动重定向(Motion Retargeting)要解决的问题。
GMR(General Motion Retargeting)的核心思路是:选取人体和机器人之间对应的关键身体部位(如手、脚、头、躯干),通过最小化这些对应部位在笛卡尔空间中的位置差异,求解出机器人的关节角度序列。这个过程会自动处理骨骼长度差异和关节约束,确保输出的机器人动作在运动学上是可行的。
由于上一步使用的是 GVHMR 框架,这里选择 GMR 中的“Retargeting from GVHMR to Robot”方法进行重定向:
python scripts/gvhmr_to_robot.py --gvhmr_pred_file /opt/zouyu-workspaces/amp/GVHMR/outputs/demo/guziyangge_80s-92s/hmr4d_results.pt --robot unitree_g1 --record_video --save_path ./datasets/guziyangge/tibeigu.npz其中:
- `--gvhmr_pred_file` :上一步 GVHMR 生成的 `hmr4d_results.pt` 文件路径
- `--robot unitree_g1`:目标机器人型号
- `--record_video`:录制重定向过程的可视化视频
- `--save_path`:输出 .pkl 文件的保存路径转换成功后,程序会自动播放重定向结果的可视化视频,可以直观地检查机器人动作是否与原始人体动作在视觉上一致:
BeyondMimic 框架要求输入的参考动作格式为 CSV 文件,因此需要将 GMR 输出的 .pkl 文件进一步转换。
运行以下命令:
python scripts/batch_gmr_pkl_to_csv.py --folder ./datasets/yangge其中 --folder 参数指定包含 .pkl 文件的目录路径。转换后的 CSV 文件每一行代表一帧数据,格式为:
root_pos_x, root_pos_y, root_pos_z, root_quat_x, root_quat_y, root_quat_z, root_quat_w, joint_0, joint_1, ..., joint_N 前 7 列是根节点(骨盆)的全局位置和四元数朝向,后续列是各关节的角度值。
这个 CSV 文件是整条流程中承上启下的关键数据格式,后续的 BeyondMimic 训练会用到它。

BeyondMimic:运动学摆得出,不等于物理上站得住
到这里,我们得到的还只是一串“角度数字”。重定向保证的是运动学可行,也就是机器人能把姿势摆出来。但跳舞是“动力学”问题:单脚支撑时的平衡、快速转身时的角动量、落地瞬间的接触冲击,这些在 CSV 文件里一个字都没有。
直接把这串角度发给真机,第一个转身就会摔。
因此,这里选择了 BeyondMimic(UC 伯克利和斯坦福联合开源的人形机器人全身运动追踪框架),基于 NVIDIA Isaac Lab 仿真平台,使用经典的 PPO(Proximal Policy Optimization)算法训练机器人在物理仿真中高保真地跟踪参考动作。
与早期的运动模仿方法相比,BeyondMimic 的核心优势在于:它不仅能处理静态或低动态的动作,还能在真实硬件上实现跳跃旋转、冲刺、侧手翻等高度动态的技能,同时保持业界领先的运动质量。
环境配置
训练侧使用宇树的官方库, 首先 clone 官方库 unitree_rl_mjlab;
git@github.com:unitreerobotics/unitree_rl_mjlab.git
再按照设置文档安装环境。
数据处理
BeyondMimic 的训练不直接读取 CSV 文件,而是需要先将其转换为包含完整物理信息的 NPZ 格式。
这个转换过程不仅仅是格式变换,还包括帧率插值和正向运动学计算。
python scripts/csv_to_npz.py --input_file /opt/zouyu-workspaces/GMR/datasets/yangge/csv/baishi.csv --output_name yangge/baishi.npz --input_fps 30 --output_fps 50 --robot g1其中:
- `--input_file`:上一步生成的 CSV 文件路径
- `--input_fps`:输入 CSV 的帧率(通常为 30fps)
- `--output_fps`: 输出数据的帧率
- `--output_name`:输出数据名称
- `--robot`: 指定机器人型号该脚本内部执行了以下关键步骤:
首先将动作从输入帧率(如 30fps)插值到输出帧率(50fps,对应 dt=0.005s、decimation=4 的控制频率);
然后在 Isaac Sim 中通过正向运动学计算每个身体部位的世界坐标系位置、姿态四元数、线速度和角速度;
最后将所有数据打包为 NPZ 文件并上传到 WandB Registry。
NPZ 文件包含的数据字段如下:
{
'fps': 50, # 帧率
'joint_pos': [T, N_joints], # 关节位置序列
'joint_vel': [T, N_joints], # 关节速度序列
'body_pos_w': [T, N_bodies, 3], # 各身体部位世界坐标位置
'body_quat_w': [T, N_bodies, 4], # 各身体部位世界坐标姿态
'body_lin_vel_w': [T, N_bodies, 3], # 各身体部位线速度
'body_ang_vel_w': [T, N_bodies, 3] # 各身体部位角速度
}
多参考动作扩展
到这里流程已经跑通,但还有个工程问题:
unitree_rl_mjlab 和 BeyondMimic 的官方库 whole_body_tracking均只支持单个 Motion 的训练。
这里的舞蹈动作有二十多个, 若是每一个动作训练一个策略的话, 则费时费力。
git@github.com:unitreerobotics/unitree_rl_mjlab.git;
因此, 这里扩展了多 MultiMotionCommands 的支持。
对每个 Motion 分配一个权重,根据权重分配对应的环境数。例如,若狗熊哆嗦毛,闪身步和浪子踢球的权重分别为 1, 1, 2, 总共有 4096 个环境,则分别分配的环境数量为 1024, 1024, 2048。
这样一来,一个策略即可掌握所有动作,而且难的动作可以通过调权重拿到更多训练资源。
训练
本次总共选取了 31 个参考动作, 为其中较难的动作, 如狗熊哆嗦毛和浪子踢球, 分配的权重为 2, 其他动作分配的权重为 1。
训练的参考命令如下:
python scripts/train_multi.py Unitree-G1-Tracking-No-State-Estimation-Multi-Priors --agent.logger tensorboard --motion_weights_file /opt/zouyu-workspaces/unitree_rl_mjlab/src/assets/yangge.yaml --video True --video-length 200 --num-envs 13312其中 --motion_weights_file 指定一个 yaml 文件, yaml 文件的内容为列表, 每个元素包括参考动作文件路径和分配权重。
- file: /opt/zouyu-workspaces/unitree_rl_mjlab/src/assets/motions/g1/yangge/cheshuibu.npz
weight: 1
- file: /opt/zouyu-workspaces/unitree_rl_mjlab/src/assets/motions/g1/yangge/xiaolunbi.npz
weight: 1总共训练了约 20000 轮, 显卡为 5080 下耗时约为 23 小时, 最终 mean_reward 约在 32 左右。

Play
训练完成后就可以通过 play 脚本来查看了, 建议选择 viser 作为 mjlab 的显示后端. 以下是一些演示视频。
狗熊哆嗦毛
闪身步
浪子踢球

这条链路拆开看,每一环对应的都是人形机器人运动控制的核心问题:动作从哪来(数据与重定向)、怎么学得会(追踪策略训练)、怎么站得住(物理仿真与迁移)。
这些,只有真正动手跑一遍,才会在“视频里人只有半身导致腿部轨迹残缺”或者“重定向视频里脚在滑”这样的时刻,反过来理解每一步设计存在的理由。
一支舞能不能跳,最终取决于你对整条数据管线里每一个“翻译层”的理解深度,而不是某一个脚本的参数。
如果你也想在自己的 G1 上跑通类似的东西,而不是停在“看别人跳”,《人形机器人运动控制》课程提供了一个比较完整的起点。
课程以宇树 G1 为实践载体,由南方科技大学研究员、博士生导师孔贺主讲,从感知/动作空间、奖励函数设计一路讲到 AMP、BeyondMimic、全身运控和带感知的运控闭环,共 11 个实践项目。
第三期 11 月 13 日开课

《人形机器人运动控制》课程:部分实践项目展示

▲图源| 深蓝学院《人形机器人运动控制》课程
编辑|未了
审编|具身君
来源:深蓝具身智能