Newton 物理引擎核心解析:从 ModelBuilder 到求解器步进的 GPU 可微仿真工作流
2026/9/17 7:44:18 网站建设 项目流程

Newton 物理引擎核心解析:从 ModelBuilder 到求解器步进的 GPU 可微仿真工作流

【免费下载链接】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 官方文档的概览页 overview.rst 展开,系统梳理 Newton——一个构建在 NVIDIA Warp 之上、面向机器人与仿真研究的 GPU 加速、可扩展、可微物理引擎——的核心数据模型(ModelBuilder / Model / State / Contacts / Control)、六步仿真主循环,以及 XPBD、VBD、MuJoCo、Kamino、ImplicitMPM、Style3D 等八类求解器后端的定位与选择依据。读完本文,你能够独立用 Python API 搭建模型、驱动标准仿真循环,并结合源码理解每个核心对象在数据流中的角色与底层实现位置。

项目定位与关键特性

Newton 的官方定义是:一个GPU 加速、可扩展、可微的物理仿真引擎,服务于机器人、科研与高级仿真工作流。它构建在 NVIDIA Warp 之上,并集成了 MuJoCo Warp,目标是同时为使用者和开发者提供高性能仿真、现代化 Python API 和灵活的架构。由 Disney Research、Google DeepMind 和 NVIDIA 共同维护,采用 Apache-2.0 协议开源(见 LICENSE.md 与 CITATION.cff)。

关键特性可归纳为六点,每一条都能在仓库中找到对应实现:

特性说明仓库佐证
GPU 加速基于 NVIDIA Warp 实现快速、可扩展的仿真内核以@wp.kernel编写,如 solver.py 中的粒子积分内核
多求解器实现XPBD、VBD、MuJoCo、Featherstone、SemiImplicit、Kamino、ImplicitMPM、Style3D各后端位于 newton/_src/solvers/,导出表见 solvers/init.py
模块化设计易于扩展新的求解器与组件求解器通过统一的SolverBase.step接口接入,见 solver.py
可微仿真支持面向机器学习与优化的可微仿真官方 diffsim 示例目录 newton/examples/diffsim/
丰富的导入/导出支持 URDF、MJCF、USD 等模型格式导入入口为ModelBuilder.add_urdf / add_mjcf / add_usd
开源协作Disney Research、Google DeepMind、NVIDIA 联合维护见 CONTRIBUTING.md 与 docs/guide/development.rst

核心概念:模型构建、状态与仿真循环的数据流

官方概览用一张流程图描述了 Newton 的数据组织:

  • 模型创作(Model Authoring):通过 Python API 的ModelBuilder直接构建,或将 URDF / MJCF / USD 资产交给 Importer(add_urdf/add_mjcf/add_usd),最终汇入同一个ModelBuilder,产出Model
  • 仿真循环(Simulation Loop)State(状态)、Control(控制)、Contacts(接触)三者共同输入Solver,输出更新后的状态;
  • 输出(Outputs)Sensors(传感器)从更新后的状态与接触集中计算观测,Viewer负责实时可视化。

下面逐个说明这些核心对象,并标注其在源码中的位置。

ModelBuilder:模型的构建入口

