Changelog
v0.2.0 comes with significant improvements to usability, extensibility, and modularity. Read detailed changelogs below.
0.2.0 - 2026-06-12
Breaking changes and things to note
If you are upgrading an existing project from v0.1.0, read this section carefully — most other entries below are additive or transparent, but the items here will require code changes.
-
Sensor ownership refactor (#111). Sensor instantiation no longer lives in a single
get_core_sensorsgod-function. Tasks, robots, and policies now each register their own sensors through new contracts:Task._create_sensor_suite_from_configis now@abstractmethod.Robot.create_robot_sensors()andBasePolicy.create_policy_sensors()are new and return[]by default.BaseMujocoTask.__init__no longer accepts asensor_suiteargument.
Custom tasks/robots/policies that previously relied on
get_core_sensors' branching will need to override the new methods. -
PickAndPlaceTaskno longer emitsobj_end_pose(#111). The old sensor returned all-zeros for pick-and-place; downstream consumers were reading garbage. HDF5 episodes saved beforev0.2.0retain the field, new ones don't. -
PickAndPlaceTaskhard-assertsplace_receptacle_nameis set (#111). Previously the receptacle grasp sensor was silently skipped. -
TCPPoseSensorandRobotBasePoseSensornow raise on missing data (#111) instead of warning + returning zeros. The silent fallback was masking real bugs. -
BasePolicy.get_phase/get_all_phasesremoved (#111). They moved ontoPlannerPolicyas@abstractmethods.PlannerPolicyalso now requires aretry_count@property.AStarPlannerPolicyexposes a single"unknown"phase andpolicy_phase = 0. -
Grasp loading API replaced (#97). The following names are gone from
molmo_spaces.utils.grasp_sample; use the new modulemolmo_spaces.utils.grasps:has_grasp_folder→has_pickup_grasp_pathhas_joint_grasp_file→has_joint_grasp_pathload_grasps_for_object→load_pickup_graspsload_grasps_for_object_per_joint→load_joint_grasps
-
ResourceManagerAPI rework (#97). Removedarchives_for_paths,archives_with_number, andinstall_scenes. Useinstall_scene_from_source_index(when the index is missing) andinstall_scene_from_path(when the file is missing). -
Kinematics overhaul (#71). Per-robot kinematics modules (
franka_kinematics.py,bimanual_yam_kinematics.py,i2rt_yam_kinematics.py,rby1_kinematics.py,stretch_kinematics.py,parallel/franka_parallel_kinematics.py) were consolidated into a unified framework (MlSpacesKinematics+WarpKinematics+MujocoKinematics). TheMlSpacesKinematicsconstructor signature, the parallel-IK interface, and theSimpleMoveGroupabstraction all changed.jaxlieand the vestigial JAX cache were removed. -
Datagen output layout changed (#95). With multi-batch datagen, episode files now follow
trajectories_batch_<X>_of_<N>.h5. Default batch size is 4 episodes; even small runs go through this layout. -
FrankaFloatingRobotConfigremoved (#73). UseFloatingRUMRobotConfigor define a custom robot. -
RobotConfig.default_world_poseremoved (#91). -
Stretch robot dropped (#82).
pickup_stretch_task.pyandstretch_dex_view.pyare gone. They were nonfunctional and vestigial. -
Vestigial utilities removed (#93) in
molmo_spaces.utils:curobo_utils,lmdb_data,mesh_utils,mjthor_types,objaverse_utils,pointcloud_utils,randomization_utils,sampler_utils,scene_maps,state_buffer,teleop_utils,viewer_utils,visualization_utils,worker_utils, plus targeted cuts insideconstants/*,contact_utils,data_state_utils,editor_utils,futures_utils,misc_utils,mujoco_scene_utils, andprofiler_utils. -
Default asset bucket switched to Cloudflare R2 (
molmo_spaces_constants.py) (#110). New GCS-aware downloaders are available for USDa, Isaac, and ManiSkill assets. -
Curobo version bumped (#82). Reinstall the
curoboextra after upgrading. -
Python 3.11+ is required (unchanged, but worth re-stating since several new dependencies pin to it).
Bug fixes
Policies
- Unbreak
--policy teleop(Keyboard_Policy): hoist thepynputimport to module scope so the keyboard module is visible to handlers, add a no-opprepare_modelto satisfyInferencePolicy, and unwrap the per-batch obs list inobs_to_model_input(#70). - Repair
scripts/grasps/view_grasps.pyafter the grasp-API +ResourceManagerreworks; the iThor-scene viewer now launches end-to-end again (#103).
Robots
- Fix mobile Franka bugs: insertion path, holobase controller, and assorted prints replaced with
logging(#90, #91). - Fix RBY1 robot namespacing bugs and add guards on
specinsertion (#82, #90). - Fix RUM kinematics, RBY1 insertion, and RBY1 view (#71).
- Fix bug in lazy robot install that prevented on-demand downloads from succeeding cleanly (#83).
- Fix force limiting in
RobotConfig(#63).
Sensors
- Fix
CameraParameterSensor(#110). - Rate-limit
GraspPoseSensorwarnings to stop log spam (#63). - Better support for non-MlSpaces scenes in
MlSpacesCameraand surrounding sensors (#63). - Fix RBY1-specific sensor wiring after the sensor refactor (#111).
Custom assets / object manager
- Handle missing image features without crashing (#97).
- Fix articulated-grasp loading (#97).
- Fix geom logic from
visualtovisible(#97). None-metadata safeguards inObjectManager(#98).
Configuration / scenes
- Handle missing scene metadata when freezing config (#63).
- Better support for non-MlSpaces scenes in the data-generation pipeline (#63).
CI
- Free disk space on CI runners to stop spurious out-of-space failures (#88).
- Speed up CI by removing now-unnecessary manual asset installation (assets install lazily on first use) (#83).
Improvements
Sensors
- Sensor ownership distributed across tasks, robots, and policies;
get_core_sensorsis now just camera + generic env state + actions (#111). SensorSuitegainsaddandextendwith a duplicate-uuid assertion (#111).TCPPoseSensoraccepts agripper_mg_idso dual-arm robots can registertcp_pose_left/tcp_pose_right(#111).- Curobo policies (
CuroboOpenClosePlannerPolicy,CuroboPickAndPlacePlannerPolicy) readleaf_frame_to_worlddirectly off the gripper move group instead of round-tripping through the sensor suite (#111). - Removed dead code:
ActorStateSensor,ArticulationStateSensor, ~65 lines of commented-out classes insensors_cameras.py, ~100 lines of stub code inrby1.py(#111).
Robots
- Drastically reduced boilerplate across robot implementations and views (
bimanual_yam,floating_rum,franka,i2rt_yam,mobile_franka,rby1, plus all correspondingrobot_views) (#82). - Robot insertion refactored into a cleaner, more general code path (#76).
MlSpacesCameraupgrades andforce_limitingonRobotConfig(#63).initial_robot_base_poseadded to task config (#63).
Kinematics (#71)
- New unified
WarpKinematicsfor parallel IK on top of NVIDIA Warp. - New IK warmup, parallel-IK demo script (
scripts/kinematics/parallel_ik_demo.py), and interactive IK test script (scripts/kinematics/test_robot_ik.py). - New move-group locking API.
- Better
MujocoKinematics(cleaner FK and a redesignedSimpleMoveGroup). - 605-line unit-test suite for kinematics now runs in CI.
Policies and evaluation
- New
PolicyFactoryunifying policy instantiation; picklable for multiprocessing (#106). - Robot eval overrides re-added; now consumes the full experiment config rather than only the camera config (#110).
- Allow eval overrides to override depth as well (#110).
CI / build
- Lightweight unit tests added to CI; assets are downloaded on demand inside CI (#74, #83).
- Spurious CI failures from disk pressure resolved (#88).
Logging
- Print →
loggingmigration on hot mobile-franka paths (#90). - Log a clear warning when
renderis used before init (#54).
Documentation
- Major README cleanup, capitalization fixes, docs button (#86).
- Tutorials reorganized into a clearer top-level structure (#97).
- "Add a robot" tutorial expanded to cover datagen end-to-end (#85).
- New API docs pages for
configsanddata_generationsubmodules (#91). - New
docs/evaluation_lifecycle.mdwalking through the eval flow (#110). - MuJoCo EGL device-selection reference added (#81).
- README updated with arxiv paper link and an evaluation-section pointer (
d750f4c,3c50ae6). - License classifier removed in favor of the
licenseandlicense-fileskeys (99083b5).
Additions
Custom assets and scenes (#97)
- First-class support for user-registered asset libraries and grasp libraries — pickup grasps and joint grasps in object-local frames, with array-valued metadata.
- New
molmo_spaces.utils.graspsmodule with the canonical grasp-loading API (has_pickup_grasp_path,has_joint_grasp_path,load_pickup_grasps,load_joint_grasps). - Library-index generation scripts:
generate_user_asset_library_index.pyandgenerate_user_grasp_library_index.py. - New tutorial:
docs/tutorials/custom_assets.md. - New example:
examples/custom_assets/(scene XML, scene metadata, datagen entrypoint, sample red-block library). - Cached iThor lookups and lazy Objaverse traversal for faster dataset bring-up.
- Scenes can now carry occupancy maps (#99).
Custom robots (#76, #77, #82, #91)
- User-specified robot XMLs are first-class — no in-tree code changes required.
- Add-robot tutorial + xArm7 worked example (
examples/add_robot/xarm7.py,xarm7_view.py,xarm7_config.py). - New helper script:
find_gripper_finger_range.py. - Robots install lazily and on demand (
molmo_spaces_constants.py); manual asset-install steps are gone.
Sensors (#111)
- New default sensor wiring per robot:
FrankaRobot,MobileFrankaRobot,I2rtYamRobot,FloatingRUMRobotregisterTCPPoseSensor.BimanualYamRobotregisterstcp_pose_leftandtcp_pose_right.RBY1registersRBY1GraspStateSensorfor both arms.
PlannerPolicyautomatically registersPolicyPhaseSensorandPolicyNumRetriesSensor;BaseObjectManipulationPlannerPolicyregistersGraspPoseSensor.- New
PickupObjGoalPoseSensorreplacing the special-casedObjectEndPoseSensor. - New
docs/sensors.mdend-user reference.
Datagen (#95)
- Multi-batch datagen with
trajectories_batch_<X>_of_<N>.h5outputs (default 4 episodes per batch). - Easy multi-worker generation against a single house.
- Example config wired up for batched runs.
Format conversion and bulk download (#52)
scripts/data/format_conversion/mlspaces_to_lerobot.pyplus an example notebook for converting MolmoSpaces datasets to LeRobot format.scripts/data/bulk_download_mb_data.pyfor bulk-downloading dataset artifacts.
Policy
- New
PolicyFactoryAPI (#106).
Storage / distribution (#110)
- GCS-aware downloaders for USDa, Isaac, and ManiSkill assets.
- Default asset bucket switched to Cloudflare R2 in
molmo_spaces_constants.py.
Tutorials and docs
docs/tutorials/custom_assets.mddocs/sensors.mddocs/evaluation_lifecycle.md- Expanded
docs/tutorials/add_robot.md(datagen, base/EE-frame screenshots, xArm7 walk-through).