Source code for wbc_mjlab.presets.se_actor
"""State-estimation actor observation preset.
SE tasks drop height/gravity reference proxies and add anchor pose tracking error
(world position + axis-angle orientation error) plus ``base_lin_vel``.
"""
from __future__ import annotations
from mjlab.envs import ManagerBasedRlEnvCfg
from mjlab.envs.mdp import builtin_sensor
from mjlab.managers.observation_manager import ObservationTermCfg
from mjlab.utils.noise import UniformNoiseCfg as Unoise
from wbc_mjlab.env.mdp.observations import (
motion_anchor_ori_error,
motion_anchor_pos_error_w,
)
_MOTION = "motion"
_MOTION_PARAMS = {"command_name": _MOTION}
_SE_REMOVED_TERMS = (
"ref_base_height",
"ref_gravity_b",
"projected_gravity",
)
# Anchor (``MotionCommand.anchor_*`` vs ``robot_anchor_*``), not pelvis root — matches
# tracking rewards/terminations; ``base_lin_vel`` remains root-frame IMU velocity.
_SE_ADDED_TERMS: dict[str, ObservationTermCfg] = {
"motion_anchor_pos_error_w": ObservationTermCfg(
func=motion_anchor_pos_error_w,
params=_MOTION_PARAMS,
noise=Unoise(n_min=-0.1, n_max=0.1),
),
"motion_anchor_ori_error": ObservationTermCfg(
func=motion_anchor_ori_error,
params=_MOTION_PARAMS,
noise=Unoise(n_min=-0.02, n_max=0.02),
),
"base_lin_vel": ObservationTermCfg(
func=builtin_sensor,
params={"sensor_name": ""},
noise=Unoise(n_min=-0.2, n_max=0.2),
),
}
[docs]
def apply_se_actor(cfg: ManagerBasedRlEnvCfg) -> None:
"""State-estimation actor layout: drop height/gravity proxies; add anchor pose error + base lin vel."""
actor = cfg.observations["actor"]
for key in _SE_REMOVED_TERMS:
actor.terms.pop(key, None)
actor.terms.update(_SE_ADDED_TERMS)