12. Domain Randomization#
In this tutorial, we demonstrate how to implement domain randomization in MetaSim to improve the robustness and generalization of reinforcement learning agents.
Common Usage#
We provide an api that directly sets physical attributes to implement domain randomization, see the demo below.
python get_started/12_domain_randomization.py --sim isaacsim --num_envs 2 --headless
You can also run in interactive mode by removing the --headless
flag to visualize the simulation.
This script demonstrates comprehensive domain randomization techniques including:
Mass Randomization: Varying object masses using different probability distributions
Friction Randomization: Adjusting surface friction coefficients for more realistic physics
Multiple Distribution Types: Uniform, log-uniform, and Gaussian distributions
Flexible Operations: Absolute value setting, scaling, and additive modifications
Key Features#
1. Mass Randomization#
The tutorial shows how to randomize object masses using three different approaches:
Uniform Distribution: Random mass within a specified range (e.g., 0.3-0.7 kg)
Gaussian Distribution: Normal distribution around a mean value with controlled variance
Scale Operation: Multiply existing mass by a random factor (e.g., 0.8-1.2x)
2. Friction Randomization#
Surface friction coefficients can be randomized to simulate different materials:
Log-Uniform Distribution: Useful for friction values that span multiple orders of magnitude
Body-Specific Control: Apply different friction values to specific robot body parts
Environment Consistency: Maintain consistent friction across all parallel environments
3. Distribution Types#
# Uniform distribution
randomize_body_mass(env, "cube", mass_range=(0.3, 0.7), distribution="uniform")
# Gaussian distribution
randomize_body_mass(env, "sphere", mass_range=(0.2, 0.4), distribution="gaussian")
# Log-uniform distribution
randomize_body_friction(env, "franka", friction_range=(0.5, 1.5), distribution="log_uniform")
4. Operations#
# Absolute value setting
randomize_body_mass(env, "cube", mass_range=(0.3, 0.7), operation="abs")
# Scaling existing values
randomize_body_mass(env, "bbq_sauce", mass_range=(0.8, 1.2), operation="scale")
# Additive modification
randomize_body_mass(env, "sphere", mass_range=(0.1, 0.3), operation="add")
Implementation Details#
Helper Functions#
The tutorial provides two main helper functions:
randomize_body_mass()
: Handles mass randomization with configurable distributions and operationsrandomize_body_friction()
: Manages friction coefficient randomization
Environment Management#
Parallel Environments: Supports multiple parallel environments for efficient training
State Persistence: Maintains initial values for before/after comparison
Device Handling: Automatically handles GPU/CPU tensor placement
Physics Properties#
The script demonstrates randomization of:
Robot Mass: Individual body masses for articulated robots
Object Mass: Simple primitive objects (cube, sphere)
Surface Friction: Material properties affecting contact dynamics
Expected Output#
When you run the script, you’ll see detailed logging including:
=== ISAACSIM Domain Randomization Demo ===
INITIAL VALUES (Before Randomization)
============================================================
Robot body masses (shape: torch.Size([2, 7])):
Values: [0.73 0.73 0.73 0.73 0.73 0.73 0.73]
Cube mass: [0.1] kg
Sphere mass: [0.1] kg
DOMAIN RANDOMIZATION
============================================================
Randomizing cube mass (uniform, 0.3-0.7 kg)...
Before: [0.1] kg
After: [0.45] kg
RANDOMIZATION SUMMARY
================================================================================
Object Property Before After Change
--------------------------------------------------------------------------------
Cube Mass [0.1] [0.45] Uniform
Sphere Mass [0.1] [0.31] Gaussian
Robot Friction [0.8] [1.12] Log-Uniform
Customization#
You can easily extend this tutorial by:
Adding New Distributions: Implement custom probability distributions
More Properties: Randomize additional physics properties like restitution, damping
Temporal Randomization: Vary properties over time during simulation
Correlated Randomization: Ensure related properties change together realistically
This tutorial provides a solid foundation for implementing domain randomization in your MetaSim-based reinforcement learning projects.