Skip to content

Add G1 velocity tasks on the 29-DoF asset Unitree ships today - #7471

Draft
Double7sBurger wants to merge 13 commits into
isaac-sim:developfrom
Double7sBurger:feat/g1-29dof-velocity-tasks
Draft

Add G1 velocity tasks on the 29-DoF asset Unitree ships today#7471
Double7sBurger wants to merge 13 commits into
isaac-sim:developfrom
Double7sBurger:feat/g1-29dof-velocity-tasks

Conversation

@Double7sBurger

Copy link
Copy Markdown

Description

Adds Isaac-Velocity-Rough-G1-29Dof and Isaac-Velocity-Flat-G1-29Dof: the existing G1 velocity
tasks, on the 29-DoF G1 asset NVIDIA ships today (Isaac/Robots/Unitree/G1/g1.usd) instead of the
superseded 37-joint g1_minimal.usd. The existing Isaac-Velocity-*-G1 tasks are untouched.

Three of the four things the asset change forces are mechanical:

  • Joint names move. torso_joint becomes waist_yaw_joint, elbow_pitch/elbow_roll become
    elbow/wrist_roll, and the three-finger hand becomes a Dex3, so every reward that spells a
    joint name is retargeted. Body names are unchanged, so the height scanner, the base-contact
    termination and the base-mass/external-force events need no adjustment.
  • Spawn height 0.74 -> 0.793 m. Pelvis-to-ankle is 0.7429 m here against 0.6865 m on the
    superseded robot; the old height buries the feet in the ground plane.
  • nconmax/njmax 10/95 -> 70/200 on the flat task. The old numbers were sized for
    g1_minimal.usd's three colliders; this asset carries four spheres per foot alone, and the
    observation goes NaN a few hundred iterations in rather than failing at startup.

The fourth is not. The velocity task's only termination is torso contact, which on this asset never
fires: the robot rests weight on its pelvis and knee colliders, keeps the torso clear, and rides out
the full episode in a crouch that tracks almost no velocity. Measured on flat ground over 1500
iterations, success_rate ends at 0.010. Adding a base-height termination takes it to 1.000,
as does deleting the extra colliders; a 30-degree tilt termination does not help (0.385), because
the torso stays vertical while the robot sinks. g1_minimal.usd hid this by having nothing to rest
on. On rough terrain the height is measured against the height scanner rather than world z — the
stock world-frame term ends 89% of episodes for standing in a dip.

G1_29DOF_VELOCITY_CFG is separate from the existing G1_29DOF_CFG (same USD): that one is for
locomanipulation — contact sensors off, fixed-base-capable, rotated root, different gains.

Type of change

  • New feature (non-breaking change which adds functionality)

Release backport

  • Backport this pull request to the active release branch after it merges into develop

Checklist

  • I have read and understood the contribution guidelines
  • I have run the pre-commit checks with ./isaaclab.sh --format
  • I have made corresponding changes to the documentation
  • My changes generate no new warnings
  • I have added tests that prove my fix is effective or that my feature works
  • I have added a changelog fragment under source/<pkg>/changelog.d/ for every touched package
  • I have added my name to the CONTRIBUTORS.md or my name already exists there

Isaac-Velocity-Rough-G1-29Dof and Isaac-Velocity-Flat-G1-29Dof mirror the existing
G1 velocity tasks on the current robot description instead of the superseded
37-joint one. The existing tasks are untouched.

Four things the asset change forces, three of them mechanical:

Joint names move -- torso_joint becomes waist_yaw_joint, elbow_pitch/elbow_roll
become elbow/wrist_roll, and the three-finger hand becomes a Dex3 -- so every
reward that spells a joint name is retargeted. The robot spawns at 0.793 m rather
than 0.74 because pelvis-to-ankle is 5.6 cm longer. The flat task's nconmax and
njmax, sized for g1_minimal.usd's three colliders, go from 10/95 to 70/200; this
asset carries four spheres per foot alone, and the observation otherwise goes NaN
a few hundred iterations in.

The fourth is not mechanical. The velocity task's only termination is torso
contact, which on this asset never fires: the robot rests weight on its pelvis and
knee colliders, keeps the torso clear, and rides out the full episode in a crouch
that tracks almost no velocity. Measured on flat ground over 1500 iterations,
success_rate ends at 0.010. Adding a base-height termination takes it to 1.000, as
does deleting the extra colliders; a 30-degree tilt termination does not help at
all (0.385) because the torso stays vertical while the robot sinks. g1_minimal.usd
hid this for years by carrying three colliders in total, leaving nothing to rest
on. Rough terrain measures the height against the height scanner rather than world
z -- the stock world-frame term ends 89% of episodes for standing in a dip.
@Double7sBurger
Double7sBurger requested a review from a team September 1, 2026 09:30
@github-actions github-actions Bot added documentation Improvements or additions to documentation asset New asset feature or request labels Sep 1, 2026
@greptile-apps

greptile-apps Bot commented Sep 1, 2026

Copy link
Copy Markdown
Contributor

Greptile Summary

Adds flat- and rough-terrain velocity tasks for the current 29-DoF Unitree G1 asset.

  • Defines a velocity-specific G1 articulation configuration with updated joint mappings, initialization, actuators, and contact sensors.
  • Registers flat and rough Gymnasium task variants and retargets joint-dependent rewards.
  • Adds terrain-relative and flat-ground pelvis-height terminations, plus larger MJWarp contact limits for the flat task.
  • Updates generated environment-browser metadata, public type stubs, and changelog fragments.

Confidence Score: 4/5

The PR appears safe to merge after correcting the non-blocking contradictory collision benchmark in the asset configuration documentation.

The task registrations, joint mappings, learner dimensions, physics override pattern, and height terminations are consistent with existing contracts; only the new configuration docstring gives mutually inconsistent accounts of the tested collider setup.

Files Needing Attention: source/isaaclab_assets/isaaclab_assets/robots/unitree.py

Important Files Changed

Filename Overview
source/isaaclab_assets/isaaclab_assets/robots/unitree.py Adds the velocity-specific 29-DoF G1 articulation; its collision-performance docstring contains a contradictory benchmark description.
source/isaaclab_tasks/isaaclab_tasks/core/velocity/config/g1/rough_29dof_env_cfg.py Retargets joint-specific rewards and adds a terrain-relative pelvis-clearance termination using the inherited height scanner.
source/isaaclab_tasks/isaaclab_tasks/core/velocity/config/g1/flat_29dof_env_cfg.py Selects the new articulation, increases MJWarp contact capacities, retargets rewards, and adds a flat-ground height termination.
source/isaaclab_tasks/isaaclab_tasks/core/velocity/config/g1/init.py Registers unique flat and rough 29-DoF Gymnasium task IDs with valid configuration and dynamic learner entry points.

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart LR
  Registry[Gym task registration] --> Flat[G129DofFlatEnvCfg]
  Registry --> Rough[G129DofRoughEnvCfg]
  Flat --> Asset[G1_29DOF_VELOCITY_CFG]
  Rough --> Asset
  Flat --> FlatHeight[World-frame pelvis height termination]
  Rough --> Scanner[Height scanner]
  Scanner --> TerrainHeight[Terrain-relative pelvis clearance]
  Flat --> Rewards[29-DoF reward joint mappings]
  Rough --> Rewards
Loading

Reviews (1): Last reviewed commit: "Add G1 velocity tasks on the 29-DoF asse..." | Re-trigger Greptile

Comment on lines +507 to +513
gait survives the full episode: measured on flat ground, ``success_rate`` 0.010 against 1.000 with
a height term added.

Trimming the collision set is not an optimization. Measured on ``Isaac-Velocity-Flat-G1-29Dof``
with Newton MJWarp, 4096 environments, seed 42, 1500 iterations: ``Metrics/success_rate`` ends at
0.010 with every authored collider active and 0.995 with this configuration, because the extra
colliders stop the robot from lifting its feet.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Clarify contradictory collider benchmark

The docstring contrasts “every authored collider active” with “this configuration” and assigns them different success rates, but this configuration does not remove or filter colliders. This makes it unclear which collider setup produced the stated 0.995 result and can mislead maintainers about the configuration's behavior.

Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!

@isaaclab-review-bot isaaclab-review-bot Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Isaac Lab Review Bot

Adds two 29-DoF G1 velocity tasks with a dedicated articulation configuration, retargeted rewards, height-based terminations, updated registrations, documentation, and release metadata. One public configuration docstring materially misdescribes the collider behavior and should be corrected.

  • Design and architecture: The new flat and rough configurations derive from the existing G1 velocity tasks while replacing the robot asset and retargeting joint-specific rewards. The existing G1 tasks remain unchanged, and no supported architecture issue is established by the shared agent configuration references.
  • API: The new G1_29DOF_VELOCITY_CFG symbol is exported consistently and the task IDs are registered and documented. However, its public docstring claims a performance result “with this configuration” from trimming colliders even though the configuration loads g1.usd without trimming them, contradicting the surrounding explanation that those colliders remain active.
  • Implementation: The patch provides asset-specific spawn height, actuator mappings, reward retargeting, MJWarp limits, and flat/terrain-relative height terminations. The concrete issue is the inaccurate collider-trimming paragraph in G1_29DOF_VELOCITY_CFG; it should be removed or rewritten to describe the configuration’s actual behavior.

