Variations#

Variations are a structured way of introducing randomization into simulated environments.

Variations are attached to assets, travelling with them in a deactivated state. A user can enable a variation in any environment that contains an asset with that variation attached.

Variations are enabled by appending a Hydra override to the command line.

Discovering available variations#

Pass --list-variations to print every Hydra-configurable variation for the selected environment and then exit before rollout:

python isaaclab_arena/evaluation/policy_runner.py \
  --headless \
  --policy_type zero_action \
  --list-variations \
  pick_and_place_maple_table \
  --embodiment droid_abs_joint_pos \
  --pick_up_object rubiks_cube_hot3d_robolab \
  --destination_location bowl_ycb_robolab

The output lists each asset (scene asset or embodiment), the variation name, whether it is run-time or build-time, the Hydra path to enable it, and all tunable fields with their current defaults:

Hydra-configurable variations
================================

Asset: droid_abs_joint_pos
  camera_extrinsics_wrist_camera (CameraExtrinsicsVariation, run-time)
    Enable: droid_abs_joint_pos.camera_extrinsics_wrist_camera.enabled=true  (default: False)
    Fields:
      droid_abs_joint_pos.camera_extrinsics_wrist_camera.sampler_cfg.high = [0.005,0.005,0.005]
      droid_abs_joint_pos.camera_extrinsics_wrist_camera.sampler_cfg.low = [-0.005,-0.005,-0.005]

Asset: light
  hdr_image (HDRImageVariation, build-time)
    Enable: light.hdr_image.enabled=true  (default: False)
    Fields:
      light.hdr_image.hdr_names = []

Asset: bowl_ycb_robolab
  (no Hydra-configurable variations)

...

Enabling variations (minimal)#

To enable both variations, append their enabled=true override tokens after the environment subcommand. All other parameters stay at their defaults — the HDR is sampled uniformly from every registered HDR, and the camera extrinsics offset is drawn from [-0.005, 0.005] m per axis on every reset:

python isaaclab_arena/evaluation/policy_runner.py \
  --viz kit \
  --policy_type zero_action \
  --num_steps 50 \
  --enable_cameras \
  pick_and_place_maple_table \
  --embodiment droid_abs_joint_pos \
  --pick_up_object rubiks_cube_hot3d_robolab \
  --destination_location bowl_ycb_robolab \
  light.hdr_image.enabled=true \
  droid_abs_joint_pos.camera_extrinsics_wrist_camera.enabled=true

Enabling variations with explicit parameters#

The same run with every tunable parameter spelled out, showing the full override syntax:

python isaaclab_arena/evaluation/policy_runner.py \
  --viz kit \
  --policy_type zero_action \
  --num_steps 50 \
  --enable_cameras \
  pick_and_place_maple_table \
  --embodiment droid_abs_joint_pos \
  --pick_up_object rubiks_cube_hot3d_robolab \
  --destination_location bowl_ycb_robolab \
  light.hdr_image.enabled=true \
  "light.hdr_image.hdr_names=[home_office_robolab,billiard_hall_robolab,garage_robolab]" \
  droid_abs_joint_pos.camera_extrinsics_wrist_camera.enabled=true \
  "droid_abs_joint_pos.camera_extrinsics_wrist_camera.sampler_cfg.low=[-0.01,-0.01,-0.01]" \
  "droid_abs_joint_pos.camera_extrinsics_wrist_camera.sampler_cfg.high=[0.01,0.01,0.01]"

The hdr_names list restricts HDR sampling to the three named maps instead of the full registered set. The sampler_cfg.low / sampler_cfg.high vectors widen the camera extrinsics jitter range to ±10 mm per axis.

How Hydra override paths are structured#

All override paths follow the pattern:

<asset>.<variation_name>.<cfg_field>

where:

  • <asset> is the scene asset name (e.g. light) or the embodiment name (e.g. droid_abs_joint_pos).

  • <variation_name> is the name under which the variation is registered on that asset (e.g. hdr_image, camera_extrinsics_wrist_camera).

  • <cfg_field> is any attribute path within the variation’s *Cfg dataclass (e.g. enabled, sampler_cfg.low).

Use --list-variations on any environment to discover the exact paths available.