Skip to content

Latest commit

 

History

History
118 lines (84 loc) · 2.44 KB

File metadata and controls

118 lines (84 loc) · 2.44 KB

Coding Conventions

Import Pattern

import genesis as gs
import genesis.utils.geom as gu
import numpy as np
import torch

Naming Conventions

  • Classes: PascalCase (e.g., RigidEntity, SimOptions)
  • Functions/methods: snake_case (e.g., add_entity, get_dofs_position)
  • Constants: UPPER_CASE (e.g., EPS)
  • Private: _leading_underscore (e.g., _initialized)

Configuration via Pydantic Options

All configuration uses Pydantic models in genesis/options/:

scene = gs.Scene(
    sim_options=gs.options.SimOptions(dt=0.01, substeps=2),
    rigid_options=gs.options.RigidOptions(enable_collision=True),
    vis_options=gs.options.VisOptions(show_world_frame=True),
)

Tensor Operations

Genesis uses PyTorch tensors on gs.device:

# Always specify device
positions = torch.zeros(n_envs, n_dofs, device=gs.device)

# Convert numpy to torch
torch_tensor = torch.from_numpy(numpy_array).to(gs.device)

Error Handling

# Use Genesis exception for domain errors
gs.raise_exception("Invalid parameter value")

# Use warnings for non-critical issues
gs.logger.warning("Deprecated feature used")

Build Pattern

Always call scene.build() before simulation:

scene = gs.Scene()
scene.add_entity(...)  # Add all entities first
scene.build(n_envs=1)  # Compile kernels
scene.step()           # Now safe to step

Backend Selection

import genesis as gs

# CPU backend (default for debug mode)
gs.init(backend=gs.cpu)

# GPU backend (auto-selects CUDA/ROCm/Metal)
gs.init(backend=gs.gpu)

# Explicit precision
gs.init(backend=gs.gpu, precision="32")  # or "64"

Common API Patterns

Basic Simulation Loop

import genesis as gs

gs.init(backend=gs.gpu)
scene = gs.Scene(show_viewer=True)

plane = scene.add_entity(gs.morphs.Plane())
robot = scene.add_entity(
    gs.morphs.MJCF(file="xml/franka_emika_panda/panda.xml"),
    material=gs.materials.Rigid(),
)

scene.build()

for _ in range(1000):
    scene.step()

Parallel Environments

import genesis as gs
import torch

gs.init(backend=gs.gpu)
scene = gs.Scene(show_viewer=False)
robot = scene.add_entity(gs.morphs.MJCF(file="xml/franka_emika_panda/panda.xml"))

# Build with multiple environments
n_envs = 100
scene.build(n_envs=n_envs, env_spacing=(1.0, 1.0))

# Control all environments at once
target = torch.zeros(n_envs, robot.n_dofs, device=gs.device)
robot.control_dofs_position(target)