Minor fixes needed. Posted 1 actionable finding inline.

Automated review; human maintainers own approval decisions.

gait survives the full episode: measured on flat ground, ``success_rate`` 0.010 against 1.000 with
a height term added.

Trimming the collision set is not an optimization. Measured on ``Isaac-Velocity-Flat-G1-29Dof``

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Warning · Api — Docstring claims collider trimming config does not do

The spawn config points at g1.usd with no collision-property overrides, so "0.010 with every authored collider active and 0.995 with this configuration" describes two identical collision sets and contradicts the paragraph six lines above, which states the asset keeps pelvis/knee/waist/wrist colliders and therefore needs a height termination. Remove or restate this paragraph so the published docstring matches the configuration's actual behavior.

@Double7sBurger
Double7sBurger marked this pull request as draft September 1, 2026 09:54
The default task inherits G1_CFG's blanket ceilings -- 300 for the legs, 300 for the
arms, 20 for the feet -- and on rough terrain it ends 3000 iterations with
success_rate 0.000. The failure is turning, not walking: error_vel_xy settles at
0.31 against a 0.5 threshold while error_vel_yaw sits at 1.06 against 0.4. Turning
loads the ankle, and 20 N*m is a quarter of what the MJCF says the joint delivers.

-RealAnkle changes the ankle alone, so the ankle can be confirmed or ruled out
without moving nine numbers at once. -RealTorque takes every ceiling from the MJCF,
matching the sim-to-real DR29 task that reaches success_rate 0.993 on this asset.
The shipped 29-DoF G1 scores 0.000 on the stock rough velocity task where the
superseded 37-joint asset scores 1.000. A single-variable run attributed most of
that to the feet, but the remaining differences -- colliders, leg joint limits,
link masses, joint origins -- were never separated.

make_g1_ladder.py generates cumulative USD override layers that walk the shipped
asset towards the old one, reading every value out of the two stages so the
layers cannot drift from the assets. Composing the top rung and diffing it
against the old asset leaves the limits, masses and origins sections empty.

rough_29dof_wbc_env_cfg.py carries WBC-AGILE's reward and termination set onto
the shipped asset with its collision set untouched, to test whether that project's
result comes from its rewards rather than from its robot.
Fixing the shipped G1's feet takes the rough velocity task from 0.000 to
0.87-0.94, but every such policy splays its legs: joint_deviation_hip runs
-0.18 to -0.21 against the old asset's -0.017. An asset ladder ruled the asset
out -- matching leg limits, masses and joint origins changed nothing, and rung
a6, which pins shut the six degrees of freedom the old robot lacks, made it
slightly worse.

What was never held fixed is the task: the old asset's reference arm runs the
stock rough task, the shipped-asset arms run the 29-DoF one, which adds a
base-height termination. The three configs here separate those -- drop the
termination, give the old asset the termination, and price hip deviation the
way WBC-AGILE does.
The ankle fix walks in short shuffling steps. feet_air_time_positive_biped
returns the single-stance duration clamped at its 0.4 s threshold, so the term
saturates at 0.1 per step under the stock weight of 0.25 -- and that policy earns
0.0052, about five per cent of what is on offer. The term is live; the policy is
not paid enough to lengthen its stride. Two weights, 4x and 8x the stock one, to
bracket it rather than guess.
The L2 hip penalty removes the splay -- joint_deviation_hip goes from -0.215 to
-0.019 and success_rate rises from 0.911 to 0.953 -- but that arm still runs the
stock feet_air_time weight of 0.25 and still shuffles, at 0.0086 against the 0.4 s
the term can pay for. On the shipped asset's spheres, raising the weight took
success from 0.701 to 0.966; these three carry that onto the plate-foot asset at
4x, 8x and 16x, since a sole plate has more to push against and the useful range
may run higher than the spheres'.
Raising feet_air_time fixes the shuffle and produces a limp. The term rewards
the duration of the current single-stance phase, takes the minimum over the two
feet and clamps at its threshold; nothing in it distinguishes left from right or
asks the feet to alternate, so standing on one leg and holding the other up sits
at the clamp. Measured with scripts/foot_symmetry.py, the airborne-share ratio
between the feet falls from 0.677 at weight 0.25 to 0.393 at 2.0 and 0.196 at
4.0, where the right foot spends 87% of the rollout off the ground.

feet_stance_imbalance prices that directly, as the absolute difference between
the feet's last completed swing durations. Three weights bracket it, and five
air-time weights fill in the range between the two arms already measured.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

asset New asset feature or request documentation Improvements or additions to documentation

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant