States#

States in Genesis hold the runtime data for physics simulation, including positions, velocities, forces, and other solver-specific variables.

Overview#

Each solver maintains its own state:

  • RigidState: Link poses, joint positions/velocities

  • MPMState: Particle positions, velocities, deformation gradients

  • FEMState: Node positions, velocities

  • PBDState: Particle positions, velocities

  • SPHState: Particle positions, velocities, densities

Accessing State#

States are accessed through entities or the simulator:

import genesis as gs

gs.init()
scene = gs.Scene()
robot = scene.add_entity(gs.morphs.URDF(file="robot.urdf"))
scene.build()

# Access via entity
positions = robot.get_qpos()      # Joint positions
velocities = robot.get_qvel()     # Joint velocities
link_pos = robot.get_link("ee").get_pos()

# Full state access (advanced)
rigid_solver = scene.sim.rigid_solver
# ... direct solver state access

State for Parallel Environments#

With n_envs > 1, states are batched:

scene.build(n_envs=16)

# Batched state access
positions = robot.get_qpos()  # Shape: (n_envs, n_dofs)

# Per-environment access
positions = robot.get_qpos(envs_idx=[0, 5, 10])

State Management#

Saving State#

state = scene.get_state()

Restoring State#

scene.set_state(state)

Resetting#

scene.reset()  # Reset all environments
scene.reset(envs_idx=[0, 1, 2])  # Reset specific environments

Gradient Tracking#

For differentiable simulation:

scene = gs.Scene(
    sim_options=gs.options.SimOptions(
        requires_grad=True,
    ),
)

# States now track gradients
scene.step()
loss = compute_loss(robot.get_qpos())
loss.backward()

See Also#