系列文章目录

目录

系列文章目录

前言

一、使用 Kamino 模拟复杂机构

二、使用Newton和Isaac Lab的仿真工作流

三、Newton 在工业应用中的使用情况

3.1 GPU机架组装自动化

3.2 冰箱组装中的线缆操作


前言

        物理学是机器人仿真的基础,它能够实现运动和交互的逼真建模。对于移动和操作等任务,仿真器必须处理接触力与可变形物体等复杂的动力学问题。虽然大多数引擎在速度与逼真度之间取舍,但Newton——一款基于GPU加速的开源仿真器——却旨在兼顾二者。

        在 NVIDIA GTC 2026 大会上发布的 Newton 1.0 GA,为灵巧操作和移动任务提供了加速且可投入生产的基石。作为基于 NVIDIA WarpOpenUSD 构建的可扩展物理引擎,机器人可在使用 NVIDIA Isaac Lab 和 NVIDIA Isaac Sim 等框架的同时,以更高的精度、速度和可扩展性学习如何处理复杂任务。

        Newton 是一个模块化框架,它在统一的架构下整合了多种求解器和仿真组件。它不局限于单一场景格式,而是支持一种广泛的运行时数据模型,涵盖了 MJCF、URDF 和 OpenUSD 等常见的机器人描述格式,从而更轻松地连接现有的机器人资产和工作流。团队可以自由组合碰撞检测、接触模型、传感器、控制以及求解器后端(包括刚体求解器、可变形求解器以及自定义求解器),同时保持用于机器人学习和开发的模拟栈的一致性。

图 1. Newton 架构展示了一个模块化的物理仿真框架,该框架整合了机器人学和物理学工作负载中的多个求解器和组件,并提供了与 Isaac Lab、Isaac Sim、MuJoCo 以及 OpenUSD 的集成接口。

        本次发布的亮点包括:

  1. 稳定的 API:Newton API 为仿真中的建模、求解、控制和传感等广泛功能提供了稳定、统一的接口。
  2. 多功能刚体求解器:Newton 随附了多种刚体求解器。MuJoCo 和 Kamino 具备最先进且互补的功能:
    1. 由迪士尼研究院开发的 Kamino 可处理具有闭环连杆和被动驱动的复杂机构,例如机械手和腿足系统。它开辟了全新的仿真能力,使机械设计师能够自由设计系统而无需担心可仿真性,同时为可扩展的强化学习铺平了道路。
    2. MuJoCo 3.5(MJWarp)基于机器人学界已信赖的 MuJoCo 的稳定性和准确性,由 Google DeepMind 开发,现已扩展至支持数千个并行训练环境的 GPU 级吞吐量。新的优化使 MuJoCo Warp 在 NVIDIA RTX PRO 6000 Blackwell 系列上,移动任务的 MJX 速度提升了 252 倍,操作任务的速度提升了 475 倍。
  3. 丰富的可变形仿真:Newton 基于顶点块下降法(VBD)求解器,支持线性可变形体(缆绳)、薄壁可变形体(布料)和体积可变形体(橡胶部件),涵盖了真实工业环境中常见的材料。此外,隐式材料点法(iMPM)可处理粒子仿真(颗粒材料),适用于崎岖地形行走场景。VBD 和 MPM 求解器可与 MuJoCo Warp 显式耦合,以支持机器人系统的可变形操作和移动场景。
  4. 碰撞库:灵活且快速的碰撞检测管道允许根据场景复杂度选择合适的广相和窄相检测方法。该管道可复用,并能加速自定义求解器的开发。该库包含先进的接触生成和建模功能:
    1. 基于有符号距离场(SDF)的碰撞检测可直接从CAD导出的网格中捕获复杂几何形状,无需采用网格近似方法。这对连接器插入或手持操作等高精度任务至关重要。
    2. 受德雷克(Drake)接触模型启发的流体弹性接触技术,采用在有限面积接触区域内连续的压力分布,而非传统的接触点集。这为触觉感知和操作策略提供了更高保真度、更稳健的物体交互能力,最终实现更优的模拟到现实的转换效果。
      视频 1. 基于 Newton 的 GPU 加速流体弹性接触模型能够生成并扩展高质量、逼真的灵巧触觉数据
  5. OpenUSD 与 Isaac 的集成:以 OpenUSD 作为通用数据层,Newton 可原生集成 NVIDIA Isaac Sim 6.0Isaac Lab 3.0 抢先体验版,从而在强化学习和模仿学习工作流中,实现从机器人描述到训练策略及评估管道的更快速工作流。
  6. 分块式摄像头传感器:基于 Warp 的分块式摄像头传感器支持高吞吐量的简化渲染,提供 RGB、深度、反照率、表面法线和实例分割等通道。该传感器旨在扩展基于视觉的强化学习策略,支持在 NVIDIA DGX 平台上运行端到端的感知训练管道。其渲染后端基于光线追踪技术,并支持多种场景表示形式,包括三角网格和高斯散点。
    视频 2. 采用分区式摄像头传感器,在多个并行环境中生成批量视觉观测数据,用于感知强化学习训练

        Newton 是由 NVIDIA、Google DeepMind 和迪士尼研究院共同发起的一个 Linux 基金会项目。作为物理人工智能模拟基础设施领域的领导者,Lightwheel 已与 Newton 携手合作,共同推进求解器校准、制定 SimReady 标准,并开发新一代基于物理的 SimReady 资产。Drake 物理引擎的开发者——丰田研究院(TRI)也正与 Newton 合作,以推动求解器开发和接触建模能力的进步。

        下一节将详细介绍这些能力如何在运动与操作工作流中协同运作。


