Changelog#
Upcoming version (not yet released)#
Breaking API changes
randomize_fieldno longer exists. Replace calls with typed functions from the newdrmodule (e.g.dr.geom_friction,dr.body_mass).EventTermCfgno longer acceptsdomain_randomization. The@requires_model_fieldsdecorator on eachdrfunction takes care of field expansion automatically.
Added#
Cloud training support via SkyPilot and Lambda Cloud, with documentation covering setup, monitoring, and cost management.
W&B hyperparameter sweep scripts that distribute one agent per GPU across a multi-GPU instance.
Contributing guide with documentation for shared Claude Code commands (
/update-mjwarp,/commit-push-pr).Added optional
ViewerConfig.fovyand apply it in native viewer camera setup when provided.New
drmodule (mjlab.envs.mdp.dr) replacingrandomize_fieldwith typed per-field domain randomization functions. Each function automatically recomputes derived fields viaset_const. Highlights:Camera and light randomization:
dr.cam_fovy,dr.cam_pos,dr.cam_quat,dr.cam_intrinsic,dr.light_pos,dr.light_dir. Camera and light names are now supported inSceneEntityCfg(camera_names/light_names).dr.pseudo_inertiafor physics-consistent randomization ofbody_mass,body_ipos,body_inertia, andbody_iquatvia the pseudo-inertia matrix parameterization (Rucker & Wensing 2022). Replaces the removeddr.body_inertia/dr.body_iquat.dr.geom_sizewith automatic recomputation ofgeom_rboundandgeom_aabbfor broadphase consistency.dr.tendon_armatureanddr.tendon_frictionloss.dr.body_quat,dr.geom_quat, anddr.site_quatwith RPY perturbation composed onto the default quaternion.Extensible
OperationandDistributiontypes. Users can define custom operations and distributions as class instances and pass them anywhere a string is accepted. Built-in instances (dr.abs,dr.scale,dr.add,dr.uniform,dr.log_uniform,dr.gaussian) are exported from thedrmodule.dr.mat_rgbafor per-world material color randomization. Tints the texture color, useful for randomizing appearance of textured surfaces. Material names are now supported inSceneEntityCfg(material_names).Fixed
dr.effort_limitsdrifting on repeated randomization.Fixed
dr.body_com_offsetnot triggeringset_const.
yam_lift_cube_vision_env_cfgnow randomizes cube color (dr.geom_rgba) on every reset whencam_type="rgb".The native viewer now reflects per-world DR changes to visual model fields on each reset. Geom appearance, body and site poses, camera parameters, and light positions are all synced from the GPU model before rendering. Inertia boxes (press
I) and camera frustums (pressQ) update correctly when the corresponding fields are randomized. See Domain Randomization for viewer-specific caveats.MaterialCfg.geom_names_exprfor assigning materials to geoms by name pattern duringedit_spec.TerrainEntityCfgnow exposestextures,materials, andlightsas configurable fields (previously hardcoded). Settextures=(),materials=()to use flatdr.geom_rgbainstead of the default checker texture.DebugVisualizernow supports ellipsoid visualization viaadd_ellipsoid.Viewer single-step mode: press RIGHT arrow (native) or click “Step” (Viser) to advance exactly one physics step while paused.
Viewer error recovery: exceptions during stepping now pause the viewer and log the traceback instead of crashing the process.
Native viewer runs forward kinematics while paused, keeping perturbation visuals accurate.
Viewer speed multipliers use clean power-of-2 fractions (1/32x to 1x).
Visualizers display the realtime factor alongside FPS.
joint_torques_l2now respectsSceneEntityCfg.actuator_ids, allowing penalization of a subset of actuators instead of all of them (#703). Contribution by @saikishor.Terrain is now a proper
Entitysubclass (TerrainEntity). This allows domain randomization functions to target terrain parameters (friction, cameras, lights) viaSceneEntityCfg("terrain", ...).TerrainImporter/TerrainImporterCfgremain as aliases but will be deprecated in a future version.Added
upload_modeloption toRslRlBaseRunnerCfgto control W&B model file uploads (.ptand.onnx) while keeping metric logging enabled (#654).
Changed#
Self collision and illegal contact sensors now use
history_lengthto catch contacts across decimation substeps. Reward and termination functions readforce_historywith a configurableforce_threshold.Replaced the single
scaleparameter inDifferentialIKActionCfgwith separatedelta_pos_scaleanddelta_ori_scalefor independent scaling of position and orientation components.Improved offscreen multi environment framing by selecting neighboring environments around the focused env instead of first N envs.
Tuned tracking task viewer defaults for tighter camera framing.
Disabled shadow casting on the G1 tracking light to avoid duplicate stacked shadows when robots are close.
Fixed#
Fixed viewer physics loop starving the renderer by replacing the single sim-time budget with a two-clock design (tracked vs actual sim time). Physics now self-corrects after overshooting, keeping FPS smooth at all speed multipliers.
Bundled
ffmpegformediapyviaimageio-ffmpeg, removing the requirement for a systemffmpeginstall. Thanks to @rdeits-bd for the suggestion.Fixed
height_scanreturning ~0 for missed rays; now defaults tomax_distance. Replacedclip=(-1, 1)withscalenormalization in the velocity task config. Thanks to @eufrizz for reporting and the initial fix (#642).Fixed ghost mesh visualization for fixed-base entities by extending
DebugVisualizer.add_ghost_meshto optionally acceptmocap_posandmocap_quat(#645).Fixed viser viewer crashing on scenes with no mocap bodies by adding an
nmocapguard, matching the native viewer behavior.Fixed offscreen rendering artifacts in large vectorized scenes by applying a render local extent override in
OffscreenRendererand restoring the original extent on close.Fixed
RslRlVecEnvWrapper.unwrappedto return the base environment, ensuring checkpoint state restore and logging work correctly when wrappers such asVideoRecorderare enabled.
Version 1.1.1 (February 14, 2026)#
Added#
Added reward term visualization to the native viewer (toggle with
P) (#629).Added
DifferentialIKActionfor task-space control via damped least-squares IK. Supports weighted position/orientation tracking, soft joint-limit avoidance, and null-space posture regularization. Includes an interactive viser demo (scripts/demos/differential_ik.py) (#632).
Fixed#
Fixed
play.pydefaulting to the base rsl-rlOnPolicyRunnerinstead ofMjlabOnPolicyRunner, which caused aTypeErrorfrom an unexpectedcnn_cfgkeyword argument (#626). Contribution by @griffinaddison.
Changed#
Removed
body_mass,body_inertia,body_pos, andbody_quatfromFIELD_SPECSin domain randomization. These fields have derived quantities that requireset_constto recompute; without that call, randomizing them silently breaks physics (#631).Replaced
moviepywithmediapyfor video recording.mediapyhandles cloud storage paths (GCS, S3) natively (#637).
Version 1.1.0 (February 12, 2026)#
Added#
Added RGB and depth camera sensors and BVH-accelerated raycasting (#597).
Added
MetricsManagerfor logging custom metrics during training (#596).
Added many new terrains including
HfDiscreteObstaclesTerrainCfg,HfPerlinNoiseTerrainCfg,BoxSteppingStonesTerrainCfg,BoxNarrowBeamsTerrainCfg,BoxRandomStairsTerrainCfg, and more. Added flat patch sampling for heightfield terrains (#542, #581).Added site group visualization to the Viser viewer (Geoms and Sites tabs unified into a single Groups tab) (#551).
Added
env_idsparameter toEntity.write_ctrl_to_sim(#567).
Changed#
Upgraded
rsl-rl-libto 4.0.0 and replaced the custom ONNX exporter with rsl-rl’s built-inas_onnx()(#589, #595).sim.forward()is now called unconditionally after the decimation loop. See When do I need to call sim.forward()? for details (#591).Unnamed freejoints are now automatically named to prevent
KeyErrorduring entity init (#545).
Fixed#
Fixed
randomize_pd_gainscrash withnum_envs > 1(#564).Fixed
ctrl_idsindex error with multiple actuated entities (#573). Reported by @bwrooney82.Fixed Viser viewer rendering textured robots as gray (#544).
Fixed Viser plane rendering ignoring MuJoCo size parameter (#540).
Fixed
HfDiscreteObstaclesTerrainCfgspawn height (#552).Fixed
RaycastSensorvisualization ignoring the all-envs toggle (#607). Contribution by @oxkitsune.
Version 1.0.0 (January 28, 2026)#
Initial release of mjlab.