ModelBuilder是构建仿真模型的统一入口,既可以用图元(体、形状、关节、粒子)直接搭建场景,也可以从外部格式导入资产。从源码结构看,其关键方法分布在 builder.py 中:

  • add_body(builder.py#L4963):添加刚体;
  • add_shape_sphere(builder.py#L7578):为体添加球形形状;
  • add_ground_plane(builder.py#L7547):添加地平面;
  • replicate(builder.py#L3093):将单个模板模型复制为上千个并行世界,是 GPU 批量仿真的基础;
  • finalize(builder.py#L12414):将 Builder 固化为只读的Model,并支持requires_grad=True参数为可微仿真做准备。

Model:仿真世界的静态描述

Model封装了仿真世界的物理结构、参数与配置,包括刚体(bodies)、关节(joints)、形状(shapes)以及质量、惯性等物理属性。它由ModelBuilder.finalize()生成之后不再被常规流程修改;若确实需要更新模型数据,SolverBase提供了notify_model_changed(flags)机制(solver.py#L588-L610),通过ModelFlags位掩码告知求解器刷新对应的内部缓冲,而无需重建求解器对象。

State:某时刻的动态状态

State表示给定时刻的动态状态,包含位置与速度等由求解器在每个时间步更新的量。此外,Newton 支持可选的扩展属性(extended attributes),用于存放刚体加速度等派生量,供传感器读取(参见 docs/concepts/extended_attributes.rst)。所有核心类从 newton/init.py 统一导出:ModelModelBuilderStateStateFlagsCollisionPipelineContactsControl等均可直接从import newton获得。

Contacts:碰撞流水线产出的接触集合

Contacts保存由CollisionPipeline.collide(state, contacts)产生的当前活动接触集,可选地携带接触力等扩展属性以支持传感与分析。collide方法的实现位于 collide.py#L2176-L2184,其文档字符串明确指出:该方法可安全地在wp.Tape上下文中调用——非可微的广相/窄相检测内核以record_tape=False启动,而软接触生成与刚接触增广内核会被记录进 tape,使梯度能够流经state.body_qstate.particle_q。这是 Newton 可微接触能力的关键设计。

Control:控制输入

Control编码仿真循环中施加的控制输入,如关节目标(joint_target_q/joint_target_qd)与前馈力(joint_f)。值得注意的一个全局开关是 newton/init.py#L14-L37 中的use_coord_layout_targets:它决定Model.joint_target_qControl.joint_target_q的形状是关节坐标数(默认,与State.joint_q对齐)还是已弃用的关节DOF 数布局,需在构造ModelBuilder之前设置。

Solver:推进仿真的引擎核心

求解器负责积分物理、处理接触并强制执行约束,是整个数据流的"发动机"。Newton 内置八类后端:

newton/_src/solvers/ ├── solver.py # SolverBase:统一接口,step(state_in, state_out, control, contacts, dt) ├── xpbd/ # SolverXPBD —— 隐式,最大坐标,支持粒子/布料/软体 ├── vbd/ # SolverVBD —— 隐式,有限关节支持 ├── mujoco/ # SolverMuJoCo —— 广义坐标,兼容 MuJoCo/MJCF 工作流 ├── featherstone/ # SolverFeatherstone —— 半隐式,广义坐标 ├── semi_implicit/ # SolverSemiImplicit —— 半隐式,最大坐标 ├── kamino/ # SolverKamino —— 实验性,带闭环运动学与硬摩擦接触 ├── implicit_mpm/ # SolverImplicitMPM —— 隐式 MPM,粒子/颗粒介质 └── style3d/ # SolverStyle3D —— 隐式,布料

所有后端实现同一step接口(solver.py#L571-L586):输入当前状态、控制与接触,输出更新后的状态。一个体现工程细节的设计是:solvers/init.py 通过 PEP 562 的模块级__getattr__实现惰性导入——每个公开符号映射到其真实所在模块,首次属性访问时才导入对应后端,从而避免import newton时付出加载全部求解器后端的成本。

选择求解器时的一个首要判据是坐标表示(摘自 docs/solvers/index.rst):面向刚体关节机器人,先决定用哪套坐标——SolverMuJoCoSolverFeatherstone采用广义坐标,SolverXPBDSolverSemiImplicitSolverKamino采用最大坐标;涉及可变形体、粒子或可微仿真时,则参考官方特性对照表。其中 Kamino 与 VBD 被标注为实验性,公共 API 可能随时变化。更完整的积分方法、关节类型、关节属性、接触材料与可微性支持矩阵,均可在 docs/solvers/index.rst 中查证。

Sensors:从状态到观测

传感器从StateContacts、sites 与 shapes 计算观测值,许多传感器依赖存放派生求解器输出的扩展属性。源码位于 newton/_src/sensors/,包含接触传感器、IMU、帧变换与分块相机(tiled camera)等实现,概念文档见 docs/concepts/sensors.rst。

Importer:外部格式导入

Importer 通过三个方法加载外部模型,实现均位于 builder.py:

  • ModelBuilder.add_urdf(builder.py#L3737)——URDF 机器人描述;
  • ModelBuilder.add_mjcf(builder.py#L4201)——MuJoCo XML 场景;
  • ModelBuilder.add_usd(builder.py#L3883)——USD 资产,并支持 deformable 附件、cloth、cable、volume 等专用导入工具(见 newton/src/utils/import_usd_deformable*.py)。

Viewer:可视化与调试

newton.viewer模块提供实时渲染与离线检视能力,后端包括 GUI、Rerun、RTX、viser 等(见 newton/_src/viewer/),配套指南为 docs/guide/visualization.rst。

仿真主循环:六步标准工作流

官方文档将标准仿真流程归纳为六个步骤,下面结合可运行的代码逐一印证:

  1. ModelBuilder构建或导入模型;
  2. finalize()固化为Model
  3. 创建传感器与CollisionPipeline,分配一个或多个State对象,外加Control输入与Contacts
  4. 调用CollisionPipeline.collide为当前状态填充接触集;
  5. 用当前状态、控制与接触步进求解器(solver.step);
  6. 更新传感器、检视输出、渲染或导出结果。

最小可运行示例

以下示例仅依赖pip install newton安装的基础包(代码继承自官方安装指南 docs/guide/installation.rst 的 Quick Start 一节):

import warp as wp import newton # 步骤 1:构建模型 builder = newton.ModelBuilder() body = builder.add_body( xform=wp.transform((0.0, 1.0, 0.0), wp.quat_identity()), mass=1.0, ) builder.add_shape_sphere(body, radius=0.25) builder.add_ground_plane() # 步骤 2:固化为 Model model = builder.finalize() # 步骤 3:创建求解器与状态缓冲 solver = newton.solvers.SolverXPBD(model) state_0 = model.state() state_1 = model.state() control = model.control() collision_pipeline = newton.CollisionPipeline(model) contacts = collision_pipeline.contacts() # 用前向运动学初始化状态 newton.eval_fk(model, model.joint_q, model.joint_qd, state_0) # 步骤 4-5:标准仿真循环 for step in range(120): state_0.clear_forces() collision_pipeline.collide(state_0, contacts) # 步骤 4:生成接触集 solver.step(state_0, state_1, control, contacts, 1.0 / 60.0) # 步骤 5:推进物理 state_0, state_1 = state_1, state_0 # 双缓冲交换

几个值得注意的实现细节:

  • 循环中使用双缓冲state_0/state_1交换),与SolverBase.step(state_in, state_out, ...)的输入/输出签名(solver.py#L571-L573)一一对应;
  • 每步先clear_forces()collide,保证接触力从干净的力缓冲开始累加;
  • 若需使用SolverMuJoCo等依赖 MuJoCo 的后端,需先安装pip install "newton[sim]";可选依赖组(simimportersonnxexamplestorch-cu12/13dev等)的完整说明见 docs/guide/installation.rst 的 Extra Dependencies 一节。

GPU 多世界并行:replicate 工作流

Newton 面向强化学习场景的典型用法是"单模板 + 大规模并行世界":

# 构建单个机器人模板 template = newton.ModelBuilder() template.add_mjcf("humanoid.xml") # 复制为 1024 个并行世界 builder = newton.ModelBuilder() builder.replicate(template, world_count=1024) builder.add_ground_plane() model = builder.finalize() # 求解器一次性并行推进全部 1024 个世界 solver = newton.solvers.SolverMuJoCo(model)

这正是核心数据流图的意义所在:Model一旦finalize,求解器内核即可按world维度在 GPU 上批量展开,State/Control/Contacts均以向量化数组承载多世界数据。replicate的实现在 builder.py#L3093,相关行为由 newton/tests/test_builder_replicate.py 覆盖。

可微仿真的入口

概览中强调的"可微"特性在源码层面体现为一条清晰的通路:ModelBuilder.finalize(requires_grad=True)→ 在wp.Tape()内执行前向 rollout →tape.backward(loss)填充梯度。碰撞侧的梯度支持如前所述由collide内部区分可微/不可微内核实现(collide.py#L2185-L2198)。官方 docs/solvers/index.rst 给出了一个完整的最小可微示例(SolverSemiImplicit+wp.Tape+ 自定义 loss 内核),并指出 Featherstone 与 SemiImplicit 目前提供基础可微性,完整参考工作流见 newton/examples/diffsim/。

快速索引与延伸阅读

按概览文档给出的 Quick Links,围绕 Newton 继续深入的路径(均已转换为仓库根目录相对路径):

主题位置
安装与首个示例docs/guide/installation.rst ——pip install "newton[examples]"后运行python -m newton.examples
教程入口docs/guide/tutorials.rst 与 docs/tutorials/00_introduction.ipynb
求解器对比与调参docs/solvers/index.rst、MuJoCo 后端指南 docs/solvers/mujoco.rst、Kamino 后端指南 docs/solvers/kamino.rst
概念文档关节 docs/concepts/articulations.rst、碰撞 docs/concepts/collisions.rst、传感器 docs/concepts/sensors.rst、扩展属性 docs/concepts/extended_attributes.rst、坐标系约定 docs/concepts/conventions.rst
常见问题docs/faq.rst
开发者指南docs/guide/development.rst
完整 API 参考docs/api/newton.rst
示例合集newton/examples/,运行python -m newton.examples --list查看全部

一句话总结 Newton 的心智模型:ModelBuilder 负责"造世界"(原生图元或 URDF/MJCF/USD 导入),Model 是世界的只读蓝图,State/Control/Contacts 是每步流动的三股数据,Solver 是消费它们并输出新状态的 GPU 内核——掌握这条数据链,再配合replicate多世界并行与wp.Tape可微通路,即可覆盖从单机刚体仿真到大规模可微强化学习的主要场景。

【免费下载链接】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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询