感谢科研工作者的劳动与开源!
https://horizonrobotics.github.io/robot_lab/holomotion/
地平线开源的一套“人形机器人全身动作跟踪 / 模仿学习”框架,目标是让机器人根据参考人体动作,生成稳定的全身控制策略。它不是单纯的 BVH/SMPL 播放器,而是从动作数据 → 重定向 → 强化学习训练 → 评估 → MuJoCo 可视化 → ONNX 部署的完整流程。
目前官方给出的基本流程是:
人体动作数据 ↓ Motion Retargeting ↓ HoloMotion npz ↓ HDF5 数据集 ↓ PPO Motion Tracking 训练 ↓ 离线评估 / MuJoCo 可视化 ↓ ONNX 导出 / 部署师兄给出的指示是参考nolomotion的eval写一个工具,这个是用来策略评估的,单独sim2sim的推理的,计算单动作跟踪的跟踪误差。
HoloMotion 评估流程包括:
Trained Checkpoints ↓ Offline Evaluation ↓ Calculate Metrics ↓ MuJoCo Visualization ↓ Export ONNXHoloMotion 的评估部分本质不是训练,而是:拿训练好的 policy 跑一遍参考动作,把机器人实际执行结果 dump 成 .npz,然后离线计算跟踪误差和稳定性指标,最后用 MuJoCo 渲染视频检查。也就是:checkpoint + 评估数据集 + eval 配置 → 跑 sim/eval → 生成 npz → 算指标 → 渲染视频 → 导出 ONNX。
holomotion在评估什么
动作跟踪误差,也就是机器人实际动作和参考动作之间的差距。HoloMotion 的 metrics.py 里要求 .npz 至少包含这些关键数据:
ref_dof_pos ref_dof_vel ref_global_translation ref_global_rotation_quat ref_global_velocity ref_global_angular_velocity robot_dof_pos robot_dof_vel robot_global_translation robot_global_rotation_quat robot_global_velocity robot_global_angular_velocity也就是说,它不是只看关节角,而是同时看:
参考机器人关节角 参考机器人 body 全局位置 参考机器人 body 全局姿态 参考机器人 body 速度 机器人实际关节角 机器人实际 body 全局位置 机器人实际 body 姿态 机器人实际 body 速度这些字段必须是 ref_ 和 robot_ 成对存在的。HoloMotion 的评估代码明确从 .npz 里读取 ref_global_translation、robot_global_translation、ref_global_rotation_quat、robot_global_rotation_quat、ref_dof_pos、robot_dof_pos 来计算误差。
核心的跟踪指标
HoloMotion 主要算这些指标:
mpjpe_g mpjpe_l mpjpe_pa vel_dist accel_dist whole_body_joints_dist root_r_error root_p_error root_y_error root_vel_error root_height_errormpjpe_g:全局位置误差。每一帧,机器人每个 body link 的全局位置和参考动作的全局位置做距离误差,然后对所有 body 求平均。
mpjpe_g=mean(norm(robot_global_translation - ref_global_translation))*1000mpjpe_l:局部姿态误差。不直接比较世界坐标位置,而是先以 root 为中心,把 body 位置转到 root 局部坐标系,再比较机器人和参考动作的 body 形状误差。这个指标比 mpjpe_g 更关注 姿态结构,不太受机器人整体漂移影响。
whole_body_joints_dist:关节角误差。机器人实际关节角 robot_dof_pos 和参考关节角 ref_dof_pos 的平均绝对误差。28 个关节跟参考动作差多少。
root_r_error /root_p_error /root_y_error :roll 误差/ pitch 误差 / yaw 误差。
ref root quaternion 和 robot root quaternion 求相对旋转 然后转成 xyz Euler 分别取 roll/pitch/yaw 的绝对误差root_vel_error:root 速度误差。它比较的是 root 位置差分后的速度误差。HoloMotion 的 metrics.py 里把它作为数据集级指标输出,显示单位转换为 m/s。机器人是不是跟参考动作同速运动。
root_height_error:root 高度误差。robot root z - ref root z,也就是身体高度误差。
vel_dist/accel_dist:分别是速度和加速度误差。这个比单帧位置误差更能反映动作是否“顺”。它们来自 body link 位置的连续差分。
稳定性指标:这部分对 sim2sim 很重要
HoloMotion 不只评估“像不像”,还评估“稳不稳”。它有这些稳定性指标:
mean_dof_vel mean_dof_acc mean_dof_torque mean_torque_jump_norm mean_torque_jump_ratio p95_torque_jump_norm p95_torque_jump_ratio torque_chatter_hf_ratio torso_rp_hf_ratio torso_rp_angacc_p95 foot_contact_toggle_rate foot_impact_force_p95 stance_slip_speed_p95| 指标 | 意义 | 对应问题 |
|---|---|---|
mean_dof_vel | 平均关节速度 | 动作是否过快 |
mean_dof_acc | 平均关节加速度 | 动作是否抖动 |
mean_dof_torque | 平均力矩 | 控制是否费力 |
torque_jump_ratio | 力矩突变程度 | sim2sim 是否不稳定 |
torso_rp_angacc_p95 | 躯干 roll/pitch 角加速度 95 分位 | 身体是否晃动 |
foot_contact_toggle_rate | 足端接触频繁切换率 | 脚是否抖动/频繁离地 |
stance_slip_speed_p95 | 支撑脚滑动速度 | 脚底是否打滑 |
foot_impact_force_p95 | 落脚冲击力 | 脚落地是否砸地 |
| 根据师兄的要求应该重点关注这几类: |
1. root position error2. root orientation error3. body position error4. dof position error5. foot contact / foot slip6. torque / action smoothness成功率定义
它有一个 failure 阈值:--failure_pos_err_thresh_m=0.25。默认是 0.25 m。在脚本里,calc_offline_eval_metrics.sh 调用 metrics.py 时传了这个参数。
也就是说,如果某个 clip 的误差超过阈值,它会被认为失败。HoloMotion 的代码里会记录:
success max_body_pos_err failure_threshold_m success_rate怎么做moya的评估
不需要完整迁移 HoloMotion。你需要抽取它的思想,写一个专门适配你当前 moya01 + sim2sim_mjlab.py 的工具。流程是:
输入: policy.onnx / policy.pt moya01 xml 单个动作 npz,例如 摇摆.npz motion fps sim2sim 推理: 每一帧读取参考动作 policy 输出 action MuJoCo step 记录机器人实际状态 保存: ref_dof_pos ref_global_translation ref_global_rotation_quat robot_dof_pos robot_global_translation robot_global_rotation_quat robot_dof_vel robot_dof_torque foot_contact action 离线计算: dof error body position error root pos/orientation error foot slip torque jump action rate 输出: json + csv + mp4针对moya01的eval npz 最好包含这些字段:
metadata fps dt joint_names body_names ref_dof_pos(T,28)ref_dof_vel(T,28)ref_root_pos(T,3)ref_root_quat(T,4)ref_global_translation(T, B,3)ref_global_rotation_quat(T, B,4)robot_dof_pos(T,28)robot_dof_vel(T,28)robot_root_pos(T,3)robot_root_quat(T,4)robot_global_translation(T, B,3)robot_global_rotation_quat(T, B,4)robot_action(T,28)robot_dof_torque(T,28)robot_foot_contact(T,4)或(T,2)robot_foot_pos(T, nfoot,3)robot_foot_vel(T, nfoot,3)最少要有:
ref_dof_pos robot_dof_pos ref_global_translation robot_global_translation ref_global_rotation_quat robot_global_rotation_quat目前可以先实现8个指标:
1. mean_dof_error_rad2. mean_root_pos_error_m3. mean_root_ori_error_rad4. mean_body_pos_error_m5. max_body_pos_error_m6. mean_foot_slip_mps7. mean_action_rate8. mean_torque_jump_ratio参考命令可以是:
python viz_motion_npz_mujoco.py\--xmlMoya01_V2_sim2sim.xml\--npzoutputs/eval/摇摆/rollouts/摇摆_eval.npz\--key-prefix robot_\--outoutputs/eval/摇摆/video/robot.mp4和训练中的reward是有区别的。建立一定的对应关系可以更好的判断reward 高,到底是真的动作好,还是 reward 设计有偏。
| 训练 reward | eval metric |
|---|---|
motion_global_root_pos | root position error |
motion_global_root_ori | root roll/pitch/yaw error |
motion_body_pos | global/local body position error |
motion_body_ori | body orientation error |
motion_leg_pos | leg body position error |
| action smoothness reward | action rate / torque jump |
| foot contact reward | foot slip / contact toggle |
| 应该照着做的是: |
sim2sim 推理 + dump npz + calculate tracking metrics + render video