一、使用 Kamino 模拟复杂机构

        Kamino 求解器能够处理复杂且精密的闭环机构,例如运动学中包含平行连杆机构的机器人。这使得多连杆步行机器人等机构的模拟成为可能,此类机器人的每条腿的运动学可能包含多个闭环。例如,Newton 资产库中提供的闭环机器人腿部机构 Dr. Legs,就展示了 Kamino 如何处理具有多个闭环的铰接结构。

视频 3. “Dr. Legs”——一种闭环机器人腿部机构,使用 Kamino 求解器进行仿真

        Newton 工作流遵循一致的模式:构建或导入模型、初始化状态、应用控制(如关节目标或力),然后驱动 Kamino 等求解器进行迭代以推进物理演算,并通过查看器可视化结果。

import newton​
 
# Import the articulation model from USD​
builder = newton.ModelBuilder()​
 
# Register attributes to be parsed specific to Kamino
newton.solvers.SolverKamino.register_custom_attributes(builder)
 
# Import USD asset
builder.add_usd("robot.usd")​
 
# Finalize the model (upload to GPU)​
model = builder.finalize()​
 
# Create Kamino solver​
solver = newton.solvers.SolverKamino(model)​
 
# Create state and control objects​
state_0 = model.state()​
state_1 = model.state()​
control = model.control()​
contacts = model.contacts()​
 
# Simulation loop​
for i in range(num_steps):​
state_0.clear_forces()​
model.collide(state_0, contacts)
 
      # Forward dynamics​
solver.step(state_0, state_1,​
control, contacts, sim_dt​)​
 
    # Swap states​
state_0, state_1 = state_1, state_0  ​

二、使用Newton和Isaac Lab的仿真工作流

图2. 在Isaac Lab中执行拣选魔方任务的Franka机器人

        NVIDIA Isaac Lab 是一个用于机器人学习的开源框架。研究人员和开发者可以定义仿真环境,搭建强化学习(RL)和模仿学习管道,并在 GPU 规模上训练策略。用户需定义场景(机器人、物体、地形)、马尔科夫决策过程(MDP,包括观测、动作、奖励和终止条件)以及仿真后端。Newton 作为新的物理引擎和摄像头传感器后端与 Isaac Lab 集成,进一步扩展了 Isaac Lab 的功能。

        在 Isaac Lab 的强化学习工作流中,物理层之上的所有内容——任务定义、PPO 训练循环、观测和奖励函数——保持不变。仅模拟后端发生变化。这意味着开发人员只需编写一次环境,即可在不同的物理引擎上进行验证,从而在实际部署前建立对策略鲁棒性的信心。

        通过 Newton 与 Isaac Lab 的结合,可以构建一条强化学习管道,用于训练 Franka 机器人拾取立方体物体。配置好场景后,需设置物理参数。以下示例展示了 Isaac Lab 如何为 Franka 机器人的立方体操作环境采用三层物理配置。

