Upgrade genesis-world from 1.0.x to 1.2.x - #241
Merged
Merged
Conversation
Lift the 1.0.x cap now that the code is adapted for the 1.1/1.2 API changes. Keep an upper bound at the next minor: Genesis has changed APIs GeneLab relies on in both 1.1.x and 1.2.x, so each minor gets validated before the pin moves.
Genesis 1.1+ split ViewerOptions.max_FPS into refresh_rate (repaint cap) and realtime_factor (sim pacing, 1.0 = wall clock by default). Map SimulationCfg.render_fps onto refresh_rate, and honor the documented render_fps=None "uncapped" contract by disabling the real-time pacer instead. Direct ViewerOptions constructions in the examples move off the deprecated max_FPS alias, which now raises when combined with refresh_rate. The ImGui panel host lookup reads the public viewer.plugins property (Genesis 1.2 renamed the private _viewer_plugins attribute it used to duck-type against), keeping the old attribute as a fallback.
Genesis 1.2 parses kinematic trees depth-first, so the hand's live articulation now enumerates finger-major — identical to the encoder order — while the shipped checkpoint keeps the joint-major layout it was trained with under 1.0.x. POLICY_JOINT_NAMES tracks the trained artifact, not the live env, so the drift guard now pins the env's depth-first enumeration instead of equating the two orders; a policy retrained under 1.2 needs ENC_TO_POLICY updated to the identity.
Update the installation matrix and record the upgrade in the changelog, including the checkpoint-compatibility caveat from the depth-first kinematic tree parsing.
Genesis 1.2 as the simulator floor: viewer options and plugin lookup adapted upstream-side, depth-first joint enumeration pinned in the wuji deploy guard. Minor bump because 1.0.x-trained checkpoints on branched robots are index-incompatible with the new enumeration.
KraHsu
added a commit
that referenced
this pull request
Jul 10, 2026
Upgrade genesis-world from 1.0.x to 1.2.x
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Lifts the
genesis-worldpin from>=1.0.0,<1.1.0to>=1.2.0,<1.3.0(the 1.0.x cap was a hotfix, #240) and adapts GeneLab to the 1.1/1.2 API changes. The upper bound stays at the next minor since Genesis has broken APIs in both 1.1.x and 1.2.x.The upgrade was driven by a source-level diff of the two releases (verified against the extracted 1.2.0 wheel), a repo-wide audit of every
gs.*touchpoint, and the full test suite on 1.2.0.Code adaptations
ViewerOptions.max_FPS→refresh_rate/realtime_factor: Genesis split the one knob into a repaint cap and a wall-clock sim pacer (defaultrealtime_factor=1.0paces a viewer-enabled sim to real time).SimulationCfg.render_fpsmaps torefresh_rate;render_fps=Nonekeeps its documented "uncapped" meaning by disabling the pacer. ExampleViewerOptions(...)constructions move off the deprecated alias (it now raises when combined withrefresh_rate).viewer.pluginsproperty (Genesis renamed the private_viewer_pluginsit duck-typed against); legacy attribute kept as a fallback.POLICY_JOINT_NAMESstays the trained artifact's joint-major order; the drift-guard test now pins the env's depth-first enumeration instead of equating the two.Reviewed, intentionally unchanged
get_pos/set_posetc. default to the user frame, offsets/inertial alignment stripped): robots (is_robot) have identity offsets, so articulation state, sensors, and the deformable-terrain foot reads are numerically unchanged. Free-base rigid objects (wuji reorient cube) read and write through the same accessors, so the new defaults are self-consistent — and make reset-to-init_posagree with build placement, which 1.0.x subtly didn't._articulation_binder, sensors, terrain), so depth-first ordering is internally consistent.RigidOptionsknobs GeneLab exposes are all still valid (the removedhibernation_thresh_accwas never exposed).Policies trained under genesis 1.0.x on branched robots (quadrupeds, humanoids, hands) have obs/action layouts baked in breadth-first order and are index-incompatible with 1.2.0 envs — retrain or remap. Benchmark reference runs recorded under 1.0.x are likewise not comparable (contact islands are now on by default). Recorded in the CHANGELOG.
Test plan
uv run ruff check/uv run ruff format --check/uv run lint-imports(8 contracts kept)uv run pyright— 0 errorsuv run pyteston genesis 1.2.0 — 917 collected, all green (one pre-existing-style skip set: onnxruntime/zmq extras absent)test_policy_joint_order_matches_env) is the depth-first ordering change, addressed above🤖 Generated with Claude Code