Tune MJWarp#
This guide tunes the MuJoCo-Warp (MJWarp) solver after an asset and task can
be constructed by the Newton backend. The generated API documentation for
NewtonCfg and
MJWarpSolverCfg is authoritative for every
configuration field and its current default.
Prerequisites#
First follow Prepare an Asset for Newton with MJWarp and reproduce one failure with a fixed initial state, seed, and action sequence. Before changing solver settings, check the mechanical model, collision geometry, reset overlap, actuator limits, and unsupported features. A solver setting cannot correct an invalid asset or controller.
Use maintained task configurations as evidence for a similar workload, not as defaults to copy. For example, compare the small Cartpole configuration with the contact-rich Allegro Hand configuration. Their values only apply after validating the new task’s reset and contact distribution.
Start from an explicit baseline#
Make the selected solver, integration method, timestep, substeps, and diagnostics visible in the task configuration. This is an illustrative baseline; measure and set contact capacity for the task rather than treating omitted or checked-in values as universal.
from isaaclab.sim import SimulationCfg
from isaaclab_newton.physics import MJWarpSolverCfg, NewtonCfg
solver_cfg = MJWarpSolverCfg(solver="newton", integrator="implicitfast")
newton_cfg = NewtonCfg(
solver_cfg=solver_cfg,
num_substeps=1,
debug_mode=True,
)
sim_cfg = SimulationCfg(dt=1 / 120, physics=newton_cfg)
Record the fixed-state behavior, warnings, contact count, penetration, slip,
task metric, and runtime before changing one variable at a time. Turn off
debug_mode only after the solver budget has been validated for the
full reset, command, and randomization distribution.
Size contact and constraint capacity#
nconmax bounds contact points per environment. njmax bounds constraint
rows per environment; contacts can consume multiple rows, and joint limits,
drives, equality constraints, and mimic constraints also consume rows. Do not
derive njmax directly from nconmax.
Increase the relevant capacity when diagnostics show an overflow, contacts disappear in dense states, or behavior changes with object count. Measure the worst case across resets and randomized scenes, add task-specific headroom, and then verify that the same fixed-state result remains stable. Capacity cannot fix incorrect collision geometry, contact material, or convergence.
Choose timestep and substeps#
Each solver substep uses SimulationCfg.dt / NewtonCfg.num_substeps. Start
with a policy period that the controller can support, then compare a smaller
dt or more substeps when high drive stiffness, light objects, impacts, or
dense contact cause instability. Substeps do not change the policy period
SimulationCfg.dt * env.decimation.
Use the same physical metrics and fixed-state reproduction for every candidate. Do not change policy decimation merely to conceal an unstable physics step.
Validate convergence#
Keep NewtonCfg.debug_mode enabled while diagnosing. It reports
per-environment solver iteration statistics and warns when an environment
reaches the iterations cap. Only after the model, reset, contact path, and
capacities are valid should a cap hit or a reproducible metric justify sweeping
iterations, ls_iterations, or tolerance.
Sweep one convergence limit at a time and stop when the physical and task metrics plateau. More iterations cannot compensate for bad inertia, penetration at reset, missing collision geometry, unsupported constraints, or excessive drive stiffness.
Tune friction and contact behavior#
Validate colliders, contact locations, normal force, material friction, and
condim before changing global friction settings. cone selects the
MuJoCo friction-cone representation; test an elliptic cone when a physically
valid contact model still slips and the additional cost is warranted.
impratio changes frictional impedance relative to normal impedance. Treat
both settings as a contact-formulation change, and recheck penetration, slip,
energy, convergence, task success, and runtime after each change.
Do not use impratio to mask missing contacts, incorrect material friction,
insufficient gripper effort, or a controller that opens the grasp. For the
underlying contact formulation, see the MuJoCo contact documentation and
option reference.
Choose the contact pipeline#
Use use_mujoco_contacts=True for the simplest baseline. It selects
MuJoCo’s internal collision detection and cannot be combined with
collision_cfg.
Set use_mujoco_contacts=False only when the task needs Newton’s collision
pipeline, such as for non-convex meshes, SDF or hydroelastic contacts. Configure
NewtonCollisionPipelineCfg on
NewtonCfg, then size its collision buffers
from observed overflow or missing-contact evidence. collision_decimation
matters only for this pipeline and when more than one solver substep is used;
refresh contacts more often for fast-changing contacts before reducing work for
performance.
Optimize only after validation#
After the task is stable over its full distribution, measure the cost of each change and retain only work that improves the recorded outcome. Reduce excess capacity, line-search work, collision refresh, substeps, and state synchronization frequency one at a time.
ccd_iterations is a GJK/EPA collision-convergence cap, not a PhysX-style
continuous-collision-detection switch. Increase it only for a warning or a
reproducible complex-geometry collision failure. Keep
update_data_interval=1 until resets, Newton-side state writes, contact
reporting, and sensors are verified; a larger interval reduces synchronization
work but can expose stale data. save_to_mjcf, use_mujoco_cpu, and
disable_contacts are diagnostic tools, not production tuning targets.
The diagnose-first order is: validate the model and fixed reproduction; choose timestep and substeps; size capacities; validate convergence; tune contact behavior and the contact pipeline; then optimize measured costs.