physics_modifier_manager
Module: GBC.gyms.isaaclab_45.managers.physics_modifier_manager
Overview πβ
The PhysicsModifierManager
is a specialized manager class that enables curriculum learning and progressive training in reinforcement learning and imitation learning environments. It allows users to introduce physics modifiers such as external forces, torques, random disturbances, and other physics interventions to gradually increase training difficulty or adapt agents to specific physical conditions.
This manager is particularly useful for:
- π― Curriculum Learning: Gradually increasing physics complexity during training
- π Domain Adaptation: Adding realistic physics disturbances to improve robustness
- π Progressive Training: Starting with simplified physics and evolving towards realistic conditions
- βοΈ Environmental Conditioning: Training agents for specific physical scenarios
Core Features ββ
Dynamic Physics Modification πβ
- β‘ Real-time Updates: Physics modifiers are applied every physics step for immediate effect
- ποΈ Adaptive Parameters: Modifier parameters can be dynamically updated based on training progress
- π§ Environment-aware: Modifiers can access environment state and respond intelligently
- π Curriculum Integration: Seamless integration with curriculum learning strategies
Flexible Configuration System π οΈβ
- π§© Term-based Architecture: Each physics modifier is configured as a term with specific parameters
- π¨ Decorator Support: Uses
@update
decorator for sophisticated update strategies - π Hot-swapping: Modifier configurations can be changed during runtime
- π Hierarchical Override: Parameters can be overridden at multiple levels
Class Reference πβ
PhysicsModifierManager ποΈβ
Inheritance: ManagerBase
The main manager class responsible for coordinating and applying physics modifiers.
Constructor π¨β
def __init__(self, cfg: object, env: ManagerBasedEnv)
Parameters:
cfg
: Configuration object containing physics modifier term definitionsenv
: The IsaacLab environment instance to apply modifiers to
Key Properties πβ
active_terms πβ
@property
def active_terms(self) -> list[str]
Returns the list of currently active physics modifier term names.
Core Methods βοΈβ
apply() πβ
def apply(self, env_ids: Sequence[int] | None = None)
Applies all active physics modifiers to the specified environment instances.
Parameters:
env_ids
: Environment IDs to apply modifiers to. If None, applies to all environments.
Behavior:
- Executes every registered physics modifier function
- Passes environment-specific parameters to each modifier
- Handles parameter overrides and function-specific arguments
update() πβ
def update(self, env_ids: Sequence[int] | None = None)
Updates physics modifier parameters based on training progress and environmental conditions.
Parameters:
env_ids
: Environment IDs to update modifiers for. If None, updates for all environments.
Features:
- Called every observation step for adaptive parameter adjustment
- Enables curriculum learning through progressive parameter modification
- Supports complex update strategies through decorated functions
reset() πβ
def reset(self, env_ids: Sequence[int] | None = None) -> dict[str, float]
Resets physics modifiers for specified environments, typically called at episode boundaries.
Parameters:
env_ids
: Environment IDs to reset modifiers for. If None, resets for all environments.
Returns:
- Dictionary of reset-related metrics (currently empty)
Configuration Management π οΈβ
set_term_cfg() βοΈβ
def set_term_cfg(self, term_name: str, cfg: PhysicsModifierTermCfg)
Dynamically updates configuration for a specific physics modifier term.
Parameters:
term_name
: Name of the term to updatecfg
: New configuration for the term
get_term_cfg() πβ
def get_term_cfg(self, term_name: str) -> PhysicsModifierTermCfg
Retrieves current configuration for a specific physics modifier term.
Parameters:
term_name
: Name of the term to retrieve configuration for
Returns:
- Current
PhysicsModifierTermCfg
for the specified term
Physics Modifier Function Architecture ποΈβ
Function Decorator System π¨β
Physics modifier functions must be decorated with the @update
decorator from physics_modifier_function_wrapper.py
:
from GBC.gyms.isaaclab_45.managers.physics_modifier_function_wrapper import update
@update(update_strategy=custom_update_strategy)
def my_physics_modifier(env, env_ids, **params):
# Modifier implementation
pass
Update Strategy Pattern πβ
The @update
decorator supports sophisticated parameter update strategies:
def scaling_modifier(current_overrides: dict, new_kwargs: dict) -> dict:
"""Example update strategy that scales parameters"""
updated = dict(current_overrides)
if new_kwargs:
for k, v in new_kwargs.items():
if isinstance(v, (int, float)):
updated[k] = v * 0.6 # Scale down by 40%
return updated
Practical Example: External Force for Curriculum Learning πβ‘β
Use Case: Baby Walker Training πΆπΆβ
The following example demonstrates a sophisticated physics modifier for robot locomotion training:
class ExternalForceUpdater:
"""Adaptive update strategy for external force curriculum"""
def __init__(self):
self.history_base_contact = deque(maxlen=320)
self.last_update_cnt = 0
def update_external_z_force_base(self, current_overrides: dict, new_kwargs: dict) -> dict:
env = new_kwargs["env"]
# Monitor base contact performance
base_contact = env.unwrapped.extras["log"]["Episode_Termination/base_contact"]
self.add_base_contact_val(base_contact)
base_contact_avg = self.get_base_contact_avg()
# Adaptive parameter adjustment
if base_contact_avg < new_kwargs["update_threshold"]:
# Robot is struggling, make training easier
current_overrides["apply_offset_range"] *= new_kwargs["update_ratio"]
else:
# Robot is succeeding, increase difficulty
current_overrides["apply_offset_range"] /= new_kwargs["update_ratio"]
return current_overrides
@update(update_strategy=ExternalForceUpdater().update_external_z_force_base)
def external_z_force_base(
env: ManagerBasedRLEnv,
env_ids: torch.Tensor,
max_force: float,
apply_offset_range: float,
apply_force_duration_ratio: float,
asset_cfg: SceneEntityCfg = SceneEntityCfg("robot"),
working_mode: str = "spring",
ref_height_offset: float = 0.15,
update_threshold: float = 1.1,
update_ratio: float = 1.05,
update_interval: int = 320,
apply_offset_range_bound: tuple[float] = (0.01, 1.05),
):
"""
Applies adaptive external z-direction force to robot base for curriculum learning.
This modifier implements a "baby walker" training strategy where:
- External upward force prevents robot from falling
- Force magnitude and application range adapt based on performance
- Two working modes: "spring" (proportional) and "constant" (binary)
Working Modes:
- Spring: F = -k * (z - ref_height) with clamping
- Constant: F = max_force when height deviation exceeds threshold
Curriculum Progression:
- Successful training reduces force magnitude and range
- Poor performance increases assistance
- Force duration can be shortened as training progresses
"""
# Implementation details for force calculation and application
# ... (force computation logic)
# Apply force through IsaacLab's external force system
asset.set_external_force_and_torque(
forces=forces,
torques=torque,
body_ids=asset_cfg.body_ids,
env_ids=env_ids
)
Configuration Registration βοΈβ
@configclass
class PhysicsModifiersCfg:
"""Physics modifiers configuration"""
external_z_force_base = PhysicsModifierTermCfg(
func=external_z_force_base,
params={
"max_force": 1500.0,
"apply_offset_range": 0.15,
"apply_force_duration_ratio": 1.0,
"asset_cfg": SceneEntityCfg("robot", body_names=["torso_link"]),
"update_threshold": 1.1,
"update_ratio": 1.05,
"update_interval": 320,
"apply_offset_range_bound": (0.01, 50.0),
},
description="Adaptive external z-force for curriculum learning (baby walker)",
)
Integration with Environment πβ
Environment Configuration π§β
@configclass
class MyEnvCfg(ManagerBasedRLEnvCfg):
# ... other configurations
physics_modifiers: PhysicsModifiersCfg = PhysicsModifiersCfg()
Runtime Usage πββοΈβ
# In environment step loop
env.physics_modifier_manager.apply() # Apply modifiers every physics step
env.physics_modifier_manager.update() # Update parameters every observation step
# Dynamic configuration changes
new_cfg = PhysicsModifierTermCfg(
func=external_z_force_base,
params={"max_force": 2000.0} # Increased force
)
env.physics_modifier_manager.set_term_cfg("external_z_force_base", new_cfg)
Advanced Features πβ
Multi-modal Training Strategies π―β
Physics modifiers can implement complex training curricula:
- π Progressive Difficulty: Start with high assistance, gradually reduce
- π Performance-based Adaptation: Adjust based on success metrics
- π Multi-phase Training: Different modifiers for different training stages
- π Environmental Conditioning: Specific modifiers for target deployment conditions
Performance Considerations β‘β
- π§ Efficient Updates: Update strategies should be computationally lightweight
- π― Selective Application: Use
env_ids
parameter for targeted modification - πΎ Memory Management: Use circular buffers for historical data
- π Parameter Bounds: Always implement reasonable parameter bounds
Best Practices π‘β
Function Design π¨β
- π Stateful Updates: Use class-based update strategies for complex curricula
- π‘οΈ Robust Bounds: Always clamp parameters to safe ranges
- π Performance Monitoring: Track relevant metrics for adaptive updates
- π Graceful Degradation: Handle edge cases and parameter edge values
Curriculum Design πβ
- π± Start Simple: Begin with high assistance/simplified physics
- π Monitor Progress: Use performance metrics to guide curriculum progression
- π Smooth Transitions: Avoid abrupt parameter changes that could destabilize training
- π― Target-oriented: Design curriculum with final deployment conditions in mind
Integration Patterns π§β
- π§© Modular Design: Keep physics modifiers independent and composable
- βοΈ Configuration Flexibility: Support both static and dynamic parameter updates
- π Logging Integration: Track modifier parameters and effects for analysis
- π Environment Compatibility: Ensure modifiers work across different environment configurations
Error Handling π‘οΈβ
The manager includes robust error handling:
- β Type Validation: Ensures all terms are properly configured
- π Function Validation: Verifies required
update
attribute on modifier functions - π Parameter Validation: Checks function signatures and parameter compatibility
- π Runtime Safety: Handles edge cases in parameter updates and force applications
Related Components πβ
- π PhysicsModifierTermCfg: Configuration class for individual physics modifier terms
- π¨ physics_modifier_function_wrapper: Decorator system for update strategies
- ποΈ ManagerBase: Base class providing core manager functionality
- π IsaacLab Integration: Seamless integration with IsaacLab's physics simulation system