问题
跨后端核查(#1468 修复的延伸)发现:drake 后端的 named <contact data="force"> 传感器由 drake_uni C++ 合成(drake_uni/src/drake_uni/compiled/drake_env_pool.cc:1052-1066, 1155-1159),输出是 per-body 累加的世界系净接触力(contact_force() 语义为 f_Bc_W,世界系)。而 UniLab manager 层的接触门控契约(#1468 后)是 MuJoCo contact-frame 约定:第 0 列 = 接触法向。
对平地足底接触,drake 输出的法向分量落在第 2 列(world z),第 0 列是切向摩擦的 world-x 分量——列语义与 mujoco / mjwarp / motrix 不一致。
现状处理
正确归属层
按 backend isolation 原则,修复应在 drake_uni / drake backend 适配层:合成传感器时把世界系净力旋入接触坐标系(或对 geom-pair 接触用法向分量),使其满足 MuJoCo contact-frame 契约,然后在 go2 drake owner 重新启用 reward.contact。
顺带记录的边界
mujoco / mjwarp 下 reduce="netforce" 的 contact force 传感器同样输出世界系力(mujoco-warp sensor.py:1896 的世界系旋转),当前仓库仅 sharpa_wave manipulation XML 使用 netforce,不经过步态接触门控;manager 层注释已声明该变体在契约之外。
来源:#1468 / PR #1470 跨后端核查。
问题
跨后端核查(#1468 修复的延伸)发现:drake 后端的 named
<contact data="force">传感器由 drake_uni C++ 合成(drake_uni/src/drake_uni/compiled/drake_env_pool.cc:1052-1066, 1155-1159),输出是 per-body 累加的世界系净接触力(contact_force()语义为f_Bc_W,世界系)。而 UniLab manager 层的接触门控契约(#1468 后)是 MuJoCo contact-frame 约定:第 0 列 = 接触法向。对平地足底接触,drake 输出的法向分量落在第 2 列(world z),第 0 列是切向摩擦的 world-x 分量——列语义与 mujoco / mjwarp / motrix 不一致。
现状处理
reward.contact(conf/ppo/task/go1_joystick_flat/drake.yaml)。reward.contact: null,在 drake 提供 contact-frame 力之前不让该 term 读到语义错误的列。正确归属层
按 backend isolation 原则,修复应在 drake_uni / drake backend 适配层:合成传感器时把世界系净力旋入接触坐标系(或对 geom-pair 接触用法向分量),使其满足 MuJoCo contact-frame 契约,然后在 go2 drake owner 重新启用
reward.contact。顺带记录的边界
mujoco / mjwarp 下
reduce="netforce"的 contact force 传感器同样输出世界系力(mujoco-warpsensor.py:1896的世界系旋转),当前仓库仅 sharpa_wave manipulation XML 使用 netforce,不经过步态接触门控;manager 层注释已声明该变体在契约之外。来源:#1468 / PR #1470 跨后端核查。