Prerequisites
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.yml — franka.yml and dual_ur10e.yml are fine.
Two possible fixes:
-
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.
-
Alternatively, populate lock_joints in that same code path with the
ten cspace-only hand joints so the validator accepts them.
Prerequisites
main(or the most recent release).Bug summary
Running the shipped
benchmark/ik_benchmark.pyon a fresh checkout ofmainfails immediately on the first robot (
unitree_g1.yml) with a cspacevalidation error. Ten hand joints (
{left,right}_hand_{thumb_0,thumb_1,thumb_2,middle_0,middle_1}_joint)are listed under
cspace.joint_namesinunitree_g1.ymlbut are not on anybase_link → tool_framechain, and the yml has nolock_jointssection, sothe 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_iksetsrobot_file["kinematics"]["collision_link_names"] = Nonebefore the firstcall. This is normalized to
[]inkinematics_loader_cfg.py:168, so_build_chaininkinematics_loader.pyonly walks the chains to the fourtool_framesofunitree_g1.yml(
{right,left}_hand_index_1_link,{right,left}_ankle_roll_link).The thumb/middle branches never enter
self.joint_names, and the cspacevalidator raises. Before #678 these dangling cspace joints were silently
ignored, so the benchmark used to work.
Steps to reproduce
Expected behavior
The script iterates
robot_list = ["unitree_g1.yml", "dual_ur10e.yml", "franka.yml"]and writes
curobo_ik.ymlwith IK benchmark timing / success stats for each robot.Actual behavior / error output
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.pyandunitree_g1.yml.Only robots whose
cspace.joint_namesincludes joints that do not lie onany
base_link → tool_framechain are affected. Under the shipped configsthat is only
unitree_g1.yml—franka.ymlanddual_ur10e.ymlare fine.Two possible fixes:
In
benchmark/ik_benchmark.py::run_full_config_collision_free_ik, dropthe
robot_file["kinematics"]["collision_link_names"] = Noneoverride.self_collision_check=Falseandscene_model=Nonealready skip runtimecollision cost; leaving
collision_link_namesintact keeps the treeand cspace consistent. Smallest change.
Alternatively, populate
lock_jointsin that same code path with theten cspace-only hand joints so the validator accepts them.