Skip to content

[Bug]: unitree_g1.yml: cspace lists hand joints that are pruned from the kinematic tree, breaking benchmark/ik_benchmark.py on a clean install #706

Description

@believein5

Prerequisites

  • I have searched existing issues and discussions and could not find a duplicate.
  • I have read the relevant section of the documentation.
  • I can reproduce this on the latest main (or the most recent release).

Bug summary

Running the shipped benchmark/ik_benchmark.py on a fresh checkout of main
fails immediately on the first robot (unitree_g1.yml) with a cspace
validation error. Ten hand joints ({left,right}_hand_{thumb_0,thumb_1,thumb_2,middle_0,middle_1}_joint)
are listed under cspace.joint_names in unitree_g1.yml but are not on any
base_link → tool_frame chain, and the yml has no lock_joints section, so
the validator added in #678 rejects them. The other robots
(dual_ur10e.yml, franka.yml) in the benchmark are never reached.

Root cause: run_full_config_collision_free_ik sets
robot_file["kinematics"]["collision_link_names"] = None before the first
call. This is normalized to [] in kinematics_loader_cfg.py:168, so
_build_chain in kinematics_loader.py only walks the chains to the four
tool_frames of unitree_g1.yml
({right,left}_hand_index_1_link, {right,left}_ankle_roll_link).
The thumb/middle branches never enter self.joint_names, and the cspace
validator raises. Before #678 these dangling cspace joints were silently
ignored, so the benchmark used to work.

Steps to reproduce

git clone https://github.com/NVlabs/curobo.git
cd curobo
# install per docs/getting-started/installation.rst, then:
python benchmark/ik_benchmark.py

Expected behavior

The script iterates robot_list = ["unitree_g1.yml", "dual_ur10e.yml", "franka.yml"]
and writes curobo_ik.yml with IK benchmark timing / success stats for each robot.

Actual behavior / error output

running for robot:  unitree_g1.yml
unitree_g1.yml 100
[ERROR] [curobo] cspace contains joints that are not active in the configured tree and are not explicitly locked: ['left_hand_thumb_0_joint', 'left_hand_thumb_1_joint', 'left_hand_thumb_2_joint', 'left_hand_middle_0_joint', 'left_hand_middle_1_joint', 'right_hand_thumb_0_joint', 'right_hand_thumb_1_joint', 'right_hand_thumb_2_joint', 'right_hand_middle_0_joint', 'right_hand_middle_1_joint']
NoneType: None
Traceback (most recent call last):
  File "/home/.../curobo/benchmark/ik_benchmark.py", line 279, in <module>
    run_benchmark()
  File "/home/.../curobo/benchmark/ik_benchmark.py", line 216, in run_benchmark
    dt_cu_ik, succ, p_err, q_err = run_full_config_collision_free_ik(
  File "/home/.../curobo/benchmark/ik_benchmark.py", line 72, in run_full_config_collision_free_ik
    config = IKSolverCfg.create(
  File "/home/.../curobo/curobo/_src/solver/solver_ik_cfg.py", line 236, in create
    resolve_yaml_configs(
  File "/home/.../curobo/curobo/_src/solver/solver_core_cfg.py", line 233, in resolve_yaml_configs
    robot_config = RobotCfg.create(
  File "/home/.../curobo/curobo/_src/types/robot.py", line 88, in create
    data_dict["kinematics"] = KinematicsCfg.from_config(
  File "/home/.../curobo/curobo/_src/robot/kinematics/kinematics_cfg.py", line 227, in from_config
    generator = KinematicsLoader(config)
  File "/home/.../curobo/curobo/_src/robot/loader/kinematics_loader.py", line 66, in __init__
    self.initialize_tensors()
  File "/home/.../curobo/curobo/_src/robot/loader/kinematics_loader.py", line 130, in initialize_tensors
    self._append_lock_joint_state(self._get_validated_cspace_lock_joints())
  File "/home/.../curobo/curobo/_src/robot/loader/kinematics_loader.py", line 637, in _get_validated_cspace_lock_joints
    log_and_raise(
  File "/home/.../curobo/curobo/_src/util/logging.py", line 106, in log_and_raise
    raise exception_type(txt)
ValueError: cspace contains joints that are not active in the configured tree and are not explicitly locked: ['left_hand_thumb_0_joint', 'left_hand_thumb_1_joint', 'left_hand_thumb_2_joint', 'left_hand_middle_0_joint', 'left_hand_middle_1_joint', 'right_hand_thumb_0_joint', 'right_hand_thumb_1_joint', 'right_hand_thumb_2_joint', 'right_hand_middle_0_joint', 'right_hand_middle_1_joint']

cuRobo version + commit SHA

0.8.0.post1.dev42 8e734f3 (8e734f3, tip of origin/main)

Installation method

Source — CUDA 13 + PyTorch (uv pip install .[cu13-torch])

Kernel backend

cuda_core (default, runtime compilation)

Python version

3.11.15

PyTorch version (if installed)

2.9.1+cu128 torch.version.cuda = 12.8

GPU / driver / CUDA toolkit

GPU: NVIDIA GeForce RTX 4090 Driver: 595.84 (nvidia-smi reports CUDA Version: 13.2) nvcc: CUDA 13.0.88 (release 13.0, V13.0.88)

Operating system

Ubuntu 24.04.3 LTS (Noble Numbat), kernel 7.0.0-28-generic

Isaac Sim version (if applicable)

No response

Additional context

Bisected to commit ac5f931 ("add cspace validation to kinematics loader (#678)").
Before that commit the benchmark ran end-to-end; the new validator now
(correctly) flags a pre-existing inconsistency between ik_benchmark.py and
unitree_g1.yml.

Only robots whose cspace.joint_names includes joints that do not lie on
any base_link → tool_frame chain are affected. Under the shipped configs
that is only unitree_g1.ymlfranka.yml and dual_ur10e.yml are fine.

Two possible fixes:

  1. In benchmark/ik_benchmark.py::run_full_config_collision_free_ik, drop
    the robot_file["kinematics"]["collision_link_names"] = None override.
    self_collision_check=False and scene_model=None already skip runtime
    collision cost; leaving collision_link_names intact keeps the tree
    and cspace consistent. Smallest change.

  2. Alternatively, populate lock_joints in that same code path with the
    ten cspace-only hand joints so the validator accepts them.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions