跳转至

HMR 高度漂移、地面约束与物理仿真前处理调研

调研日期: 2026-07-21

研究对象: ArtHOI4D 当前 HMR/world-space 后处理,以及 InterAct、InterMimic、PHC、OmniGrasp、MimicKit、RePHO、PhysHOI、HOI-FHLI、ProtoMotions、GVHMR、WHAM、EmbodMocap、Dyn-HaMR、GRAIL 等相关实现。

配套表格: hmr_grounding_evidence.csv

1. 结论摘要

  1. InterAct 确实会修正高度,但它没有对 height 维度做逐帧去抖或漂移消除。 它在前 30 帧中估计人体最低点,然后给整段人体轨迹统一减去同一个 diff_fix;必要时还会把人体和物体一起做一次整段常量平移。这属于“序列级地面标定”,只能修正整体悬空或整体穿地,不能消除随时间变化的 foot/root-z 漂移。

  2. PHC、OmniGrasp、MimicKit 中最常见的 fix_height 也是整段常量修正。 PHC 的 full_fix/ankle_fix 都从前 30 帧估计一个标量,再施加到所有帧。ArtHOI4D 当前 tracking 命令明确使用 env.fix_height=no_fix,因此 physics 输入不会再经过 PHC 的这层常量校准。

  3. “已经 smooth”不等于“已经消除漂移”。 当前 light_smooth 本质上是局部邻域低通:它能压低高频抖动,但对于 z(t)=at+ε(t) 形式的缓慢线性漂移,平滑后 at 基本仍然存在。此前 20 个 case 的曲线也与此一致:10/20 的脚底最小高度动态范围超过 5 cm,17/20 超过 3 cm。

  4. 有些工作会做真正的时变轨迹修正,但通常依赖 contact/static-joint 信号,而不是逐帧把最低脚点硬吸到地面。 WHAM 用预测的足地接触与足部世界速度更新 root velocity/trajectory;GVHMR 的非静态相机分支通过静止关节位移累计修正 root translation。它们是最接近当前需求的参考。

  5. 物理仿真不能自动替代 reference motion 清理。 InterMimic、RePHO、PhysHOI 等可以通过动力学和策略产生更物理合理的 rollout,但 tracking reward 仍以输入 reference 为目标。如果 reference 的 root-z 本身漂移,控制器会同时面对“跟随错误参考”和“满足接触/动力学”的冲突。

  6. 不建议把 ProtoMotions 的逐帧 fix_height_per_frame 直接作为 HMR 默认方案。 它证明了逐帧高度修正是可实现的,但硬对齐会破坏真实的抬脚、跳跃、台阶和非平地运动,也可能把视觉重建误差转移到膝盖、骨盆或手物接触上。

  7. 对 ArtHOI4D 最合适的下一步是:保留一次稳健的全局地面标定,再增加一个仅优化标量 delta_z(t) 的接触感知时序阶段。 不应从一开始就重优化完整 pose/camera;先只修正 root 的时变 z 偏差,使用一阶/二阶平滑、接触置信度、穿地软约束和修正幅度限制,更容易验证,也更不容易破坏 HOI。

2. 问题定义与分类

本调研将“高度处理”拆成五类。否则很容易把同名的 fix_height 与真正的漂移消除混为一谈。

类别 含义 能否消除时变 z 漂移 主要风险
A. 普通时序平滑 对 translation/pose 做均值、Gaussian 或一二阶平滑 只能压高频,通常不能 过强会削弱快速动作
B. 整段常量高度校准 全序列所有帧加同一个 z offset 不能 参考帧选错会造成整段偏移
C. 接触感知的时变修正 根据足接触、静止关节或足速度求 delta_z(t)/root trajectory 可以 接触误判会扭曲轨迹
D. 物理策略间接修正 由动力学、控制器和 reward 生成可执行 rollout 改善输出,但不清理输入 reference 错误参考与动力学冲突
E. 逐帧硬吸附/截断 每帧按最低点平移或直接 clamp 脚高 表面上可以 会破坏抬脚、跳跃、台阶和 HOI

这里重点关注的是 C,而不是只确认项目中是否出现了名为 fix_height 的函数。

3. 调研方法与证据口径

  • 检查本仓库当前默认配置、HMR 后处理、HOI optimization loader、PHC tracking/export 路径。
  • submodules/ 和相关本地代码定向检索 fix_heightgroundfloorcontactfoot slidingroot translationpostprocesssmooth 等实现及其调用点。
  • 对外部项目只使用官方论文、官方项目页或官方 GitHub 源码作为正向依据。
  • “未发现额外 z 修正”表示在所列 commit 和相关执行路径中没有找到,不等于证明整个项目或未公开代码绝对不存在。

证据强度分为:

  • A: 直接源码和实际调用路径,能判断默认/启用状态。
  • B: 直接源码,但属于可选、注释或特定 converter 路径。
  • C: 官方论文/README 对方法机制的说明。
  • D: 定向源码检索后的负向证据,仅用于谨慎描述“未发现”。

4. ArtHOI4D 当前路径审计

4.1 当前默认做了什么

当前 D3D-HOI 默认配置 configs/methods/recon/d3dhoi_default.yaml:77-90 使用:

  • world_frame_source: ground_plane
  • world_finalize_mode: light_smooth
  • world_smooth_passes: 5

pipeline/reconstruction/preprocess/human/sam3d_body.py:106-121_smooth_tensor_sequence 是局部邻域平均,并在 :162-204 作用于 translation。它主要降低逐帧噪声。

随后 _transform_hmr_to_world:785-835)会把估计地面变换到 z-up,并根据各帧 heel 最低高度的中位数计算一个统一 z_offset:806-818)。因此默认处理组合是:

A. 普通平滑 + B. 一次整段常量地面校准

它没有对每一时刻的脚底高度残差求一个连续修正量。

4.2 仓库其实已有接触优化雏形,但默认没有启用

同一文件 _optimize_world:842-985)已经包含:

  • world joint/root translation 与旋转的时序平滑(:920-943);
  • 接触脚高度、穿地和 XY 滑动损失(:945-954);
  • root drift guard(:956-960);
  • 联合损失与迭代优化(:975-980)。

这属于 C 类的接触感知优化,但当前 world_finalize_mode: light_smooth 不会进入这条路径。现有实现同时优化的变量较多,若直接切换默认模式,可能影响相机、姿态和手物关系。因此更稳妥的做法是抽出一个 translation-z-only 的轻量阶段,而不是直接整体打开完整优化。

4.3 问题主要来自 HMR/world preprocess,而不是 HOI align 新增

此前对 20 个 default case 的统一时间归一化测量显示:

  • 10/20 的最终 Recon foot-min-z 动态范围大于 5 cm;
  • 17/20 大于 3 cm;
  • 最差的 b001-0011 为 13.27 cm;
  • b005-0026 的末帧相对首帧下降 7.78 cm,b008-0028 下降 6.60 cm。

最终 HOI-aligned root-z 与 preprocess root-z 的相关系数几乎都为 1,HOI align 额外引入的最大动态范围约 0.157 cm。也就是说,观察到的主要漂移已存在于 HMR/world preprocess,而不是物体对齐阶段生成的。

曲线图:output/reports/d3dhoi_full20_recon_foot_min_z/full20_recon_foot_min_z_normalized_time.png

4.4 ground offset 还有一个值得单独修正的定义问题

pipeline/reconstruction/optimization/data_loader/sequence.py:443-445 当前把全序列所有人体顶点的全局最小 z当作 ground_offset。这会让单个异常穿地帧决定整段地面高度;其他帧即使悬空,也可能在可视化/损失定义上看起来“地面被挪走了”。

既然 world transform 已将拟合平面对齐到 z=0,后续 ground 应优先使用该显式平面;如果必须从人体估计,则应使用接触帧和稳健统计,而不是全局最小值。

4.5 Physics tracking 当前没有再修高度

pipeline/physics/mimic/tracking.py 把保存的 ground plane 传给 PHC,并显式设置 env.fix_height=no_fix。PHC-native motion 只保留输入的逐帧 z,并加一次 rest-root 相关的结构性偏移;因而 physics rollout 前没有隐藏的逐帧 height correction。

5. 相关工作的实现证据

5.1 InterAct:前 30 帧估计一个常量,不是 z 去漂移

InterAct 官方 simulation/interact2mimic.py:952-982

  1. 读取前 30 帧人体 mesh;
  2. 计算其最低顶点高度;
  3. 得到一个 diff_fix
  4. 将同一个标量施加到所有人体 trans、joints 和 global translation;
  5. 若第 0 帧物体仍低于地面,再将人体和物体一起做一次统一常量平移。

这能保证 humanoid/MJCF 初始高度大体合理,也保持人与物的相对关系,但无法修复“前半段贴地、后半段逐渐悬空/下沉”。直接源码:InterAct interact2mimic.py L952-L982

5.2 PHC、OmniGrasp、MimicKit:主流 converter 仍是 B 类校准

  • PHC motion_lib_smpl.py:112-138full_fixankle_fix 都在前 30 帧估计最低点,再把同一个高度标量加到所有帧;ankle_fix 主要改变参与最低点计算的身体部位,并不生成 delta_z(t)PHC 官方仓库
  • OmniGrasp 的 SMPL/SMPL-object motion loader 继承了同样的 fix-height 结构;physics policy 属于后续 D 类处理。OmniGrasp 官方仓库
  • MimicKit 提供 nonecalibrate(first30)full(entire motion) 三种选项,但最终也都是为全序列增加一个常量。MimicKit 官方仓库

这些实现说明:对 simulation-ready motion 做一次整体高度标定很常见;它们并不能作为“业内通常会逐帧去除 root-z drift”的证据。

5.3 InterMimic、RePHO、PhysHOI:reference 高度预处理与物理 rollout 需分开看

  • InterMimic 的数据转换直接指向 InterAct 流程;在检查的 simulator loader 中没有发现额外的 z-only reference 后处理。论文的核心是 teacher retarget/refine、student 蒸馏和 RL fine-tuning,而不是预先滤掉 HMR 高度漂移。InterMimic CVPR 2025 论文官方仓库
  • RePHO 必须分两段看。scripts/vistracker_to_interact_format.py:232-253 先显式做 simulation ground normalization:
  • gt 分支分别取 human/object 全序列最低的 5 个高度均值,取二者更低值作为一个常量,同时平移 human、object 和 camera;
  • vistracker 分支为每帧构造 diff_fix = min(human_min_y(t), mean_t(human_min_y), object_min_y(t)),然后对 human 和 object 施加同一个逐帧竖直平移,camera 只减去这些偏移的均值。

后续 scripts/interact_to_tracking_format.py:157-281 只做坐标系/rest-root/SMPL-H→humanoid 转换,不再做高度清理;Isaac Gym 中创建固定 z=0 平面。RePHO 补充材料 S.1 说 human global transform 和 object 6DoF 从 kinematic reconstruction 传入 simulator,但没有单独描述上述 ground normalization;因此它更准确地属于官方输入适配规则,而不是论文声称的主要方法贡献。RePHO 论文官方仓库补充材料 - PhysHOI loader 直接加载 reference root position,地面与 early-termination 约束发生在环境中;策略可以抵抗部分数据错误,但没有在加载 reference 时显式清理 root-z。PhysHOI 项目页论文

这些实现支持两个同时成立的结论:(1) physics 能改善最终运动,但不能当作 reference preprocessing 的替代品;(2) 当输入没有独立可信的 scene plane 时,对 human 和 object 做 shared vertical normalization 是常见的 simulation adapter。但 RePHO 的逐帧 shared shift 会改变两者相对静态场景/相机的高度,不应直接照搬到已有 aligned metric-depth scene plane 的 ArtHOI4D。

5.4 WHAM:最直接的 contact-aware root trajectory 参考

WHAM 将足地接触显式用于世界轨迹 refinement:

  • reset_root_velocity 用静止足部的世界速度修正 root velocity,修正是 3D 的,包含竖直维;
  • trajectory refiner 以 contact-weighted 的足部 3D velocity 为输入,预测 root/velocity residual;
  • training 中包含 foot sliding losses。

它没有逐帧把脚底强制设为平地,因此能比 hard snap 更自然地处理动态运动和楼梯。对于 ArtHOI4D,最值得借鉴的不是其完整网络,而是“接触概率 + 足部静止残差 + 连续 root correction”这一优化结构。WHAM CVPR 2024 论文项目页源码 utils.py L31-L52

5.5 GVHMR:静止关节累计修正,但不同相机分支行为不同

GVHMR 的 postprocess.py:20-58 根据预测为静止的脚踝、足部或手腕计算世界位移,并从 root translation 中减去累计位移;非静态相机分支可改变完整 3D root trajectory。随后再做一次全局最低点 ground alignment。

静态相机分支 :62-118 则明确把静止关节修正的竖直分量置零,只修水平漂移,最后仍用一次常量完成竖直地面对齐。因此不能笼统地说“GVHMR 总会修正时变高度”。GVHMR postprocess.py L20-L118官方仓库

5.6 EmbodMocap:静止 root segment 的 3D 平移稳定

EmbodMocap 可选的 post_smooth 会根据 root 3D 速度和 z 条件找到静止片段,把片段内 target translation 替换为片段均值,再优化完整 3D translation 的原点保持与一阶平滑。这能降低站立段抖动和局部漂移,但它是 root-stationary heuristic,而不是足接触约束,也不会主动修正持续走动时的高度漂移。EmbodMocap 论文源码 optim_motion.py L393-L463

5.7 HOI-FHLI:默认防脚穿地,但不是 root-z trajectory cleanup

HOI-FHLI 默认开启 fix_feet_floor_penetration:把 SMPL-X 脚关节 z 截断到至少约 2 cm,然后通过 IK 回传姿态。代码还包含接触时 XY foot lock/sliding 修正,但默认关闭,并被作者标注为当前效果不佳。

这是一种 E 类的局部脚关节防穿地,适合修复明显 penetration,却不能等同于平滑 root 高度漂移;过强时还可能把误差转移到膝盖和骨盆。HOI-FHLI trainer_utils.py L1460-L1541论文

5.8 ProtoMotions:存在逐帧 fix,但更适合作为负向 ablation

ProtoMotions 同时提供:

  • fix_height:全序列一个常量,B 类;
  • fix_height_per_frame:按每帧最低 body height 修正 translation,并要求调用者重算 velocity,E 类。

标准 AMASS converter 使用前者;逐帧版本出现在特定 G1 CSV conversion 路径。后者可以快速判断问题是否“纯高度偏差”,但作为通用 HMR 默认后处理会错误消除合法离地运动,建议只作为诊断/消融基线。ProtoMotions simulator_state.py L516-L561

5.9 本地其他实现

  • GRAIL: grail/retargeting/process.py:636-663 可做 Gaussian smoothing,并在全序列最低点低于零时把人体、物体、桌子统一上移一个常量;属于 A+B。
  • Dyn-HaMR(当前本地 fork): optim/losses.py:734-771 中 contact velocity/height/floor regularization 块处于注释状态;检查到的活跃路径以 world/floor alignment 和常量初始高度为主。这里属于 D 级负向证据,不能外推到其他分支。
  • 本地 sam-body4d 实验代码: scripts/sam3d_world_motion/optimize_world_mhr.py 含常量 heel 对齐以及接触加权的高度/滑动损失,但该目录在当前 submodule 中是未跟踪的本地实验,不能归因于上游 SAM-Body4D 官方方法。

6. 对 ArtHOI4D 的推荐方案

6.1 推荐的处理顺序

HMR camera/world result
    -> 地面坐标系对齐(显式 z=0)
    -> 一次稳健的整段常量高度校准
    -> 轻量 pose/translation 平滑
    -> contact-aware delta_z(t) refine   <- 新增
    -> object reconstruction / HOI align
    -> physics reference conversion
    -> physics rollout

时变修正最好发生在 object reconstruction/HOI align 之前,使下游物体优化能适应修正后的人体。如果在最终 HOI 结果上只移动人体,会直接破坏 hand-object contact;此时必须重新优化物体或加入一致性约束,不能静默地只改 human z。

6.2 最小可行的 delta_z(t) 优化

第一版只优化每帧一个标量 delta_z[t],不改 SMPL-X pose、camera、x/y,也不逐帧删除原始 translation:

min_delta
    sum(t,f) w_contact[t,f] * (z_foot[t,f] + delta[t] - z_ground)^2
  + lambda_1 * sum(t) (delta[t] - delta[t-1])^2
  + lambda_2 * sum(t) (delta[t+1] - 2 delta[t] + delta[t-1])^2
  + lambda_0 * sum(t) delta[t]^2
  + lambda_pen * penetration_hinge(delta)

其中:

  • f 使用左右 heel/toe joint 或稳定的 sole vertex region;
  • w_contact 综合脚离地高度、竖直速度、水平速度、左右脚持续性和 HMR confidence;
  • 没有可靠 contact 的片段只由平滑与小修正先验插值,不强制贴地;
  • delta 设置最大幅度与最大速度,避免单次接触误判造成突跳;
  • 对台阶/非平地数据,需要使用局部接触平面高度,而不是永久固定 z_ground=0;当前 D3D-HOI 平地 case 可先按 z=0 实现。

这比“每帧 min foot z 归零”更安全,也比完整 _optimize_world 更容易做因果定位。

6.3 接触判定建议

建议为左右脚分别生成连续置信度,而不是二值单帧阈值:

  1. 足底相对地面的高度低;
  2. 足底竖直速度低;
  3. 足底 XY 速度低;
  4. 至少连续若干帧满足条件;
  5. HMR joint/vertex confidence 足够高;
  6. 左右脚交替时允许不同目标高度,避免双脚错误地同时锁死。

可以先用现有 contact annotation/heuristic,不需要等待新的学习模型。

6.4 配置与代码落点建议

建议新增一个明确模式,例如:

world_finalize_mode: light_smooth_contact_z
contact_z_refine:
  enabled: true
  optimize_xy: false
  max_correction_m: 0.10
  use_acceleration_regularization: true
  preserve_airborne_segments: true

实现上可从 sam3d_body.py::_optimize_world 复用 contact height、penetration、temporal loss,但先拆成独立的 translation_z_only solver。默认只改 z;验证通过后,再把 XY foot lock 作为独立开关。

同时建议:

  • 把 optimization loader 的 ground_offset 改为已拟合的 world ground(通常为 0),不要由全局人体最低顶点重新定义;
  • 保持 PHC fix_height=no_fix,避免与预处理的显式地面对齐重复修正;或者只在 legacy motion 缺少地面元数据时启用 PHC 常量 fix;
  • 导出时记录 original_transldelta_z、contact confidence 和 ground plane,便于回退与审计。

7. 实验与验收建议

建议对同一 20 个 case 做以下消融:

实验 处理 目的
B0 当前 light_smooth 现有基线
B1 只做整段常量 height calibration 验证 InterAct/PHC 风格能解决多少
B2 加强普通 translation smoothing 验证“只有高频噪声”的假设
B3 每帧 hard min-z snap 仅作负向诊断上界
B4 contact-aware delta_z(t) 推荐方法
B5 B4 + 可选 XY foot lock 检查滑脚与高度的耦合

至少报告:

  • 全序列 foot-min-z range、首尾差和低频趋势斜率;
  • contact 帧足底高度误差、穿地深度、foot sliding;
  • 2D reprojection/原 HMR 偏离量;
  • hand-object distance/contact consistency;
  • physics tracking reward、fall/termination、object success;
  • root-z jerk/acceleration,防止修正本身制造抖动。

不能只以“脚是否永远在 z=0”作为成功标准;抬脚和非接触帧本来就应该离地。

8. 最终判断

针对“为了 physics,HMR postprocess 是否需要对 height 额外去抖”的问题,答案是:

需要,但应该做接触感知、时序连续、幅度受限的 root-z correction;不能把 InterAct 的整段常量 fix_height 当成漂移消除,也不应默认使用逐帧最低点硬吸附。

ArtHOI4D 当前已有普通 smooth、稳健的常量 heel 对齐和一套未默认启用的 contact optimization 基础。最小风险路线不是引入另一套大型方法,而是把现有 contact height/penetration 信息抽成一个可单独启用、只优化 delta_z(t) 的 postprocess,并用 20-case 曲线、HOI 接触和 physics tracking 三层指标共同验收。

9. 主要官方来源

10. 局限与 AI 使用披露

  • 本报告关注 HMR/HOI motion 到 physics reference 的高度与接触处理,不是对所有 humanoid locomotion 或 motion synthesis 工作的系统综述。
  • 对外部项目的默认行为以本报告所列 commit/公开执行路径为准;项目更新后应重新核验。
  • 负向结论均应理解为“在定向检查范围内未发现”,不代表数学意义上的不存在。