đ˛ Domain Randomization#
Randomize physics and visual properties for robust RL training.
Physics Randomization#
Apply after scene.build():
import genesis as gs
import torch
scene.build(n_envs=64)
# Friction randomization
robot.set_friction_ratio(
friction_ratio=0.5 + torch.rand(scene.n_envs, robot.n_links),
links_idx_local=range(robot.n_links),
)
# Mass randomization
robot.set_mass_shift(
mass_shift=-0.5 + torch.rand(scene.n_envs, robot.n_links),
links_idx_local=range(robot.n_links),
)
# Center of mass randomization
robot.set_COM_shift(
com_shift=-0.05 + 0.1 * torch.rand(scene.n_envs, robot.n_links, 3),
links_idx_local=range(robot.n_links),
)
Control Parameter Randomization#
import numpy as np
# Per-environment stiffness (Kp)
kp_values = 4000 + 1000 * np.random.rand(scene.n_envs, robot.n_dofs)
robot.set_dofs_kp(kp_values, motors_dof)
# Per-environment damping (Kv)
kv_values = 400 + 100 * np.random.rand(scene.n_envs, robot.n_dofs)
robot.set_dofs_kv(kv_values, motors_dof)
Object Position Randomization (Per-Episode)#
def reset_idx(self, envs_idx):
num_reset = len(envs_idx)
# Random object position
random_x = torch.rand(num_reset, device=gs.device) * 0.4 + 0.2
random_y = (torch.rand(num_reset, device=gs.device) - 0.5) * 0.5
random_z = torch.ones(num_reset, device=gs.device) * 0.025
random_pos = torch.stack([random_x, random_y, random_z], dim=-1)
self.object.set_pos(random_pos, envs_idx=envs_idx)
Command Randomization#
def gs_rand(lower, upper, shape):
"""Uniform random in [lower, upper]"""
return (upper - lower) * torch.rand(shape, device=gs.device) + lower
# Randomize velocity commands
commands = gs_rand(
lower=torch.tensor([-1.0, -0.5, -0.5]),
upper=torch.tensor([1.0, 0.5, 0.5]),
shape=(self.num_envs, 3),
)
Available Methods#
Method |
Shape |
Description |
|---|---|---|
|
(n_envs, n_links) |
Friction scaling |
|
(n_envs, n_links) |
Mass offset |
|
(n_envs, n_links, 3) |
COM offset |
|
(n_envs, n_dofs) |
Position gain |
|
(n_envs, n_dofs) |
Velocity gain |
|
(n_envs, n_dofs) |
Motor inertia |
Required Options#
Enable batching for physics randomization:
scene = gs.Scene(
rigid_options=gs.options.RigidOptions(
batch_dofs_info=True,
batch_links_info=True,
),
)
Best Practices#
Apply physics DR once after
scene.build()Apply position/command DR at each episode reset
Use
envs_idxparameter for selective randomizationEnsure tensor shapes match
(n_envs, ...)