mjlab.terrains#
Terrain generation and importing.
Classes:
HfPyramidSlopedTerrainCfg(proportion: 'float' = 1.0, size: 'tuple[float, float]' = (10.0, 10.0), *, slope_range: tuple[float, float], platform_width: float = 1.0, inverted: bool = False, border_width: float = 0.0, horizontal_scale: float = 0.1, vertical_scale: float = 0.005, base_thickness_ratio: float = 1.0) |
|
HfRandomUniformTerrainCfg(proportion: 'float' = 1.0, size: 'tuple[float, float]' = (10.0, 10.0), *, noise_range: tuple[float, float], noise_step: float = 0.005, downsampled_scale: float | None = None, horizontal_scale: float = 0.1, vertical_scale: float = 0.005, base_thickness_ratio: float = 1.0, border_width: float = 0.0) |
|
HfWaveTerrainCfg(proportion: 'float' = 1.0, size: 'tuple[float, float]' = (10.0, 10.0), *, amplitude_range: tuple[float, float], num_waves: float = 1.0, horizontal_scale: float = 0.1, vertical_scale: float = 0.005, base_thickness_ratio: float = 0.25, border_width: float = 0.0) |
|
BoxFlatTerrainCfg(proportion: 'float' = 1.0, size: 'tuple[float, float]' = (10.0, 10.0)) |
|
BoxInvertedPyramidStairsTerrainCfg(proportion: 'float' = 1.0, size: 'tuple[float, float]' = (10.0, 10.0), *, border_width: 'float' = 0.0, step_height_range: 'tuple[float, float]', step_width: 'float', platform_width: 'float' = 1.0, holes: 'bool' = False) |
|
Configuration for a pyramid stairs terrain. |
|
BoxRandomGridTerrainCfg(proportion: 'float' = 1.0, size: 'tuple[float, float]' = (10.0, 10.0), *, grid_width: 'float', grid_height_range: 'tuple[float, float]', platform_width: 'float' = 1.0, holes: 'bool' = False, merge_similar_heights: 'bool' = False, height_merge_threshold: 'float' = 0.05, max_merge_distance: 'int' = 3) |
|
SubTerrainCfg(proportion: 'float' = 1.0, size: 'tuple[float, float]' = (10.0, 10.0)) |
|
Generates procedural terrain grids with configurable difficulty. |
|
TerrainGeneratorCfg(*, seed: 'int | None' = None, curriculum: 'bool' = False, size: 'tuple[float, float]', border_width: 'float' = 0.0, border_height: 'float' = 1.0, num_rows: 'int' = 1, num_cols: 'int' = 1, color_scheme: "Literal['height', 'random', 'none']" = 'height', sub_terrains: 'dict[str, SubTerrainCfg]' = <factory>, difficulty_range: 'tuple[float, float]' = (0.0, 1.0), add_lights: 'bool' = False) |
|
A class to handle terrain geometry and import it into the simulator. |
|
Configuration for terrain import and environment placement. |
- class mjlab.terrains.HfPyramidSlopedTerrainCfg[source]#
Bases:
SubTerrainCfgHfPyramidSlopedTerrainCfg(proportion: ‘float’ = 1.0, size: ‘tuple[float, float]’ = (10.0, 10.0), *, slope_range: tuple[float, float], platform_width: float = 1.0, inverted: bool = False, border_width: float = 0.0, horizontal_scale: float = 0.1, vertical_scale: float = 0.005, base_thickness_ratio: float = 1.0)
Attributes:
Methods:
function(difficulty, spec, rng)Generate terrain geometry.
__init__([proportion, size, platform_width, ...])
- class mjlab.terrains.HfRandomUniformTerrainCfg[source]#
Bases:
SubTerrainCfgHfRandomUniformTerrainCfg(proportion: ‘float’ = 1.0, size: ‘tuple[float, float]’ = (10.0, 10.0), *, noise_range: tuple[float, float], noise_step: float = 0.005, downsampled_scale: float | None = None, horizontal_scale: float = 0.1, vertical_scale: float = 0.005, base_thickness_ratio: float = 1.0, border_width: float = 0.0)
Attributes:
Methods:
function(difficulty, spec, rng)Generate terrain geometry.
__init__([proportion, size, noise_step, ...])- function(difficulty: float, spec: MjSpec, rng: Generator) TerrainOutput[source]#
Generate terrain geometry.
- Returns:
TerrainOutput containing spawn origin and list of geometries.
- __init__(proportion: float = 1.0, size: tuple[float, float] = (10.0, 10.0), *, noise_range: tuple[float, float], noise_step: float = 0.005, downsampled_scale: float | None = None, horizontal_scale: float = 0.1, vertical_scale: float = 0.005, base_thickness_ratio: float = 1.0, border_width: float = 0.0) None#
- class mjlab.terrains.HfWaveTerrainCfg[source]#
Bases:
SubTerrainCfgHfWaveTerrainCfg(proportion: ‘float’ = 1.0, size: ‘tuple[float, float]’ = (10.0, 10.0), *, amplitude_range: tuple[float, float], num_waves: float = 1.0, horizontal_scale: float = 0.1, vertical_scale: float = 0.005, base_thickness_ratio: float = 0.25, border_width: float = 0.0)
Attributes:
Methods:
function(difficulty, spec, rng)Generate terrain geometry.
__init__([proportion, size, num_waves, ...])
- class mjlab.terrains.BoxFlatTerrainCfg[source]#
Bases:
SubTerrainCfgBoxFlatTerrainCfg(proportion: ‘float’ = 1.0, size: ‘tuple[float, float]’ = (10.0, 10.0))
Methods:
- class mjlab.terrains.BoxInvertedPyramidStairsTerrainCfg[source]#
Bases:
BoxPyramidStairsTerrainCfgBoxInvertedPyramidStairsTerrainCfg(proportion: ‘float’ = 1.0, size: ‘tuple[float, float]’ = (10.0, 10.0), *, border_width: ‘float’ = 0.0, step_height_range: ‘tuple[float, float]’, step_width: ‘float’, platform_width: ‘float’ = 1.0, holes: ‘bool’ = False)
Methods:
function(difficulty, spec, rng)Generate terrain geometry.
__init__([proportion, size, border_width, ...])
- class mjlab.terrains.BoxPyramidStairsTerrainCfg[source]#
Bases:
SubTerrainCfgConfiguration for a pyramid stairs terrain.
Attributes:
Methods:
function(difficulty, spec, rng)Generate terrain geometry.
__init__([proportion, size, border_width, ...])
- class mjlab.terrains.BoxRandomGridTerrainCfg[source]#
Bases:
SubTerrainCfgBoxRandomGridTerrainCfg(proportion: ‘float’ = 1.0, size: ‘tuple[float, float]’ = (10.0, 10.0), *, grid_width: ‘float’, grid_height_range: ‘tuple[float, float]’, platform_width: ‘float’ = 1.0, holes: ‘bool’ = False, merge_similar_heights: ‘bool’ = False, height_merge_threshold: ‘float’ = 0.05, max_merge_distance: ‘int’ = 3)
Attributes:
Methods:
function(difficulty, spec, rng)Generate terrain geometry.
__init__([proportion, size, platform_width, ...])
- class mjlab.terrains.SubTerrainCfg[source]#
Bases:
ABCSubTerrainCfg(proportion: ‘float’ = 1.0, size: ‘tuple[float, float]’ = (10.0, 10.0))
Attributes:
Methods:
- class mjlab.terrains.TerrainGenerator[source]#
Bases:
objectGenerates procedural terrain grids with configurable difficulty.
Creates a grid of terrain patches where each patch can be a different terrain type. Supports two modes: random (patches get random difficulty) or curriculum (difficulty increases along rows for progressive training).
Terrain types are weighted by proportion and their geometry is generated based on a difficulty value in the configured range. The grid is centered at the world origin. A border can be added around the entire grid along with optional overhead lighting.
Methods:
- __init__(cfg: TerrainGeneratorCfg, device: str = 'cpu') None[source]#
- class mjlab.terrains.TerrainGeneratorCfg[source]#
Bases:
objectTerrainGeneratorCfg(*, seed: ‘int | None’ = None, curriculum: ‘bool’ = False, size: ‘tuple[float, float]’, border_width: ‘float’ = 0.0, border_height: ‘float’ = 1.0, num_rows: ‘int’ = 1, num_cols: ‘int’ = 1, color_scheme: “Literal[‘height’, ‘random’, ‘none’]” = ‘height’, sub_terrains: ‘dict[str, SubTerrainCfg]’ = <factory>, difficulty_range: ‘tuple[float, float]’ = (0.0, 1.0), add_lights: ‘bool’ = False)
Attributes:
Methods:
__init__(*[, seed, curriculum, ...])- sub_terrains: dict[str, SubTerrainCfg]#
- __init__(*, seed: int | None = None, curriculum: bool = False, size: tuple[float, float], border_width: float = 0.0, border_height: float = 1.0, num_rows: int = 1, num_cols: int = 1, color_scheme: ~typing.Literal['height', 'random', 'none'] = 'height', sub_terrains: dict[str, ~mjlab.terrains.terrain_generator.SubTerrainCfg] = <factory>, difficulty_range: tuple[float, float] = (0.0, 1.0), add_lights: bool = False) None#
- class mjlab.terrains.TerrainImporter[source]#
Bases:
objectA class to handle terrain geometry and import it into the simulator.
We assume that a terrain geometry comprises of sub-terrains that are arranged in a grid with num_rows rows and num_cols columns. The terrain origins are the positions of the sub-terrains where the robot should be spawned.
Based on the configuration, the terrain importer handles computing the environment origins from the sub-terrain origins. In a typical setup, the number of sub-terrains num_rows x num_cols is smaller than the number of environments num_envs. In this case, the environment origins are computed by sampling the sub-terrain origins.
Methods:
__init__(cfg, device)import_ground_plane(name)configure_env_origins([origins])Configure the origins of the environments based on the added terrain.
update_env_origins(env_ids, move_up, move_down)Update the environment origins based on the terrain levels.
randomize_env_origins(env_ids)Randomize the environment origins to random sub-terrains.
Attributes:
- __init__(cfg: TerrainImporterCfg, device: str) None[source]#
- property spec: MjSpec#
- configure_env_origins(origins: ndarray | Tensor | None = None)[source]#
Configure the origins of the environments based on the added terrain.
- class mjlab.terrains.TerrainImporterCfg[source]#
Bases:
objectConfiguration for terrain import and environment placement.
Attributes:
Type of terrain to generate.
Configuration for procedural terrain generation.
Distance between environment origins when using grid layout.
Maximum initial difficulty level (row index) for environment placement in curriculum mode.
Number of parallel environments to create.
Methods:
__init__([terrain_type, terrain_generator, ...])- terrain_type: Literal['generator', 'plane'] = 'plane'#
Type of terrain to generate. “generator” uses procedural terrain with sub-terrain grid, “plane” creates a flat ground plane.
- terrain_generator: TerrainGeneratorCfg | None = None#
Configuration for procedural terrain generation. Required when terrain_type is “generator”.
- env_spacing: float | None = 2.0#
Distance between environment origins when using grid layout. Required for “plane” terrain or when no sub-terrain origins exist.
- max_init_terrain_level: int | None = None#
Maximum initial difficulty level (row index) for environment placement in curriculum mode. None uses all available rows.