Skip to content

Upgrade genesis-world from 1.0.x to 1.2.x - #241

Merged
KraHsu merged 5 commits into
mainfrom
dev/genesis-1.2
Jul 3, 2026
Merged

Upgrade genesis-world from 1.0.x to 1.2.x#241
KraHsu merged 5 commits into
mainfrom
dev/genesis-1.2

Conversation

@KraHsu

@KraHsu KraHsu commented Jul 3, 2026

Copy link
Copy Markdown
Owner

Summary

Lifts the genesis-world pin from >=1.0.0,<1.1.0 to >=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_FPSrefresh_rate / realtime_factor: Genesis split the one knob into a repaint cap and a wall-clock sim pacer (default realtime_factor=1.0 paces a viewer-enabled sim to real time). SimulationCfg.render_fps maps to refresh_rate; render_fps=None keeps its documented "uncapped" meaning by disabling the pacer. Example ViewerOptions(...) constructions move off the deprecated alias (it now raises when combined with refresh_rate).
  • ImGui panel host lookup: reads the new public viewer.plugins property (Genesis renamed the private _viewer_plugins it duck-typed against); legacy attribute kept as a fallback.
  • wuji deploy joint order: Genesis 1.2 parses kinematic trees depth-first, so the hand articulation now enumerates finger-major. POLICY_JOINT_NAMES stays 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

  • Relative-frame pose accessors (the 1.1.2 breaking change: get_pos/set_pos etc. 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_pos agree with build placement, which 1.0.x subtly didn't.
  • Joint/link enumeration: GeneLab resolves joints/links by name everywhere (_articulation_binder, sensors, terrain), so depth-first ordering is internally consistent.
  • RigidOptions knobs GeneLab exposes are all still valid (the removed hibernation_thresh_acc was never exposed).

⚠️ Checkpoint compatibility

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 errors
  • Full uv run pytest on genesis 1.2.0 — 917 collected, all green (one pre-existing-style skip set: onnxruntime/zmq extras absent)
  • The one real regression the suite caught (test_policy_joint_order_matches_env) is the depth-first ordering change, addressed above

🤖 Generated with Claude Code

KraHsu added 5 commits July 3, 2026 18:06
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
KraHsu merged commit 4fc693a into main Jul 3, 2026
4 checks passed
@KraHsu
KraHsu deleted the dev/genesis-1.2 branch July 3, 2026 11:02
KraHsu added a commit that referenced this pull request Jul 10, 2026
Upgrade genesis-world from 1.0.x to 1.2.x
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant