refactor terrain config for clarity.

This commit is contained in:
wertyuilife
2026-04-13 15:34:23 +08:00
parent fd3650b6da
commit b76245dc55
2 changed files with 23 additions and 55 deletions

View File

@@ -18,7 +18,7 @@ from isaaclab.utils.noise import AdditiveUniformNoiseCfg as Unoise
import robot_lab.tasks.go2.mdp as mdp
from robot_lab.assets.unitree import GO2_CFG_ROBOTLAB, GO2_CFG_UNITREE
from robot_lab.tasks.go2.mdp.terrain import DEFAULT_TERRAIN_CFG
from robot_lab.tasks.go2.mdp.terrain import TERRAIN_CFG
JOINT_NAMES = [
"FL_hip_joint", "FL_thigh_joint", "FL_calf_joint",
@@ -31,13 +31,6 @@ BASE_LINK_NAME = "base"
FOOT_LINK_NAME = ".*_foot"
BASE_HEIGHT_TARGET = 0.38 # base height target for rewards, set as an attribute of the env config.
##
# Terrain definition
##
TERRAIN_CFG = DEFAULT_TERRAIN_CFG
##
# Scene definition
##

View File

@@ -1,25 +1,3 @@
# Copyright (c) 2024-2025 Ziqi Fan
# SPDX-License-Identifier: Apache-2.0
"""Terrain presets for the Go2 task.
This module keeps two terrain configurations side by side:
1. ``ORIGINAL_TERRAIN_CFG``:
The original RobotLab terrain setup that existed before Gym-alignment changes.
This is the default selection used by ``env_cfg.py`` so existing training behavior
is not changed.
2. ``GYM_ALIGNED_TERRAIN_CFG``:
A Gym-oriented terrain setup derived from:
- ``legged_gym/envs/go2/go2_config.py``
- ``legged_gym/utils/terrain.py``
and interpreted with ``IS_HARD = True``.
Only the terrain generator presets live here. The environment can choose either
configuration without modifying the rest of the task code.
"""
from __future__ import annotations
import numpy as np
@@ -31,10 +9,10 @@ from isaaclab.terrains.height_field.utils import height_field_to_mesh
# -----------------------------------------------------------------------------
# Original RobotLab terrain setup
# Default RobotLab terrain setup
# -----------------------------------------------------------------------------
ORIGINAL_TERRAIN_CFG = terrain_gen.TerrainGeneratorCfg(
DEFAULT_TERRAIN_CFG = terrain_gen.TerrainGeneratorCfg(
size=(8.0, 8.0),
border_width=25.0,
num_rows=10,
@@ -94,12 +72,12 @@ ORIGINAL_TERRAIN_CFG = terrain_gen.TerrainGeneratorCfg(
# -----------------------------------------------------------------------------
def _gym_signed_pyramid_slope_height_field(
def _signed_pyramid_slope_height_field(
difficulty: float,
cfg: terrain_gen.HfPyramidSlopedTerrainCfg,
random_inverted: bool,
) -> np.ndarray:
"""Generate a Gym-style pyramid slope with optional random sign."""
"""Generate a pyramid slope with optional random sign."""
slope = cfg.slope_range[0] + difficulty * (cfg.slope_range[1] - cfg.slope_range[0])
if random_inverted and np.random.rand() < 0.5:
slope = -slope
@@ -130,30 +108,30 @@ def _gym_signed_pyramid_slope_height_field(
@height_field_to_mesh
def gym_wave_terrain(difficulty: float, cfg) -> np.ndarray:
"""Gym-style wave terrain: wave plus random uniform roughness."""
def wave_terrain(difficulty: float, cfg) -> np.ndarray:
"""wave terrain: wave plus random uniform roughness."""
wave = hf_terrains.wave_terrain.__wrapped__(difficulty, cfg)
rough = hf_terrains.random_uniform_terrain.__wrapped__(difficulty, cfg)
return np.rint(wave + rough).astype(np.int16)
@height_field_to_mesh
def gym_slope_terrain(difficulty: float, cfg) -> np.ndarray:
"""Gym-style slope terrain with 50/50 positive and negative slopes."""
return _gym_signed_pyramid_slope_height_field(difficulty, cfg, random_inverted=True)
def slope_terrain(difficulty: float, cfg) -> np.ndarray:
"""slope terrain with 50/50 positive and negative slopes."""
return _signed_pyramid_slope_height_field(difficulty, cfg, random_inverted=True)
@height_field_to_mesh
def gym_rough_slope_terrain(difficulty: float, cfg) -> np.ndarray:
"""Gym-style rough slope terrain: slope plus random uniform roughness."""
slope = _gym_signed_pyramid_slope_height_field(difficulty, cfg, random_inverted=False)
def rough_slope_terrain(difficulty: float, cfg) -> np.ndarray:
"""rough slope terrain: slope plus random uniform roughness."""
slope = _signed_pyramid_slope_height_field(difficulty, cfg, random_inverted=False)
rough = hf_terrains.random_uniform_terrain.__wrapped__(difficulty, cfg)
return np.rint(slope + rough).astype(np.int16)
@configclass
class GymWaveTerrainCfg(terrain_gen.HfTerrainBaseCfg):
function = gym_wave_terrain
class WaveTerrainCfg(terrain_gen.HfTerrainBaseCfg):
function = wave_terrain
amplitude_range: tuple[float, float] = (0.1, 0.28)
num_waves: int = 5
noise_range: tuple[float, float] = (-0.05, 0.05)
@@ -162,15 +140,15 @@ class GymWaveTerrainCfg(terrain_gen.HfTerrainBaseCfg):
@configclass
class GymSlopeTerrainCfg(terrain_gen.HfTerrainBaseCfg):
function = gym_slope_terrain
class SlopeTerrainCfg(terrain_gen.HfTerrainBaseCfg):
function = slope_terrain
slope_range: tuple[float, float] = (0.1, 0.568)
platform_width: float = 3.0
@configclass
class GymRoughSlopeTerrainCfg(terrain_gen.HfTerrainBaseCfg):
function = gym_rough_slope_terrain
class RoughSlopeTerrainCfg(terrain_gen.HfTerrainBaseCfg):
function = rough_slope_terrain
slope_range: tuple[float, float] = (0.1, 0.568)
platform_width: float = 3.0
noise_range: tuple[float, float] = (-0.05, 0.05)
@@ -178,7 +156,7 @@ class GymRoughSlopeTerrainCfg(terrain_gen.HfTerrainBaseCfg):
downsampled_scale: float = 0.2
GYM_ALIGNED_TERRAIN_CFG = terrain_gen.TerrainGeneratorCfg(
TERRAIN_CFG = terrain_gen.TerrainGeneratorCfg(
size=(8.0, 8.0),
border_width=25.0,
num_rows=10,
@@ -188,21 +166,21 @@ GYM_ALIGNED_TERRAIN_CFG = terrain_gen.TerrainGeneratorCfg(
slope_threshold=0.75,
use_cache=False,
sub_terrains={
"wave": GymWaveTerrainCfg(
"wave": WaveTerrainCfg(
proportion=0.05,
border_width=0.0,
horizontal_scale=0.1,
vertical_scale=0.005,
slope_threshold=0.75,
),
"slope": GymSlopeTerrainCfg(
"slope": SlopeTerrainCfg(
proportion=0.20,
border_width=0.0,
horizontal_scale=0.1,
vertical_scale=0.005,
slope_threshold=0.75,
),
"rough_slope": GymRoughSlopeTerrainCfg(
"rough_slope": RoughSlopeTerrainCfg(
proportion=0.05,
border_width=0.0,
horizontal_scale=0.1,
@@ -260,6 +238,3 @@ GYM_ALIGNED_TERRAIN_CFG = terrain_gen.TerrainGeneratorCfg(
"flat": terrain_gen.MeshPlaneTerrainCfg(proportion=0.15),
},
)
DEFAULT_TERRAIN_CFG = GYM_ALIGNED_TERRAIN_CFG