RigidSolver#
The RigidSolver handles rigid body dynamics simulation, including articulated bodies, robots, and rigid objects.
Overview#
The RigidSolver implements:
Forward dynamics: Compute accelerations from forces/torques
Collision detection: GJK, MPR, and support function methods
Contact resolution: Impulse-based or iterative constraint solving
Joint constraints: Revolute, prismatic, ball, free joints
Articulated bodies: Multi-body tree structures (URDF, MJCF)
Usage#
import genesis as gs
gs.init()
scene = gs.Scene(
rigid_options=gs.options.RigidOptions(
enable_collision=True,
enable_joint_limit=True,
constraint_solver=gs.constraint_solver.Newton,
),
)
# Add rigid entities
plane = scene.add_entity(gs.morphs.Plane())
robot = scene.add_entity(gs.morphs.URDF(file="robot.urdf"))
box = scene.add_entity(gs.morphs.Box(pos=(0, 0, 1), size=(1.0, 1.0, 1.0)))
scene.build()
# Control robot
robot.set_dofs_position(target_positions)
robot.set_dofs_velocity(target_velocities)
for i in range(1000):
scene.step()
Configuration#
Key options in RigidOptions:
Option |
Type |
Description |
|---|---|---|
|
bool |
Enable collision detection |
|
bool |
Enforce joint limits |
|
enum |
Solver type (CG, Newton) |
|
int |
Maximum contacts per geometry |
|
float |
Contact resolution tolerance |
Collision Detection#
The RigidSolver supports multiple collision detection methods:
GJK (Gilbert-Johnson-Keerthi): General convex collision
MPR (Minkowski Portal Refinement): Penetration depth
Primitives: Optimized sphere, box, capsule collisions
Contact Resolution#
Two main approaches:
Impulse-based: Direct velocity update
Constraint solving: Iterative optimization (CG, Newton)
# Use Newton solver for better convergence
rigid_options = gs.options.RigidOptions(
constraint_solver=gs.constraint_solver.Newton,
iterations=10,
)
See Also#
RigidEntity - RigidEntity
gs.options.RigidOptions - Full options