VBD Solver#
Vertex Block Descent (VBD) is a Newton solver for cloth and soft-body
simulation. In Isaac Lab, VBD is enabled by selecting a
NewtonCfg whose solver_cfg is a
VBDSolverCfg.
A task that works with PhysX or with Newton’s MuJoCo-Warp solver may still need deformable assets, materials, contacts, and coupling tuned before it works well with VBD.
VBD is usually exposed through a task-specific physics preset rather than a
general newton_vbd preset. Deformable-only scenes can use
VBDSolverCfg directly. For robot or
rigid-body scenes, the named-entry coupling options are:
CouplerProxyCfgfor the proxy coupling used by the core Franka tasks.CouplerAdmmCfgfor linearized ADMM coupling between named solver entries.
Start from a Supported Deformable Task#
Note
The Isaac-Lift-Soft-Franka task requires automatic tetrahedralization.
Install its optional dependencies before running the examples below:
uv sync --inexact --extra tetrahedralization
With the legacy installer:
./isaaclab.sh -i tetrahedralization
Before adding VBD to a new task, first run one of the Franka deformable tasks:
uv run python scripts/environments/zero_agent.py --task Isaac-Lift-Soft-Franka --num_envs 1 --visualizer kit
./isaaclab.sh -p scripts/environments/zero_agent.py --task Isaac-Lift-Soft-Franka --num_envs 1 --visualizer kit
For the surface-deformable cloth variant, use:
uv run python scripts/environments/zero_agent.py --task Isaac-Lift-Cloth-Franka --num_envs 1 --visualizer kit
./isaaclab.sh -p scripts/environments/zero_agent.py --task Isaac-Lift-Cloth-Franka --num_envs 1 --visualizer kit
Both tasks configure MJWarp for the rigid Franka and VBD for the deformable
object through
CouplerProxyCfg.
Use these tasks as starting points for asset setup, solver coupling, and contact
tuning.
Add a VBD Physics Preset#
Tasks that support multiple physics options usually store SimulationCfg.physics
as a PresetCfg. For deformable Newton tasks,
the preset is a plain NewtonCfg. Standalone
VBD and soft-contact configuration live in isaaclab_newton.physics, while
proxy and ADMM coupling live in isaaclab_contrib.coupling.
The Franka soft-body and cloth tasks define task-specific proxy presets.
The important pieces are:
Add a Newton physics preset whose value is a
NewtonCfg.Use
CouplerProxyCfgwith namedCouplerEntryCfgentries to partition the rigid bodies and deformable particles between MJWarp and VBD.Add
CouplerProxyMappingCfgentries for the collidable rigid bodies exposed to VBD. Leaveintegrate_with_external_rigid_solver=Falsefor proxy-coupled VBD entries.Set the outer
soft_contact_cfgto aNewtonSoftContactCfgwhen body-particle or self-contact values need task-level tuning.Keep the preset at the same config path used by the task’s
SimulationCfg, for exampleenv.sim.physics.
You can select the deformable Newton preset globally:
uv run isaaclab train --rl_library rsl_rl --task=Isaac-Lift-Soft-Franka physics=newton_mjwarp_vbd_proxy
./isaaclab.sh train --rl_library rsl_rl --task=Isaac-Lift-Soft-Franka physics=newton_mjwarp_vbd_proxy
or select the physics field directly:
uv run isaaclab train --rl_library rsl_rl --task=Isaac-Lift-Soft-Franka env.sim.physics=newton_mjwarp_vbd_proxy
./isaaclab.sh train --rl_library rsl_rl --task=Isaac-Lift-Soft-Franka env.sim.physics=newton_mjwarp_vbd_proxy
Use the direct path override when only one task field should use the VBD preset.
Use physics=newton_mjwarp_vbd_proxy when you want every matching preset
field in the task config to resolve to that preset. Isaac Lab training commands
accept these Hydra overrides after the regular command line flags; no separator is
needed for the examples above.
Check Task and Asset Compatibility#
VBD uses the Newton model built from the task assets. When adding VBD to a new task, validate the following before tuning solver parameters:
The task must already be compatible with the Newton backend. If a rigid-only
newton_mjwarppreset fails during model construction, fix the asset or task configuration first.The scene must include Newton-compatible deformable assets and materials. Use
NewtonDeformableBodyMaterialCfgfor volume deformables andNewtonSurfaceDeformableBodyMaterialCfgfor cloth or surface deformables.Proxy-coupled robot tasks should expose only the collidable bodies needed for deformable contact.
Contact-heavy scenes usually need task-specific
num_substeps,VBDSolverCfg, andNewtonSoftContactCfgvalues. Start from the Franka soft-body or cloth preset that most closely resembles the scene.Use a small visual smoke test before training. Confirm that the deformable spawns, renders, deforms, and contacts rigid bodies as expected.
VBD Solver Parameters#
The following fields are specific to
VBDSolverCfg. They are grouped by the part
of the solver they affect.
Core Solve#
Parameter |
Description |
|---|---|
|
Default: |
|
Default: |
|
Default: |
Self-Contact#
Parameter |
Description |
|---|---|
|
Default: |
|
Default: |
|
Default: |
|
Default: |
|
Default: |
|
Default: |
|
Default: |
|
Default: |
Custom MJWarp + VBD Parameters#
The opt-in
CoupledMJWarpVBDSolverCfg runs
MJWarp and VBD over one shared model. Import
isaaclab_contrib.custom_coupling.tasks explicitly before using its
registered task.
Parameter |
Description |
|---|---|
|
MJWarp configuration for rigid bodies. |
|
VBD configuration. Set |
|
Advance rigid bodies first, then particles without rigid reaction forces. |
|
Inject particle reactions before MJWarp, then advance VBD with the same contacts. |
MJWarp nconmax and njmax must cover the rigid contacts and constraints
in the scene. ccd_iterations can affect fast rigid contacts near
deformables. See MJWarp Solver for the rigid-solver parameters.
Use the custom manager for direct shared-model substep ordering. Use proxy coupling when deformable contact is localized to selected rigid bodies.
Coupled MJWarp + VBD#
CouplerProxyCfg is the coupling used by
the core Franka tasks. It partitions the model between named solver entries and
exposes selected source bodies to the destination solver as proxies. Contact
feedback returns to the source solver as lagged impulses. This keeps deformable
contact work localized to the rigid bodies that need it, such as a gripper hand
and fingers. The pinned proxy solver supports at most two entries and rejects
joints that cross entry boundaries.
The core Franka soft-body task demonstrates the proxy configuration:
newton_mjwarp_vbd_proxy: NewtonCfg = NewtonCfg(
solver_cfg=CouplerProxyCfg(
entries=[
CouplerEntryCfg(
name="rigid",
solver_cfg=MJWarpSolverCfg(
cone="elliptic",
ls_iterations=20,
integrator="implicitfast",
),
bodies=[r"/World/envs/env_[^/]+/Robot"],
),
CouplerEntryCfg(
name="soft",
solver_cfg=VBDSolverCfg(iterations=10, rigid_body_particle_contact_buffer_size=256),
all_particles=True,
include_static_shapes=True,
),
],
proxies=[
CouplerProxyMappingCfg(
source="rigid",
destination="soft",
bodies=[
r"/World/envs/env_[^/]+/Robot/Geometry/.*panda_hand",
r"/World/envs/env_[^/]+/Robot/Geometry/.*panda_(left|right)finger",
],
collide_interval=1,
collision_pipeline=NewtonCollisionPipelineCfg(
enable_rigid_soft_full_surface_contact=True,
),
)
],
iterations=1,
),
soft_contact_cfg=NewtonSoftContactCfg(
soft_contact_ke=8.0e3,
soft_contact_kd=1.0e-2,
soft_contact_mu=10.0,
),
num_substeps=2,
)
What the selectors do:
entriescontains oneCouplerEntryCfgper sub-solver. Each entry has a stablename, its ownsolver_cfg, and explicit model ownership selectors.An entry’s
bodiesselectors are full Newton body-label regex strings. By default, joints inherit their child body’s owner and shapes inherit their body’s owner. Useall_particles=Trueto own all deformable particles andinclude_static_shapes=Trueto own world geometry. Bodies, particles, joints, and shapes may be assigned to at most one entry; unassigned elements remain outside the nested solver views.proxiescontains directedCouplerProxyMappingCfgmappings. Each mapping names itssourceanddestinationentries, then usesbodiesto select the source bodies that the destination solver should collide against. Only bodies that own at least onenewton.ShapeFlags.COLLIDE_SHAPESshape are kept.In the snippet above, the entire Franka articulation is routed to MJWarp, while the deformable particles and static table/world shapes are routed to VBD. Only the
panda_handand the two fingers are exposed as proxies, so VBD sees three rigid proxies regardless of the number of arm links.
Full-surface rigid-soft contact includes edge and triangle-interior contacts. Analytic proxy shapes support it directly, while mesh and convex proxy shapes require a volume SDF.
Important
The coupler currently rejects
KaminoPADMMSolverCfg or
KaminoDVISolverCfg entries and
MPMSolverCfg entries configured with
project_outside_colliders=True, as well as
MJWarpSolverCfg entries configured with
use_mujoco_cpu=True. These configurations require manager-specific
build, forward-kinematics, reset, or per-step lifecycle hooks that are not
yet available to nested solvers. Use MPM with
project_outside_colliders=False and GPU MJWarp, or run these solvers
through their standalone managers until nested lifecycle support is added.
Key proxy-specific parameters:
Parameter |
Description |
|---|---|
|
Default: |
|
Default: |
|
Default: |
|
Default: |
Body selectors must use full Newton body-label regexes, such as
/World/envs/env_.*/Robot. Proxy mappings also accept raw Newton body ids.
CouplerAdmmCfg provides linearized ADMM
coupling between the same named solver entries. Set contact_pairs to select
entry pairs explicitly, or leave it as None to detect every distinct pair.
Use iterations and rho to tune the ADMM solve.
Try the demo:
# zero-agent visual smoke test
uv run python scripts/environments/zero_agent.py --task Isaac-Lift-Soft-Franka --num_envs 1 --visualizer kit
# scripted pick-and-lift via state machine
uv run python scripts/environments/state_machine/lift_franka_soft.py --num_envs 1
# zero-agent visual smoke test
./isaaclab.sh -p scripts/environments/zero_agent.py --task Isaac-Lift-Soft-Franka --num_envs 1 --visualizer kit
# scripted pick-and-lift via state machine
./isaaclab.sh -p scripts/environments/state_machine/lift_franka_soft.py --num_envs 1
Contact and Material Parameters#
Contact Model#
NewtonSoftContactCfg applies contact parameters
to the finalized Newton model through
soft_contact_cfg:
Parameter |
Description |
|---|---|
|
Default: |
|
Default: |
|
Default: |
To set rigid collision-shape contact properties (ke, kd, mu) for
shapes that lack an explicit per-asset material, use
NewtonShapeCfg on NewtonCfg.default_shape_cfg
instead. Per-asset materials override these defaults.
Volume Deformable Materials#
Use
NewtonDeformableBodyMaterialCfg
for volume deformables:
Parameter |
Description |
|---|---|
|
Default: |
|
Default: |
|
Default: |
|
Default: |
|
Default: |
Surface Deformable Materials#
Use
NewtonSurfaceDeformableBodyMaterialCfg
for cloth or surface deformables:
Parameter |
Description |
|---|---|
|
Default: |
|
Default: |
|
Default: |
|
Default: |
|
Default: |
|
Default: |
|
Default: |
Tuning Workflow#
Use the following sequence when bringing up a new VBD task:
Run one of the supported Franka deformable tasks and confirm your installation, visualizer, and deformable rendering path work.
Add a task-specific VBD or proxy-coupled VBD preset copied from the closest supported task.
Run a small visual smoke test with
--num_envs 1before training.Tune deformable material stiffness and damping until the object deforms in the expected range without rigid contact.
Increase
num_substepsor decreasedtif the object is unstable before increasing stiffness further.Increase
iterationswhen contacts or stiff materials do not converge within a substep.Tune
soft_contact_keto reduce rigid/deformable clipping, then tunesoft_contact_mufor grip andsoft_contact_kdfor chatter.Enable self-contact only after body-particle contact is stable, then tune
particle_self_contact_radiusfor active self-contact thickness,particle_self_contact_marginfor missed contacts, andparticle_collision_detection_intervalfor detection frequency.Increase
num_envsand profile only after the single-environment scene is stable.
Symptoms and First Parameters to Check#
Symptom |
First parameters to check |
|---|---|
Rigid bodies visibly clip through the deformable. |
Increase |
The robot cannot lift the deformable. |
Check that the gripper bodies are included in the proxy, then increase |
The deformable barely deforms. |
Reduce material stiffness, |
Contact chatters or bounces. |
Increase |
Cloth passes through itself. |
Enable |
Self-contact is too expensive. |
Increase |
For implementation details of the VBD managers and Newton coupler, see Newton Manager Abstraction.