ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Newton 引擎 MuJoCo 关节参考值(joint reference)处理机制:qpos 绝对坐标与作者位形相对坐标的转换实现

Newton 引擎 MuJoCo 关节参考值(joint reference)处理机制:qpos 绝对坐标与作者位形相对坐标的转换实现 Newton 引擎 MuJoCo 关节参考值joint reference处理机制qpos 绝对坐标与作者位形相对坐标的转换实现【免费下载链接】newtonAn open-source, GPU-accelerated physics simulation engine built upon NVIDIA Warp, specifically targeting roboticists and simulation researchers.项目地址: https://gitcode.com/GitHub_Trending/newton9/newton导读本篇文章围绕 Newton基于 NVIDIA Warp 的 GPU 物理仿真引擎中 MuJoCo 关节参考值MJCFref、USDmjc:ref与mjc:springref、mujoco.dof_ref的实现机制展开。在 MuJoCo 语义中qpos是绝对坐标而 Newton 内部将关节坐标、限位与位置目标统一存储为相对作者位形authored pose的偏移量本篇文章将深入说明 Newton 如何在导入import、求解solver与导出export全链路中完成两种坐标系的转换并解释mjc:compiler:angle单位规则、mjc:inheritRange继承控制范围以及 CONNECT equality 锚点等细节。读完本文你将掌握 Newton 处理 MuJoCo 关节参考值的完整数据流并能正确诊断相关导入/导出问题。背景为什么关节需要参考值MuJoCo 模型中关节的qpos是广义坐标的绝对数值。例如一个hinge旋转关节的qpos直接表示绝对角度range限位也是以绝对qpos为基准定义的。然而在很多机械臂、外骨骼模型中关节存在一个作者位形authored pose下的参考值reference value——即模型在装配时关节本就处于某个非零角度或位移例如肘部初始弯曲 30°、滑块初始偏移 0.5 米。MuJoCo 通过关节的ref属性MJCF 中为refUSD 中为mjc:refNewton 内部为mujoco.dof_ref表达这一初始参考值。它带来一个微妙问题限位range是绝对qpos语义而用户心智中的关节转角/位移往往是相对参考点的。如果引擎内部存储的坐标与限位基准不一致就会出现限位错位、位置控制目标漂移等隐蔽错误。Newton 的解决方案本 changelog 条目mujoco-joint-reference-7c4e2a91.changed.md的核心内容是对于具有非零参考值的 MuJoCo 关节Newton 的标量关节坐标、限位和位置目标一律保持相对作者位形的表示由求解器在内部与绝对 MuJoCoqpos坐标之间做双向转换。Newton 侧的统一表示相对作者位形的坐标在 Newton 的模型中关节限位存储为joint_limit_lower/joint_limit_upper其数值语义是相对作者位形的偏移量而非 MuJoCo 的绝对qpos。这一点在 MJCF 导入器 的注释中写得很明确# MJCF ranges use absolute qpos, while Newton joint coordinates use qpos - ref. # SolverMuJoCo adds ref back when it builds jnt_range. if has_range: joint_ref_value parse_float(joint_attrib, ref, 0.0) if is_angular and use_degrees: joint_ref_value np.deg2rad(joint_ref_value) limit_lower - joint_ref_value limit_upper - joint_ref_value这段代码展示了导入时的核心转换逻辑从 MJCF 关节属性中解析ref默认 0.0即parse_float(joint_attrib, ref, 0.0)若关节是角运动关节hinge/ball且编译器使用角度单位use_degrees将ref从度转为弧度np.deg2rad将绝对qpos语义的限位range减去ref得到相对作者位形的限位存入 Newton 的joint_limit_lower/upper。求解器在构建jnt_range时会再把ref加回来恢复 MuJoCo 的绝对语义。这样一个方向导入时减去、一个方向求解时加回的对称转换构成了整个机制的基础。单位换算的细节度与弧度注意use_degrees这个标志MuJoCo MJCF 编译器默认对旋转关节使用度作为角度单位除非compiler angleradian/。Newton 的导入逻辑严格遵循这一规则只有显式给出range时才做度→弧度转换默认的/-MAXVAL哨兵值代表无限不能被缩放参见 import_mjcf.py 的注释ref同样遵循use_degrees转换如 test_ref_shifts_joint_limits_degrees 所示ref30配合range10 90会被转换为np.deg2rad(30.0)。测试佐证限位平移test_ref_shifts_joint_limits 直接验证了这一行为对ref0.5的 hinge 关节声明range0.4 0.9导入后 Newton 内部的限位会变为(-0.1, 0.4)绝对 qpos 限位减去 ref而model.mujoco.dof_ref仍保留1.5708等原始参考值见 test 5279 附近。也就是说参考值本身完整保留在mujoco.dof_ref中而所有依赖它的数据限位、目标、控制范围在导入时被统一折算为相对坐标。求解器中的双向转换构建jnt_range时加回 ref在 MuJoCo 求解器 solver_mujoco.py 中读取mujoco.dof_ref自定义属性并按 DOF 索引取值dof_ref_value 0.0 ref_attr b.custom_attributes.get(mujoco:dof_ref) if ref_attr is not None and isinstance(ref_attr.values, dict): dof_ref_value float(ref_attr.values.get(dof_idx, ref_attr.default)) lower b.joint_limit_lower[dof_idx] dof_ref_value upper b.joint_limit_upper[dof_idx] dof_ref_valuedof_ref以每 DOF 索引的形式存储在custom_attributes的字典中values字典 default兜底值因此可以精确地对多 DOF 关节如 ball joint 的 3 个旋转自由度分别指定参考值——事实上 MJCF 导入器 在解析 ball joint 时会把dof_ref等属性复制到全部 3 个 DOF 上。位置目标与 CONNECT equality 锚点的一致性本 changelog 配套的修复条目mujoco-joint-reference-7c4e2a91.fixed.md进一步要求关节参考值转换对 CONNECT equality 锚点和继承的执行器控制范围保持一致性包括 USD 的mjc:inheritRange。CONNECT equality 约束将两个关节的坐标耦合起来其锚点坐标同样遵循 MuJoCo 绝对qpos语义若参考值转换只作用于限位而遗漏了 equality 锚点就会出现限位对齐但约束锚点错位的不一致状态。修复后equality 锚点与关节限位使用同一套 ref 折算规则保证所有依赖绝对qpos的数据点在同一条坐标基准线上。USD 路径mjc:ref、mjc:springref与mjc:compiler:angleNewton 的 USD 导入路径同样支持 MuJoCo 语义的参考值通过自定义属性系统映射为内部概念USD 属性Newton 内部概念含义mjc:refmujoco.dof_ref关节参考位形初始 qpos 偏移mjc:springrefmujoco.dof_springref弹簧/位置控制的目标参考角度mjc:compiler:angleuse_degrees角度单位声明默认度在 import_usd.py 中可以看到mjc:springref与mjc:ref被注册为自定义属性的定义。本次变更修复的重点是USD 中 revolute旋转关节的mjc:springref必须遵循mjc:compiler:angle声明的单位进行换算且默认按度处理。也就是说若 USD 场景声明mjc:compiler:angle为默认degree则mjc:springref 30.0会被转换为内部弧度np.deg2rad(30.0)若声明为radian则按弧度原样处理prismatic平移关节的mjc:springref不受角度单位影响始终按长度单位米处理。测试 test_springref_attribute_parsingUSD 版 验证了mjc:springref 30.0的 revolute 关节被转为np.deg2rad(30.0)而 prismatic 关节的0.25保持不变test 7495 附近 则同时验证ref与springref的度→弧度转换组合。无角度属性时mjc:ref的度解释test 7284 附近 专门覆盖了一个边界情形当 revolute 关节的mjc:ref没有声明角度单位属性时按默认度解释例如float mjc:ref 90.0被转为π/2弧度。与此同时test 7341 附近 验证了标准 USD drive 目标在存在mjc:ref时保持不变——即只有 MuJoCo 语义的参考值参与坐标折算普通 USD 关节驱动目标不受影响避免了两套语义互相污染。继承控制范围inheritrange与mjc:inheritRangeMuJoCo 位置执行器position actuator的inheritrange是一个便捷机制将目标关节的限位范围按比例0~1继承为执行器的ctrlrange控制范围。由于ctrlrange是 MuJoCo 原生数据、采用绝对 qpos语义而 Newton 的关节限位是相对作者位形的因此继承时同样需要把ref加回。MJCF 路径在 MJCF 导入器 中inheritrange parse_float(merged_attrib, inheritrange, 0.0) if inheritrange 0 and joint_name and qd_start 0: # inheritrange copies absolute MuJoCo qpos, but Newton stores joint limits as qpos - ref. # Add ref back so the derived ctrlrange matches native MuJoCo. dof_ref_value 0.0 ref_attr builder.custom_attributes.get(mujoco:dof_ref) if ref_attr is not None and isinstance(ref_attr.values, dict): dof_ref_value float(ref_attr.values.get(qd_start, ref_attr.default)) lower builder.joint_limit_lower[qd_start] dof_ref_value upper builder.joint_limit_upper[qd_start] dof_ref_value if lower upper: mean (upper lower) / 2.0 radius (upper - lower) / 2.0 * inheritrange merged_attrib[ctrlrange] f{mean - radius} {mean radius} merged_attrib[ctrllimited] true注意此处的限制inheritrange仅对单 DOF 关节hinge、slide有意义因此代码只使用qd_start第一个 DOF。USD 路径USD 侧的mjc:inheritRange在 solver_mujoco.py 的_resolve_inheritrange_as_ctrlrange中解析逻辑与 MJCF 路径对称读取mjc:inheritRange属性解析执行器目标关节路径取该关节的 DOF 起始索引将 Newton 相对限位加上dof_ref_value得到绝对qpos限位再按inheritrange比例计算控制范围返回(mean - radius, mean radius)。若目标关节无法解析、限位无效lower upper或inheritrange 0则返回None表示不继承。配套的transform_ctrlrange/transform_has_ctrlrange/transform_ctrllimited将其接入自定义属性解析管线且mjc:ctrlLimited在inheritrange可解析时默认置为 true见 solver_mujoco.py。导出方向从相对坐标回到绝对 qpos导入、求解之外Newton 还支持将模型导出为 MJCF 场景此时需要做逆向转换将 Newton 内部相对限位加上dof_ref恢复为 MuJoCo 绝对qpos限位并按单位规则输出。在 solver_mujoco.py 的导出逻辑 中弧度场景下dof_ref_value float(joint_ref[ai]) if joint_ref is not None else 0.0 joint_params[range] (lower dof_ref_value, upper dof_ref_value)而在度单位场景下L7070-L7095不仅range要加回 refspringref与ref本身也要做np.rad2deg反向转换后写入 MJCF 属性。由此导入减 ref、求解/导出加回 ref的闭环保证了同一模型在 Newton 内部与 MuJoCo 原生语义下完全等价不会因坐标基准不同而产生数值漂移。典型排查场景与要点小结当你在 Newton 中使用带参考值的 MuJoCo 模型时以下几点值得特别留意限位看起来错位是正常的Newton 内部joint_limit_lower/upper是相对作者位形的数值mujoco.dof_ref才是原始参考值对账时需将两者相加才能与 MJCF 的range对应。单位规则因来源而异MJCF 导入遵循编译器angle声明默认度USD 导入中mjc:ref/mjc:springref遵循mjc:compiler:angle默认度且仅影响 revolute 关节prismatic 关节始终按长度处理。继承范围依赖 ref 一致性inheritrangeMJCF与mjc:inheritRangeUSD派生的ctrlrange都按绝对qpos语义生成与限位共用同一套 ref 折算避免执行器控制范围与关节限位基准不一致。equality 约束锚点同步折算CONNECT equality 锚点与限位、控制范围共用参考值转换逻辑保证约束耦合关系不会因坐标基准差异而破坏。导出为双向一致性的最终验证导出 MJCF 时ref、springref、range均会加回 ref 并完成弧度→度转换确保导出文件在原生 MuJoCo 中表现一致。上述行为均有对应测试覆盖例如 test_ref_shifts_joint_limits、test_springref_attribute_parsingMJCF、test_springref_attribute_parsingUSD 与 test_import_usd.py 的度转换用例可作为验证与回归的参考入口。【免费下载链接】newtonAn open-source, GPU-accelerated physics simulation engine built upon NVIDIA Warp, specifically targeting roboticists and simulation researchers.项目地址: https://gitcode.com/GitHub_Trending/newton9/newton创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表