Source code for wbc_mjlab.robots.env
"""Build WBC env / RL configs for a physical robot (used by task registration)."""
from __future__ import annotations
from collections.abc import Callable
from typing import TYPE_CHECKING, Any
from wbc_mjlab.robots.ids import RobotId, resolve_robot_id
if TYPE_CHECKING:
from mjlab.envs import ManagerBasedRlEnvCfg
from mjlab.rl import RslRlOnPolicyRunnerCfg
EnvCfgBuilder = Callable[..., Any]
RlCfgBuilder = Callable[[], Any]
_ENV_BUILDERS: dict[str, EnvCfgBuilder] = {}
_RL_BUILDERS: dict[str, RlCfgBuilder] = {}
_G1_REGISTERED = False
def _register_g1() -> None:
global _G1_REGISTERED
if _G1_REGISTERED:
return
from wbc_mjlab.robots.g1.rl_cfg import g1_wbc_rl_cfg
from wbc_mjlab.robots.g1.tasks import make_g1_wbc_env_cfg
_ENV_BUILDERS["g1"] = make_g1_wbc_env_cfg
_RL_BUILDERS["g1"] = g1_wbc_rl_cfg
_G1_REGISTERED = True
[docs]
def register_robot_builders(
robot_id: str,
make_env_cfg: EnvCfgBuilder,
make_rl_cfg: RlCfgBuilder,
) -> None:
"""Register env/RL config builders for an external or in-tree robot.
Prefer :func:`wbc_mjlab.extension.register_wbc_extension` for the full
robot + task registration path.
"""
rid = robot_id.strip().lower()
_ENV_BUILDERS[rid] = make_env_cfg
_RL_BUILDERS[rid] = make_rl_cfg
def _ensure_builders() -> None:
_register_g1()
[docs]
def make_wbc_env_cfg(
robot_id: str | RobotId = "g1",
*,
play: bool = False,
task_id: str = "Wbc-G1",
**kwargs,
) -> ManagerBasedRlEnvCfg:
"""Build a WBC env config for a registered robot.
Args:
robot_id: Registered robot id (default ``\"g1\"``).
play: If True, disable train-only DR / assistive wrench (play mode).
task_id: Task id used by the robot builder to select the preset stack.
**kwargs: Forwarded to the robot's env builder.
"""
_ensure_builders()
rid = resolve_robot_id(robot_id) if isinstance(robot_id, str) else robot_id
try:
return _ENV_BUILDERS[rid](play=play, task_id=task_id, **kwargs)
except KeyError as exc:
raise KeyError(f"No WBC env builder for robot {rid!r}") from exc
[docs]
def make_wbc_rl_cfg(robot_id: str | RobotId = "g1") -> RslRlOnPolicyRunnerCfg:
"""Build the RSL-RL runner config for a registered robot."""
_ensure_builders()
rid = resolve_robot_id(robot_id) if isinstance(robot_id, str) else robot_id
try:
return _RL_BUILDERS[rid]()
except KeyError as exc:
raise KeyError(f"No WBC RL config for robot {rid!r}") from exc