Skip to content

v0.2.0

Latest

Choose a tag to compare

@abhaybd abhaybd released this 12 Jun 21:43
fb49aef

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_sensors god-function. Tasks, robots, and policies now each register their own sensors through new contracts:

    • Task._create_sensor_suite_from_config is now @abstractmethod.
    • Robot.create_robot_sensors() and BasePolicy.create_policy_sensors() are new and return [] by default.
    • BaseMujocoTask.__init__ no longer accepts a sensor_suite argument.

    Custom tasks/robots/policies that previously relied on get_core_sensors' branching will need to override the new methods.

  • PickAndPlaceTask no longer emits obj_end_pose (#111). The old sensor returned all-zeros for pick-and-place; downstream consumers were reading garbage. HDF5 episodes saved before v0.2.0 retain the field, new ones don't.

  • PickAndPlaceTask hard-asserts place_receptacle_name is set (#111). Previously the receptacle grasp sensor was silently skipped.

  • TCPPoseSensor and RobotBasePoseSensor now raise on missing data (#111) instead of warning + returning zeros. The silent fallback was masking real bugs.

  • BasePolicy.get_phase / get_all_phases removed (#111). They moved onto PlannerPolicy as @abstractmethods. PlannerPolicy also now requires a retry_count @property. AStarPlannerPolicy exposes a single "unknown" phase and policy_phase = 0.

  • Grasp loading API replaced (#97). The following names are gone from molmo_spaces.utils.grasp_sample; use the new module molmo_spaces.utils.grasps:

    • has_grasp_folderhas_pickup_grasp_path
    • has_joint_grasp_filehas_joint_grasp_path
    • load_grasps_for_objectload_pickup_grasps
    • load_grasps_for_object_per_jointload_joint_grasps
  • ResourceManager API rework (#97). Removed archives_for_paths, archives_with_number, and install_scenes. Use install_scene_from_source_index (when the index is missing) and install_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). The MlSpacesKinematics constructor signature, the parallel-IK interface, and the SimpleMoveGroup abstraction all changed. jaxlie and 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.

  • FrankaFloatingRobotConfig removed (#73). Use FloatingRUMRobotConfig or define a custom robot.

  • RobotConfig.default_world_pose removed (#91).

  • Stretch robot dropped (#82). pickup_stretch_task.py and stretch_dex_view.py are 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 inside constants/*, contact_utils, data_state_utils, editor_utils, futures_utils, misc_utils, mujoco_scene_utils, and profiler_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 curobo extra 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 the pynput import to module scope so the keyboard module is visible to handlers, add a no-op prepare_model to satisfy InferencePolicy, and unwrap the per-batch obs list in obs_to_model_input (#70).
  • Repair scripts/grasps/view_grasps.py after the grasp-API + ResourceManager reworks; 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 spec insertion (#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 GraspPoseSensor warnings to stop log spam (#63).
  • Better support for non-MlSpaces scenes in MlSpacesCamera and 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 visual to visible (#97).
  • None-metadata safeguards in ObjectManager (#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_sensors is now just camera + generic env state + actions (#111).
  • SensorSuite gains add and extend with a duplicate-uuid assertion (#111).
  • TCPPoseSensor accepts a gripper_mg_id so dual-arm robots can register tcp_pose_left / tcp_pose_right (#111).
  • Curobo policies (CuroboOpenClosePlannerPolicy, CuroboPickAndPlacePlannerPolicy) read leaf_frame_to_world directly 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 in sensors_cameras.py, ~100 lines of stub code in rby1.py (#111).

Robots

  • Drastically reduced boilerplate across robot implementations and views (bimanual_yam, floating_rum, franka, i2rt_yam, mobile_franka, rby1, plus all corresponding robot_views) (#82).
  • Robot insertion refactored into a cleaner, more general code path (#76).
  • MlSpacesCamera upgrades and force_limiting on RobotConfig (#63).
  • initial_robot_base_pose added to task config (#63).

Kinematics (#71)

  • New unified WarpKinematics for 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 redesigned SimpleMoveGroup).
  • 605-line unit-test suite for kinematics now runs in CI.

Policies and evaluation

  • New PolicyFactory unifying 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 → logging migration on hot mobile-franka paths (#90).
  • Log a clear warning when render is 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 configs and data_generation submodules (#91).
  • New docs/evaluation_lifecycle.md walking 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 license and license-files keys (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.grasps module 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.py and generate_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, FloatingRUMRobot register TCPPoseSensor.
    • BimanualYamRobot registers tcp_pose_left and tcp_pose_right.
    • RBY1 registers RBY1GraspStateSensor for both arms.
  • PlannerPolicy automatically registers PolicyPhaseSensor and PolicyNumRetriesSensor; BaseObjectManipulationPlannerPolicy registers GraspPoseSensor.
  • New PickupObjGoalPoseSensor replacing the special-cased ObjectEndPoseSensor.
  • New docs/sensors.md end-user reference.

Datagen (#95)

  • Multi-batch datagen with trajectories_batch_<X>_of_<N>.h5 outputs (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.py plus an example notebook for converting MolmoSpaces datasets to LeRobot format.
  • scripts/data/bulk_download_mb_data.py for bulk-downloading dataset artifacts.

Policy

  • New PolicyFactory API (#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.md
  • docs/sensors.md
  • docs/evaluation_lifecycle.md
  • Expanded docs/tutorials/add_robot.md (datagen, base/EE-frame screenshots, xArm7 walk-through).