This file distills interface differences from local documentation comparisons. It takes precedence over scattered rule-of-thumb migration notes.
mjlab:
mjlab/docs/source/migration_isaac_lab.rstmjlab/docs/source/environment_config.rstmjlab/docs/source/scene.rstmjlab/docs/source/training/rsl_rl.rstmjlab/docs/source/api/envs.rstmjlab/docs/source/api/managers.rstmjlab/docs/source/api/tasks.rst
IsaacLab:
IsaacLab/docs/source/tutorials/03_envs/create_manager_rl_env.rstIsaacLab/docs/source/tutorials/03_envs/register_rl_env_gym.rstIsaacLab/docs/source/tutorials/02_scene/create_scene.rstIsaacLab/docs/source/api/lab/isaaclab.envs.rstIsaacLab/docs/source/api/lab/isaaclab.scene.rstIsaacLab/docs/source/setup/quickstart.rst
- IsaacLab:
- Runtime environment class:
ManagerBasedRLEnv - Config class:
ManagerBasedRLEnvCfg
- Runtime environment class:
- mjlab:
- Runtime environment class:
ManagerBasedRlEnv - Config class:
ManagerBasedRlEnvCfg
- Runtime environment class:
Migration note: rename RLEnv -> RlEnv everywhere.
- IsaacLab: commonly uses nested
@configclassdefinitions (for exampleRewardsCfg,ObservationsCfg). - mjlab: injects manager dictionaries directly into
ManagerBasedRlEnvCfg:observations: dict[str, ObservationGroupCfg]actions: dict[str, ActionTermCfg]rewards: dict[str, RewardTermCfg]terminations/events/commands/curriculum/metricsare also dictionaries.
Migration note: all managers must become dict[str, XxxTermCfg]; do not keep manager @configclass definitions.
- IsaacLab: clones scenes with
InteractiveSceneCfg+prim_path+ENV_REGEX_NS. - mjlab: uses
SceneCfg+entities/sensors, with no USDprim_pathsystem.- During scene composition, entities are automatically prefixed with namespaces (for example
robot/base_link).
- During scene composition, entities are automatically prefixed with namespaces (for example
Migration note: remove prim_path / USD scene-graph thinking completely and switch to MuJoCo scene composition.
- IsaacLab:
isaaclab.sensors.ContactSensorCfg(bound to the prim hierarchy). - mjlab: prefer
mjlab.utils.spec_config.ContactSensorCfg(recommended by the official migration page), though project wrappers such asmjlab.sensor.ContactSensorCfgmay also appear.
Migration note: contact sensors are typically attached to the robot config (for example replace(robot_cfg, sensors=(sensor,))).
- IsaacLab:
gym.register(...)+gym.make(...)is the mainstream tutorial path. - mjlab: registers tasks with
register_mjlab_task(...), wheretask_idbindsenv_cfg/play_env_cfg/rl_cfg/runner_cls.
Migration note: prefer register_mjlab_task; do not hardcode tasks by editing upstream mjlab source.
- IsaacLab: commonly uses
isaaclab.sh -p scripts/..., launched through a gym task id. - mjlab: commonly uses
uv run train <TaskId>/uv run play <TaskId>.- The CLI uses
tyrofor config overrides, with hyphenated flags (for example--num-envs). - Boolean arguments require explicit
True/False.
- The CLI uses
Migration note: move the original training entrypoint into mjlab's train/play command flow.
Frequently used ManagerBasedRlEnvCfg fields that are easy to miss during IsaacLab migration:
is_finite_horizonscale_rewards_by_dt(rewards are scaled bystep_dtby default)metricsmanager (dictionary)- default
eventsoften includereset_scene_to_default
Migration note: make these field semantics explicit during migration; do not migrate only rewards / obs / actions.
- IsaacLab projects often include
omni.*/isaacsim.*extension and UI scaffolding. - mjlab migrations do not need that scaffolding by default.
Migration note: files such as ui_extension_example.py and config/extension.toml are usually not kept unless the user explicitly asks for them.
- If the source project has no fallback branch, do not add one.
- Fallback behavior must match the source logic one-for-one; do not add extra "safety code".
- Keep original comments and TODOs; only make minimal terminology substitutions for mjlab.
- Explicitly reject compatibility layers: do not add compat / adapter / shim bridge code.
- Do not add
raise/assertstatements that do not exist in the source project.
- The migration target is a native mjlab implementation, not preserving IsaacLab code shape.
- Internal implementation changes caused by interface differences are allowed.
- The success criterion is not "does the code look the same", but "are the final function and behavior equivalent".
- If implementation differs, record the differences and the equivalence rationale in the migration notes.
- First use this file as an interface-level checklist, then start rewriting code.
- After each manager rewrite, immediately verify that the final injected type is a dictionary.
- After each scene / sensor rewrite, immediately check for leftover
prim_path/ENV_REGEX_NS/omni.references. - After completion, run the full verification in
references/checklist.md.