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. 结论摘要¶
-
InterAct 确实会修正高度,但它没有对 height 维度做逐帧去抖或漂移消除。 它在前 30 帧中估计人体最低点,然后给整段人体轨迹统一减去同一个
diff_fix;必要时还会把人体和物体一起做一次整段常量平移。这属于“序列级地面标定”,只能修正整体悬空或整体穿地,不能消除随时间变化的 foot/root-z 漂移。 -
PHC、OmniGrasp、MimicKit 中最常见的
fix_height也是整段常量修正。 PHC 的full_fix/ankle_fix都从前 30 帧估计一个标量,再施加到所有帧。ArtHOI4D 当前 tracking 命令明确使用env.fix_height=no_fix,因此 physics 输入不会再经过 PHC 的这层常量校准。 -
“已经 smooth”不等于“已经消除漂移”。 当前
light_smooth本质上是局部邻域低通:它能压低高频抖动,但对于z(t)=at+ε(t)形式的缓慢线性漂移,平滑后at基本仍然存在。此前 20 个 case 的曲线也与此一致:10/20 的脚底最小高度动态范围超过 5 cm,17/20 超过 3 cm。 -
有些工作会做真正的时变轨迹修正,但通常依赖 contact/static-joint 信号,而不是逐帧把最低脚点硬吸到地面。 WHAM 用预测的足地接触与足部世界速度更新 root velocity/trajectory;GVHMR 的非静态相机分支通过静止关节位移累计修正 root translation。它们是最接近当前需求的参考。
-
物理仿真不能自动替代 reference motion 清理。 InterMimic、RePHO、PhysHOI 等可以通过动力学和策略产生更物理合理的 rollout,但 tracking reward 仍以输入 reference 为目标。如果 reference 的 root-z 本身漂移,控制器会同时面对“跟随错误参考”和“满足接触/动力学”的冲突。
-
不建议把 ProtoMotions 的逐帧
fix_height_per_frame直接作为 HMR 默认方案。 它证明了逐帧高度修正是可实现的,但硬对齐会破坏真实的抬脚、跳跃、台阶和非平地运动,也可能把视觉重建误差转移到膝盖、骨盆或手物接触上。 -
对 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_height、ground、floor、contact、foot sliding、root translation、postprocess、smooth等实现及其调用点。 - 对外部项目只使用官方论文、官方项目页或官方 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_planeworld_finalize_mode: light_smoothworld_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:
- 读取前 30 帧人体 mesh;
- 计算其最低顶点高度;
- 得到一个
diff_fix; - 将同一个标量施加到所有人体
trans、joints 和 global translation; - 若第 0 帧物体仍低于地面,再将人体和物体一起做一次统一常量平移。
这能保证 humanoid/MJCF 初始高度大体合理,也保持人与物的相对关系,但无法修复“前半段贴地、后半段逐渐悬空/下沉”。直接源码:InterAct interact2mimic.py L952-L982。
5.2 PHC、OmniGrasp、MimicKit:主流 converter 仍是 B 类校准¶
- PHC
motion_lib_smpl.py:112-138的full_fix与ankle_fix都在前 30 帧估计最低点,再把同一个高度标量加到所有帧;ankle_fix主要改变参与最低点计算的身体部位,并不生成delta_z(t)。PHC 官方仓库 - OmniGrasp 的 SMPL/SMPL-object motion loader 继承了同样的 fix-height 结构;physics policy 属于后续 D 类处理。OmniGrasp 官方仓库
- MimicKit 提供
none、calibrate(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 接触判定建议¶
建议为左右脚分别生成连续置信度,而不是二值单帧阈值:
- 足底相对地面的高度低;
- 足底竖直速度低;
- 足底 XY 速度低;
- 至少连续若干帧满足条件;
- HMR joint/vertex confidence 足够高;
- 左右脚交替时允许不同目标高度,避免双脚错误地同时锁死。
可以先用现有 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_transl、delta_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. 主要官方来源¶
- InterAct 官方仓库
- InterMimic,CVPR 2025
- PHC 官方仓库
- OmniGrasp 官方仓库
- RePHO 论文
- PhysHOI 论文
- WHAM,CVPR 2024
- GVHMR 官方仓库
- HOI-FHLI 论文
- ProtoMotions 官方仓库
- EmbodMocap 论文
10. 局限与 AI 使用披露¶
- 本报告关注 HMR/HOI motion 到 physics reference 的高度与接触处理,不是对所有 humanoid locomotion 或 motion synthesis 工作的系统综述。
- 对外部项目的默认行为以本报告所列 commit/公开执行路径为准;项目更新后应重新核验。
- 负向结论均应理解为“在定向检查范围内未发现”,不代表数学意义上的不存在。