Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Environment Configuration — Particles

Set env.particles=true to use granular materials such as regolith, sand, and dust. Requires Isaac Sim 6.1.0, Isaac Lab 3.0.0, PhysX, and CUDA GPU dynamics.

srb agent teleop -e _manipulation env.particles=true \
  env.particles_size=0.01 env.particles_ratio=0.1

Enabling Particles

  1. Set env.particles=true.
  2. Choose parameters from the table.

Defaults are in BaseEnvCfg (srb/core/env/common/base/env_cfg.py). Scalars apply to all systems. Two-value ranges interpolate across env.particles_systems. Set particles_init_pos to (x, y, z).

Configuration Parameters

ParameterMeaningDefault
env.particlesEnablefalse
env.particles_systemsIndependent systems per environment1
env.particles_spawnerPile kernel: grid, pyramid, crater_pile, or mound_pilegrid
env.particles_sizeDiameter (m)(0.01, 0.005)
env.particles_areaPile width relative to environment spacing(0.75, 0.5)
env.particles_ratioVolume-fill ratio(0.025, 0.1)
env.particles_heightInteger stack height per system(1, 10)
env.particles_densityPBD density (kg/m³)1600.0
env.particles_frictionParticle friction coefficient1.0
env.particles_dampingVelocity damping0.2
env.particles_cohesionParticle stickiness0.01
env.particles_adhesionSurface stickiness0.05
env.particles_materialAdvanced, non-scalar visual override (VisualMaterialCfg)None
env.particles_dim_xyGrid count per system (dim_x = dim_y)Derived (None)
env.particles_init_posFirst-system position (x, y, z)Derived (None)
env.particles_freezeFreeze after settling but keep renderingfalse
env.particles_conform_to_terrainSnap to terrain without PBD settlingfalse
env.particles_conform_jitterConforming XY scatter (m); 0 keeps a regular grid0.0
env.particles_pile_center_jitterSettled-pile XY offset per reset (m); 0 disables0.0

Behavior

grid fills particles_area. pyramid makes centre-dense piles. Excavation derives particles_dim_xy, particles_height, and particles_init_pos from particles_size (a 0.35 m wide, 0.4 m tall pile at the scoop target) and ignores overrides of those three.

Multiple systems (particles_systems>1) stack vertically and interpolate settings across systems. Particles settle under gravity, collide with rigid bodies and articulations, and can be manipulated. They disable Fabric (env.sim.use_fabric=false) for consistent PhysX state.

Excavation and terrain landscaping track reshaping in runtime heightmaps because PhysX sets cannot be raycast. Landscaping’s versioned external-heightmap interface uses a fixed footprint-aware surface rule, not ad-hoc binning.

Where Particles Are Simulated vs. Where They Are Read

PhysX PBD requires GPU dynamics and a CUDA-capable NVIDIA GPU. Otherwise each set fails at parse time with Particles feature is only supported on GPU. Please enable GPU dynamics flag in Property/Scene of physics scene!; particles stay bit-identically inert while rigid bodies move.

The GPU solver exposes CPU-facing USD points (UsdGeom.Points) through /physics/updateParticlesToUsd. Isaac Sim 6’s CUDA direct-data pipeline suppresses readback, so SRB uses CPU simulation with GPU scene dynamics. Landscaping sets sim.device = "cpu" so its heightmap, reward, and renderer read USD points.

App-global /persistent/physics/overrideGPUSettings overrides authored physxScene:enableGPUDynamics=true. “Force CPU” persists 0 in kit/data/Kit/IsaacLab/*/user.config.json, disabling particles; SRB clears it at spawn with a warning. Values are -1 per scene, 0 for CPU, and 1 or 2 for GPU.

Each set’s simulationOwner matches env.sim.physics_prim_path. Missing owners or non-UsdPhysics.Scene targets fail fast without stage traversal. Ownership makes scene assignment deterministic; unowned sets move, so missing ownership alone does not explain inert particles.

Systems are siblings (<env>/particles0System). Isaac Lab clones env_0’s set and target for per-environment variants such as procedural terrain; SRB retargets clones after scene cloning and before physics (DirectEnv._setup_scene). Initialization rejects foreign or shared systems, which solve in the wrong collision group and fall through terrain.

Settling raises instead of caching if any environment’s median height drops over settle_max_median_drop (10 m). Plateaus count as settled only below settle_plateau_max_vel (0.1 m/s); terminal-speed free fall also plateaus.

SRB converts cloned positions and velocities between local and world-frame ParticleSystem buffers, binding each clone to its own system. ParticleSystem.initialize() validates particle-system binding; runtime simulation behavior still needs testing; multiple environments force env.stack=false (see Parallelism). Below-terrain grains may evade the median guard, remain cached, and fall every reset.

Domain Randomization

RandomizationBehavior
env.particles_pile_center_jitterEach reset restores and rigidly translates the settled pile in XY by independent per-environment samples in [-jitter, +jitter], without re-settling. 0.05 shifts ±5 cm without changing its profile; default 0 keeps it fixed. Ignored with env.particles_freeze=true.
Excavation and terrain-landscaping materialEach reset samples PBD friction [0.6, 1.0] and density [2700, 3100] kg/m³, varying repose angle and bulk behaviour. Task-wired, without an env.* knob; friction and density are spawn baselines, not episode constants.

Static Renders

For frozen renders, env.particles_freeze=true disables systems after settling by clearing PhysX particleSystemEnabled and zeroing velocities; points remain visible. Pair with --snapshot. env.particles_conform_to_terrain=true snaps the grid to terrain without PBD settling; env.particles_conform_jitter adds XY scatter. Use when settling is unavailable and regolith needs terrain relief.