Skip to content

Commit fa81247

Browse files
committed
Switch base-mass randomization to log-uniform scale (drop per-robot overrides)
Change EventsCfg.add_base_mass from additive (-5, 5) kg uniform to multiplicative (1/1.25, 1.25) log-uniform scale with distribution="log_uniform" and operation="scale". The range is symmetric in log space (geometric mean = 1.0), so the randomization has no net mass bias and is scale-invariant across robot sizes — a single default works for the 2 kg pelvis of Cassie and the 32 kg base of Anymal-D without per-robot tuning. Drop the per-robot (-1.0, 3.0) additive overrides on A1, Go1, Go2 (introduced in PR #3308 [Newton] Locomotion Velocity-Flat envs, 2025-09-18) which have a +1 kg mean shift that biases controllers toward always-heavier nominal — a 10% bias on A1's 10 kg base that was actively hurting convergence. ## Why the change The old (-5, 5) kg additive default was a reasonable tune for Anymal-D (≈16% range) but too wide for A1 (≈50%) and too narrow for H1 (≈10%). PR #3308 addressed this with per-robot (-1, 3) overrides on small quadrupeds, but the range remained asymmetric (mean shifted +1 kg) and tuning was per-robot. A multiplicative scale is more physically meaningful — mass scales in ratio with actuator torque and gravity response, so the perturbation's effect on gait is a fixed fraction regardless of robot mass. Log-uniform over [1/1.25, 1.25] gives symmetric perturbation in log space with geometric mean = 1.0, so the training distribution is unbiased. ## Ablation results (1500-iter Newton unless noted) | Robot | old default | new log-uniform | Δ | |-------------|------------:|----------------:|------------:| | A1 @300 | 3.25 | 10.00 | 3.08x | | Go1 @300 | 16.30 | 22.29 | 1.37x | | Anymal-B @300 | 10.92 | 12.47 | 1.14x | | Anymal-C @300 | 12.31 | 14.64 | 1.19x | | Go2 @1499 | 18.58 | 24.71 | 1.33x | | Anymal-D @1499 | 15.62 | 16.09 | 1.03x | A1's 3x gain is the bias-removal effect: the old (-1, 3) applied +10% mean mass shift on a 10 kg robot, forcing the controller to spend capacity compensating for a nonphysical average instead of learning the nominal gait. The new default's geometric mean 1.0 removes that bias entirely. Biped configurations (H1, Cassie) are handled in the follow-up PR #5298. Cassie specifically requires an asymmetric heavier-bias override due to its closed-loop Achilles coupling being mass-sensitive; that override ships alongside the biped changes.
1 parent 328854d commit fa81247

6 files changed

Lines changed: 25 additions & 8 deletions

File tree

source/isaaclab_tasks/config/extension.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
[package]
22

33
# Note: Semantic Versioning is used: https://semver.org/
4-
version = "1.5.22"
4+
version = "1.5.23"
55

66
# Description
77
title = "Isaac Lab Environments"

source/isaaclab_tasks/docs/CHANGELOG.rst

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,23 @@
11
Changelog
22
---------
33

4+
1.5.23 (2026-04-22)
5+
~~~~~~~~~~~~~~~~~~~
6+
7+
Changed
8+
^^^^^^^
9+
10+
* Replaced the additive ``(-5, 5)`` kg default on
11+
``EventsCfg.add_base_mass`` with a multiplicative ``(1/1.25, 1.25)``
12+
log-uniform scale (``operation="scale"``, ``distribution="log_uniform"``).
13+
The new default is scale-invariant across robot sizes and has geometric
14+
mean 1.0 — no net mass bias. Removed the per-robot override
15+
``(-1.0, 3.0)`` additive on A1/Go1/Go2 (no longer needed). On Anymal-D
16+
1500-iter Newton, the new default raises reward from 15.62 to 16.09; on
17+
A1 at iter 300, from 3.25 to 10.00 (the old override had a +10% mean
18+
bias, which was 10% of A1's 10 kg base mass and hurt convergence on
19+
small robots).
20+
421
1.5.22 (2026-04-16)
522
~~~~~~~~~~~~~~~~~~~
623

source/isaaclab_tasks/isaaclab_tasks/manager_based/locomotion/velocity/config/a1/rough_env_cfg.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ def __post_init__(self):
2929

3030
# A1 uses "trunk" as base body
3131
self.events.add_base_mass.params["asset_cfg"].body_names = "trunk"
32-
self.events.add_base_mass.params["mass_distribution_params"] = (-1.0, 3.0)
3332
self.events.base_external_force_torque.params["asset_cfg"].body_names = "trunk"
3433
self.events.base_com.default.params["asset_cfg"].body_names = "trunk"
3534

source/isaaclab_tasks/isaaclab_tasks/manager_based/locomotion/velocity/config/go1/rough_env_cfg.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@ def __post_init__(self):
3131

3232
# Go1 uses "trunk" as base body
3333
self.events.add_base_mass.params["asset_cfg"].body_names = "trunk"
34-
self.events.add_base_mass.params["mass_distribution_params"] = (-1.0, 3.0)
3534
self.events.base_external_force_torque.params["asset_cfg"].body_names = "trunk"
3635
self.events.base_com.default.params["asset_cfg"].body_names = "trunk"
3736

source/isaaclab_tasks/isaaclab_tasks/manager_based/locomotion/velocity/config/go2/rough_env_cfg.py

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,6 @@ def __post_init__(self):
3030
self.scene.terrain.terrain_generator.sub_terrains["random_rough"].noise_range = (0.01, 0.06)
3131
self.scene.terrain.terrain_generator.sub_terrains["random_rough"].noise_step = 0.01
3232

33-
# Go2 uses smaller mass randomization range
34-
self.events.add_base_mass.params["mass_distribution_params"] = (-1.0, 3.0)
35-
3633
# reduce action scale
3734
self.actions.joint_pos.scale = 0.25
3835

source/isaaclab_tasks/isaaclab_tasks/manager_based/locomotion/velocity/velocity_env_cfg.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -209,8 +209,13 @@ class EventsCfg:
209209
mode="startup",
210210
params={
211211
"asset_cfg": SceneEntityCfg("robot", body_names="base"),
212-
"mass_distribution_params": (-5.0, 5.0),
213-
"operation": "add",
212+
# Multiplicative ±25% log-uniform. Scale-invariant across robot sizes, so
213+
# per-robot range overrides are no longer needed. Geometric mean = 1.0
214+
# (no net mass shift); inverse symmetric (acceleration perturbation
215+
# symmetric around nominal).
216+
"mass_distribution_params": (1 / 1.25, 1.25),
217+
"operation": "scale",
218+
"distribution": "log_uniform",
214219
},
215220
)
216221

0 commit comments

Comments
 (0)