Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion source/isaaclab_tasks/config/extension.toml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
[package]

# Note: Semantic Versioning is used: https://semver.org/
version = "1.5.28"
version = "1.5.30"

# Description
title = "Isaac Lab Environments"
Expand Down
33 changes: 33 additions & 0 deletions source/isaaclab_tasks/docs/CHANGELOG.rst
Original file line number Diff line number Diff line change
@@ -1,6 +1,39 @@
Changelog
---------

1.5.30 (2026-04-27)
~~~~~~~~~~~~~~~~~~~

Added
^^^^^

* Added Newton rough terrain support for the G1 biped locomotion velocity
env. The only engine-specific change is a ~1.7x ``max_iterations`` preset on
:class:`~isaaclab_tasks.manager_based.locomotion.velocity.config.g1.agents.rsl_rl_ppo_cfg.G1RoughPPORunnerCfg`
(Newton = 5000, PhysX = 3000). PhysX saturates near iter 3000 on both
reward (≈ +18) and episode length (≈ 980) and does not meaningfully
improve further; Newton reaches the same (reward, ep_len) quality at
iter 5000. The iteration budget is bumped rather than tuning physics
or reward terms.


1.5.29 (2026-04-27)
~~~~~~~~~~~~~~~~~~~

Changed
^^^^^^^

* Re-enabled ``add_base_mass`` randomization on H1 and Cassie in their
rough-terrain configs (previously ``= None`` per the pre-existing biped
convention). H1 uses the shared log-uniform scale default from
``EventsCfg``; Cassie overrides to ``(1.0, 1.25)`` asymmetric heavier-bias
(never lighter than nominal). Symmetric ±25% regressed Cassie reward by
40% vs disabled due to closed-loop Achilles coupling destabilizing on
lighter pelvis mass; ``(1.0, 1.25)`` recovers to 90% of the
mass-rand-disabled baseline while retaining the domain-randomization
benefit.


1.5.28 (2026-04-24)
~~~~~~~~~~~~~~~~~~~

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
LocomotionVelocityRoughEnvCfg,
RewardsCfg,
)
from isaaclab_tasks.utils import preset

##
# Pre-defined configs
Expand Down Expand Up @@ -60,12 +61,23 @@ def __post_init__(self):
super().__post_init__()
# scene
self.scene.robot = CASSIE_CFG.replace(prim_path="{ENV_REGEX_NS}/Robot")
# Cassie Newton-only armature for biped stability on rough terrain; PhysX unchanged
self.scene.robot.actuators["legs"].armature = preset(default=0.0, newton=0.02)

self.scene.height_scanner.prim_path = "{ENV_REGEX_NS}/Robot/pelvis"

# Cassie uses "pelvis" as base body — disable mass randomization for bipeds
self.events.add_base_mass = None
# Cassie uses "pelvis" as base body. Override the shared symmetric
# (1/1.25, 1.25) log-uniform scale with asymmetric (1.0, 1.25) —
# lighter-than-nominal pelvis destabilizes Cassie's closed-loop
# Achilles coupling + hip PD response, so only heavier perturbations
# are safe. Symmetric ±25% regressed reward 40% vs disabled;
# (1.0, 1.25) recovers to 90% of baseline.
self.events.add_base_mass.params["asset_cfg"].body_names = "pelvis"
self.events.add_base_mass.params["mass_distribution_params"] = (1.0, 1.25)
self.events.base_com = None
self.events.base_external_force_torque.params["asset_cfg"].body_names = ".*pelvis"
# Cassie has precise initial pose — don't scale joint defaults randomly on reset
self.events.reset_robot_joints.params["position_range"] = (1.0, 1.0)

# actions
self.actions.joint_pos.scale = 0.5
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -232,6 +232,8 @@ def __post_init__(self):
self.events.add_base_mass.params["asset_cfg"].body_names = "torso_base"
self.events.base_external_force_torque.params["asset_cfg"].body_names = "torso_base"
self.events.base_com.default.params["asset_cfg"].body_names = "torso_base"
# Digit has precise initial pose — don't scale joint defaults randomly on reset
self.events.reset_robot_joints.params["position_range"] = (1.0, 1.0)

# Override actuator to target only actuated joints. Digit has ball joints (rod constraints)
# that MuJoCo represents with 4 DoFs instead of 3, inflating joint_pos to 74 columns while
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,19 @@

from isaaclab_rl.rsl_rl import RslRlOnPolicyRunnerCfg, RslRlPpoActorCriticCfg, RslRlPpoAlgorithmCfg

from isaaclab_tasks.utils import preset


@configclass
class G1RoughPPORunnerCfg(RslRlOnPolicyRunnerCfg):
num_steps_per_env = 24
max_iterations = 3000
# Newton needs ~1.7x the PPO iterations to match PhysX on G1. PhysX saturates near iter 3000
# (reward ≈ +18, ep_len ≈ 980) and does not meaningfully improve on either metric past that —
# reward oscillates +16 to +19 through iter 7500, ep_len stays flat. Newton reaches the same
# (reward, ep_len) quality at iter 5000 (+16 / 984). Comparing reward alone is misleading:
# ep_len confirms the robot is stable in both cases. The gap is sample-efficiency, not a
# ceiling — no physics or reward tuning closes it.
max_iterations = preset(default=3000, newton=5000)
save_interval = 50
experiment_name = "g1_rough"
policy = RslRlPpoActorCriticCfg(
Expand Down
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Stale Documentation: Comments in this file reference "37 DOF action space" but this PR removes 14 finger joints, reducing the action space to 23 DOF.

Please update the comments to reflect the actual action space dimensions after finger joint removal.

Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,8 @@ def __post_init__(self):
self.events.add_base_mass = None
self.events.base_com = None
self.events.base_external_force_torque.params["asset_cfg"].body_names = "torso_link"
# G1 has precise initial pose — don't scale joint defaults randomly on reset
self.events.reset_robot_joints.params["position_range"] = (1.0, 1.0)

# Rewards
self.rewards.lin_vel_z_l2.weight = 0.0
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -83,8 +83,11 @@ def __post_init__(self):
if self.scene.height_scanner:
self.scene.height_scanner.prim_path = "{ENV_REGEX_NS}/Robot/torso_link"

# H1 uses "torso_link" as base body — disable mass randomization for bipeds
self.events.add_base_mass = None
# H1 uses "torso_link" as base body; inherits the shared log-uniform mass
# randomization scale from EventsCfg (no per-H1 override needed).
self.events.add_base_mass.params["asset_cfg"].body_names = "torso_link"
# H1 has precise initial pose — don't scale joint defaults randomly on reset
self.events.reset_robot_joints.params["position_range"] = (1.0, 1.0)
self.events.base_com = None
self.events.base_external_force_torque.params["asset_cfg"].body_names = ".*torso_link"

Expand Down
Loading