[isaacsim.physics.newton.tensors] Isaac Sim Newton Physics Tensor Backend#
Version: 0.1.7
Extension: {{ extension_version }} |
Documentation Generated: Jun 05, 2026 |
Overview#
The isaacsim.physics.newton.tensors extension provides a C++ tensor backend for the Newton physics engine,
implementing the omni.physics.tensors interface. It enables batched get/set operations on articulations,
rigid bodies, and contact sensors with native CUDA acceleration and zero-copy Warp array interop.
The backend registers as a first-class omni.physics.tensors plugin, allowing Newton simulations to be
controlled through the same Python API used by the PhysX backend.
omni.physics.tensors (api.py)
│
▼ C++ plugin
SimulationBackend
│
▼
BaseSimulationView
├── CpuSimulationView ├── GpuSimulationView
│ creates: │ creates:
│ ├─ CpuArticulationView │ ├─ GpuArticulationView
│ ├─ CpuRigidBodyView │ ├─ GpuRigidBodyView
│ └─ CpuRigidContactView │ └─ GpuRigidContactView
│ │
│ Each Cpu/Gpu view inherits from a shared Base class:
│
├── BaseArticulationView ◄── CpuArticulationView, GpuArticulationView
├── BaseRigidBodyView ◄── CpuRigidBodyView, GpuRigidBodyView
└── BaseRigidContactView ◄── CpuRigidContactView, GpuRigidContactView
Architecture#
The backend separates device-independent logic from device-specific data transfer through a three-layer class hierarchy for each view type:
Base classes (
BaseSimulationView,BaseArticulationView,BaseRigidBodyView,BaseRigidContactView) hold Newton/Python state, build index mappings from the Newton model, cache raw Warp array pointers, and implement theomni.physics.tensorsinterface methods that are shared across devices.CPU classes (
CpuSimulationView,CpuArticulationView,CpuRigidBodyView,CpuRigidContactView) implement getter/setter methods using CPU gather/scatter loops that read from and write to host-side Warp arrays directly.GPU classes (
GpuSimulationView,GpuArticulationView,GpuRigidBodyView,GpuRigidContactView) implement getter/setter methods using CUDA kernels, pre-allocated device index buffers, and a staging buffer for D2H transfers when the caller’s output tensor is on CPU.
The simulation backend automatically selects CPU or GPU view classes based on the Newton model’s device. GPU views also support the GC (GPU simulation, CPU view tensors) configuration by staging CPU index and source data into pre-allocated device buffers before kernel execution.
Memory Management#
All GPU memory is allocated during construction and reused across API calls:
Device index buffers store DOF, link, body, and root joint index mappings uploaded once from host.
Staging buffers are pre-allocated to the maximum output size needed by any getter or setter.
Scratch buffers in CPU views and contact views are pre-allocated members reused across calls, avoiding per-call heap allocation.
No
cudaMalloc,cudaFree, orstd::vectorheap allocation occurs in runtime API methods.
Warp Interop#
The backend accesses Newton simulation data (stored as Warp arrays in Python) directly from C++
via pybind11. Raw data pointers are extracted once and cached in base classes, avoiding repeated
Python attribute lookups in hot paths. GPU views operate on these cached pointers directly when
launching CUDA kernels.
Key Components#
SimulationView#
The simulation view is the entry point for creating child views. It detects the Newton model’s
simulation device and selects the appropriate CPU or GPU implementation. Factory methods
(createArticulationView, createRigidBodyView, createRigidContactView) perform USD pattern
matching, resolve paths against the Newton model, and delegate to the device-specific subclass.
import omni.physics.tensors as tensors
sim_view = tensors.create_simulation_view(backend="newton")
ArticulationView#
Provides batched access to articulation state: DOF positions, velocities, limits, stiffnesses, dampings, armatures, actuation forces, targets, root transforms/velocities, link transforms/velocities, masses, COMs, and inertias. Supports both indexed and full-view operations.
The view builds index mappings at construction from the Newton model’s joint_q_start,
joint_qd_start, joint_type, and body_label arrays. These mappings handle non-uniform
DOF counts across articulations by padding with sentinel values (-1).
arti_view = sim_view.create_articulation_view("/World/Robot")
positions = arti_view.get_dof_positions()
arti_view.set_dof_positions(new_positions)
transforms = arti_view.get_root_transforms()
arti_view.set_root_transforms(new_transforms)
RigidBodyView#
Provides batched access to rigid body state: transforms (as 7-float [x,y,z,qx,qy,qz,qw]),
velocities (as 6-float [vx,vy,vz,wx,wy,wz]), masses, inverse masses, COMs, inertias,
and inverse inertias. Supports force and torque application at arbitrary positions.
rb_view = sim_view.create_rigid_body_view("/World/Objects/.*")
transforms = rb_view.get_transforms()
rb_view.set_velocities(new_velocities)
rb_view.apply_forces_and_torques_at_position(forces, torques, positions)
RigidContactView#
Provides contact force queries between sensor bodies and filter bodies:
Net contact forces: Aggregated force per sensor body.
Contact force matrix: Force per sensor-filter pair.
Contact data: Per-contact point forces, positions, normals, and separation distances.
Raw contact data: Per-contact data with other-actor identification.
Contact pointers are refreshed lazily using the Newton stage’s simulation_timestamp,
avoiding redundant Python queries when the simulation state has not changed.
contact_view = sim_view.create_rigid_contact_view(
"/World/Robot/.*",
["/World/Ground"]
)
net_forces = contact_view.get_net_contact_forces(dt)
force_matrix = contact_view.get_contact_force_matrix(dt)
ArticulationMetatype#
Provides structural metadata for each articulation: link/joint/DOF counts and names, joint types, DOF types, joint DOF offsets, parent link relationships, and fixed-base detection. Built from Newton model metadata at construction time.
Device Configurations#
The backend supports three device configurations:
Configuration |
Simulation |
View Tensors |
Implementation |
|---|---|---|---|
CC |
CPU |
CPU |
|
GC |
GPU |
CPU |
|
GG |
GPU |
GPU |
|
In the GC configuration, GPU views transparently stage CPU index and source tensors to pre-allocated device buffers before kernel execution, and stage GPU results back to host-side output tensors after kernel completion.
Testing#
Tests are located in python/tests/ and use the standard extension test framework. Each test class
runs in three device configurations (CC, GC, GG) via parameterized base classes.
Running Tests#
Run all tests:
./repo.sh test --ext-folder source/extensions/isaacsim.physics.newton.tensors
Run a specific test class:
./repo.sh test --ext-folder source/extensions/isaacsim.physics.newton.tensors --filter TestArticulationViewBasic
Test Coverage#
test_articulation.py: Articulation view creation, DOF position/velocity get/set, root transform/velocity, link transforms, metatype properties, simulation view gravitytest_rigid_body.py: Rigid body transforms, velocities, masses, COMs, inertias, force applicationtest_rigid_contact.py: Net contact forces, contact force matrix, contact data, raw contact datatest_object_type.py:getObjectTypecorrectness for articulation roots, links, free bodies
Dependencies#
omni.physics.tensors: C++ interface headers (
ISimulationView.h,IArticulationView.h,IRigidBodyView.h,IRigidContactView.h,TensorDesc.h)isaacsim.physics.newton: Newton physics engine and stage management
pybind11: Accessing Python Newton objects from C++
pxr (USD):
SdfPath,UsdStage,UsdPrimfor pattern matchingCUDA runtime: Kernel launch,
cudaMemcpy, device memory managementWarp (runtime): Python arrays accessed via
WarpInterop;WarpCompat.hfor compile-time type definitions
Enable Extension#
The extension can be enabled (if not already) in one of the following ways:
Define the next entry as an application argument from a terminal.
APP_SCRIPT.(sh|bat) --enable isaacsim.physics.newton.tensors
Define the next entry under [dependencies] in an experience (.kit) file or an extension configuration (extension.toml) file.
[dependencies]
"isaacsim.physics.newton.tensors" = {}
Open the Window > Extensions menu in a running application instance and search for isaacsim.physics.newton.tensors.
Then, toggle the enable control button if it is not already active.