from isaaclab.sim import SimulationCfg
from isaaclab_newton.physics import NewtonCfg, MJWarpSolverCfg
 
# Configure Newton MJWarp simulation for the Franka Cube Env
FrankaCubeEnvCfg.solver_cfg = MJWarpSolverCfg(
    solver="newton",
    integrator="implicitfast",
    njmax=2000,
    nconmax=1000,
    impratio=1000.0,
    cone="elliptic",
    update_data_interval=2,
    iterations=20,
    ls_iterations=100,
    ls_parallel=True,
)
 
FrankaCubeEnvCfg.newton_cfg = NewtonCfg(
    solver_cfg=FrankaCubeEnvCfg.solver_cfg,
    num_substeps=2,
    debug_mode=False,
)
 
FrankaCubeEnvCfg.sim = SimulationCfg(
    dt=1 / 120,
    render_interval=FrankaCubeEnvCfg.decimation,
    physics=FrankaCubeEnvCfg.newton_cfg,
)

        其他所有步骤,例如执行操作、获取奖励以及重置环境,均保持不变。

三、Newton 在工业应用中的使用情况

        以下两个示例展示了 Newton 的各项功能如何在生产机器人工作流中协同发挥作用。其中一个示例侧重于刚体精密装配,另一个则侧重于对可变形材料的灵巧操作。

3.1 GPU机架组装自动化

        Skild AI正在为其工业终端用户训练用于GPU机架组装的强化学习策略,这是电子制造领域中要求最为严苛、涉及大量接触的任务之一。连接器插入、电路板放置和紧固操作需要稳定的碰撞与接触检测、可靠的力反馈以及高保真度的几何建模,而大多数仿真器在训练规模下无法提供这些功能。

        Skild 正在使用搭载 Newton 后端的 Isaac Lab 来处理其电子组装自动化任务。在其工作流中,基于 SDF 的碰撞检测和水弹性接触建模被用于绕过 MuJoCo Warp 的原生碰撞和接触管道,从而实现更高的接触保真度。通过基于原始 CAD 几何体预先计算的 SDF 来配置形状,使 Newton 能够处理非凸三角网格模型,从而精确呈现装配部件的几何结构。

        SDF 碰撞检测特别适用于具有复杂几何结构的刚性、非柔性交互,能够针对连接器、电路板及其他公差要求极高的部件进行精确的接触查询。

        为了实现更丰富的接触动力学,流体弹性建模引入了顺应性,从而产生分布式压力接触,而非点接触近似。这形成了更大的接触面积,能够捕捉摩擦行为,包括在复杂的物体操作序列中可能产生的扭转摩擦效应。SDF 几何表示与流体弹性接触模型相结合,提供了训练策略所需的精度,这些策略能够可靠地迁移到真实的工业装配系统中。

        以下代码片段展示了如何配置 SDF 碰撞和流体弹性接触:

import newton
from newton.geometry import HydroelasticSDF
 
# --- 1. Shape configuration: enable hydroelastic contact ---
shape_cfg = newton.ModelBuilder.ShapeConfig(
    mu=1.0,             # friction coefficient
    gap=0.01,           # contact detection margin [m]
    ke=5.0e4,           # elastic contact stiffness (MJWarp fallback)
    kd=5.0e2,           # contact damping
    kh=1.0e11,          # hydroelastic stiffness [Pa/m] — controls
                        # pressure vs. penetration across the contact patch
)
 
# --- 2. Build SDF on each collision mesh ---
# Precompute a sparse signed-distance field so Newton can find
# sub-voxel contact surfaces via marching cubes at runtime.
for mesh in assembly_meshes:
    mesh.build_sdf(
        max_resolution=128,                # SDF grid resolution
        narrow_band_range=(-0.01, 0.01),   # ±10 mm band around surface
        margin=shape_cfg.gap,
    )
 
# --- 3. Mark shapes as hydroelastic ---
# When both shapes in a colliding pair carry this flag, Newton
# routes them through the SDF-hydroelastic pipeline instead of
# MJWarp's native point-contact solver.
for shape_idx in range(builder.shape_count):
    builder.shape_flags[shape_idx] |= newton.ShapeFlags.HYDROELASTIC
 
# --- 4. Create the collision pipeline with hydroelastic config ---
collision_pipeline = newton.CollisionPipeline(
    model,
    reduce_contacts=True,       # contact-reduction for stable solving
    broad_phase="explicit",     # precomputed shape pairs (few shapes)
    sdf_hydroelastic_config=HydroelasticSDF.Config(
        output_contact_surface=False,   # skip surface mesh export
 
    ),
)
 
# --- 5. Simulation loop (unchanged from standard Newton) ---
# The solver receives distributed contact patches transparently.
collision_pipeline.collide(state, contacts)
solver.step(state_0, state_1, control, contacts, dt)

3.2 冰箱组装中的线缆操作

        三星将利用Newton生成基于物理的合成数据(SDG),用于训练其视觉-语言-动作(VLA)模型。

        Lightwheel正在应用Newton生成SimReady资产,并基于真实世界的测量和验证进行适当调优。这使得各种复杂的工业装配任务成为可能,包括三星制造工作流中的线缆操作任务。线缆是难以可靠模拟的对象之一,其表现出复杂的一维可变形行为、自碰撞以及受力依赖的形状变化,这些特性是传统求解器无法准确捕捉的。

        三星和Lightwheel的工作展示了Newton的可变形仿真栈(涵盖从线缆到体积固体的范围)如何支持针对真实电子产品装配线中各类材料的合成数据生成和策略训练。

视频 5. 一台 RB-Y1 机器人正在执行冰箱组装中的电缆插入任务,该任务通过双向耦合的 MuJoCo Warp 算法和 VBD 电缆求解器进行模拟

        Newton 的 VBD 求解器支持对电缆等线性可变形物体进行仿真。通过与 MuJoCo Warp 等刚体求解器进行双向耦合,可在仿真过程中实现机器人运动与电缆变形之间的物理交互。结合 Newton 稳定的碰撞和高保真接触建模功能,该方案能够模拟诸如将冰箱水管接头插入其外壳等任务。该代码片段展示了 VBD 与 MuJoCo Warp 如何进行耦合。

import warp as wp
import newton
from newton.solvers import SolverMuJoCo, SolverVBD
 
# --- Universe A: MuJoCo rigid-body robot ---
robot_model = robot_builder.finalize()
 
mj_solver = SolverMuJoCo(
    robot_model,
    solver="newton",
    integrator="implicitfast",
    cone="elliptic",
    iterations=20,
    ls_iterations=10,
    ls_parallel=True,
    impratio=1000.0,
)
 
robot_state_0 = robot_model.state()
robot_state_1 = robot_model.state()
control = robot_model.control()
mj_collision_pipeline = newton.CollisionPipeline(
    robot_model,
    reduce_contacts=True,
    broad_phase="explicit",
)
mj_contacts = mj_collision_pipeline.contacts()
 
# --- Universe B: VBD deformable cable ---
cable_builder = newton.ModelBuilder()
 
cable_builder.add_rod(
    positions=cable_points,          # polyline vertices [m]
    quaternions=cable_quats,         # parallel-transport frames
    radius=0.003,                    # cable cross-section radius [m]
    stretch_stiffness=1e12,          # EA [N]
    bend_stiffness=3.0,              # EI [N*m^2]
    stretch_damping=1e-3,
    bend_damping=1.0,
)
 
# --- Proxy bodies: robot links mirrored into VBD ---
for body_id in proxy_body_ids:
    # Effective mass: reflects the inertia of the full articulated
    # chain when applicable, optionally scaled for coupling stability.
    proxy_id = cable_builder.add_body(
        xform=robot_state_0.body_q[body_id],
        mass=effective_mass[body_id],
    )
    for shape in shapes_on_body(robot_model, body_id):
        cable_builder.add_shape(body=proxy_id, **shape)
 
    robot_to_vbd[body_id] = proxy_id
 
cable_model = cable_builder.finalize()
 
vbd_solver = SolverVBD(
    cable_model,
    iterations=10,
)
 
vbd_state_0 = cable_model.state()
vbd_state_1 = cable_model.state()
vbd_control = cable_model.control()
vbd_collision_pipeline = newton.CollisionPipeline(cable_model)
vbd_contacts = vbd_collision_pipeline.contacts()
 
proxy_forces = wp.zeros(robot_model.body_count, dtype=wp.spatial_vector)
coupling_forces_cache = wp.zeros_like(proxy_forces)
 
 
@wp.kernel
def sync_proxy_state(
    robot_ids: wp.array(dtype=int),
    proxy_ids: wp.array(dtype=int),
    src_body_q: wp.array(dtype=wp.transform),
    src_body_qd: wp.array(dtype=wp.spatial_vector),
    dst_body_q: wp.array(dtype=wp.transform),
    dst_body_qd: wp.array(dtype=wp.spatial_vector),
    proxy_forces: wp.array(dtype=wp.spatial_vector),
    body_inv_mass: wp.array(dtype=float),
    body_inv_inertia: wp.array(dtype=wp.mat33),
    gravity: wp.vec3,
    dt: float,
):
    i = wp.tid()
    rid = robot_ids[i]
    pid = proxy_ids[i]
 
    # Copy pose and velocity from robot to proxy
    dst_body_q[pid] = src_body_q[rid]
    qd = src_body_qd[rid]
 
    # Undo coupling forces + gravity on proxy velocity
    f = proxy_forces[rid]
    delta_v = dt * body_inv_mass[pid] * wp.spatial_top(f)
    r = wp.transform_get_rotation(dst_body_q[pid])
    delta_w = dt * wp.quat_rotate(r, body_inv_inertia[pid] * wp.quat_rotate_inv(r, wp.spatial_bottom(f)))
    qd = qd - wp.spatial_vector(delta_v + dt * body_inv_mass[pid] * gravity, delta_w)
 
    dst_body_qd[pid] = qd
 
 
# --- Coupled step (staggered, one-step lag) ---
 
# Step 1 -- Apply lagged VBD-to-MuJoCo wrenches
 
robot_state_0.clear_forces()
coupling_forces_cache.assign(proxy_forces)
robot_state_0.body_f.assign(robot_state_0.body_f + coupling_forces_cache)
 
# Step 2 -- Advance MuJoCo (rigid-body robot)
mj_collision_pipeline.collide(robot_state_0, mj_contacts)
mj_solver.step(robot_state_0, robot_state_1, control, mj_contacts, dt)
robot_state_0, robot_state_1 = robot_state_1, robot_state_0
 
# Step 3 + 4 -- Sync proxy poses/velocities and undo coupling forces (single kernel)
wp.launch(
    sync_proxy_state,
    dim=len(proxy_body_ids),
    inputs=[
        robot_ids_wp, proxy_ids_wp,
        robot_state_0.body_q, robot_state_0.body_qd,
        vbd_state_0.body_q, vbd_state_0.body_qd,
        coupling_forces_cache,
        cable_model.body_inv_mass, cable_model.body_inv_inertia,
        gravity, dt,
    ],
)
 
# Step 5 -- Advance VBD (cable deformation + cable-proxy contacts)
vbd_collision_pipeline.collide(vbd_state_0, vbd_contacts)
vbd_solver.step(vbd_state_0, vbd_state_1, vbd_control, vbd_contacts, dt)
 
# Step 6 -- Harvest contact wrenches from proxy bodies (applied at next step)
proxy_forces = harvest_proxy_wrenches(vbd_solver, vbd_state_1, vbd_contacts, dt)
 
vbd_state_0, vbd_state_1 = vbd_state_1, vbd_state_0

        三星与Lightwheel的合作成果展示了Newton的可变形仿真平台如何实现基于真实电子产品装配线中各类材料的合成数据生成与策略训练。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