Add G1 velocity tasks on the 29-DoF asset Unitree ships today - #7471
Add G1 velocity tasks on the 29-DoF asset Unitree ships today#7471Double7sBurger wants to merge 13 commits into
Conversation
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.
Greptile SummaryAdds flat- and rough-terrain velocity tasks for the current 29-DoF Unitree G1 asset.
Confidence Score: 4/5The 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
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
Reviews (1): Last reviewed commit: "Add G1 velocity tasks on the 29-DoF asse..." | Re-trigger Greptile |
| 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. |
There was a problem hiding this comment.
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!
There was a problem hiding this comment.
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_CFGsymbol 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 loadsg1.usdwithout 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`` |
There was a problem hiding this comment.
🟡 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.
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.
Description
Adds
Isaac-Velocity-Rough-G1-29DofandIsaac-Velocity-Flat-G1-29Dof: the existing G1 velocitytasks, on the 29-DoF G1 asset NVIDIA ships today (
Isaac/Robots/Unitree/G1/g1.usd) instead of thesuperseded 37-joint
g1_minimal.usd. The existingIsaac-Velocity-*-G1tasks are untouched.Three of the four things the asset change forces are mechanical:
torso_jointbecomeswaist_yaw_joint,elbow_pitch/elbow_rollbecomeelbow/wrist_roll, and the three-finger hand becomes a Dex3, so every reward that spells ajoint 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.
superseded robot; the old height buries the feet in the ground plane.
nconmax/njmax10/95 -> 70/200 on the flat task. The old numbers were sized forg1_minimal.usd's three colliders; this asset carries four spheres per foot alone, and theobservation 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_rateends 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.usdhid this by having nothing to reston. 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_CFGis separate from the existingG1_29DOF_CFG(same USD): that one is forlocomanipulation — contact sensors off, fixed-base-capable, rotated root, different gains.
Type of change
Release backport
developChecklist
pre-commitchecks with./isaaclab.sh --formatsource/<pkg>/changelog.d/for every touched packageCONTRIBUTORS.mdor my name already exists there