ami-iit / adam

adam implements a collection of algorithms for calculating rigid-body dynamics in Jax, CasADi, PyTorch, and Numpy.
https://adam-docs.readthedocs.io/en/latest/
BSD 3-Clause "New" or "Revised" License
123 stars 19 forks source link

Error detecting two root links #82

Closed richardrl closed 3 months ago

richardrl commented 3 months ago

Hi, I got this bug:

 File "/samsung4tb/BiDex-touch/bidex_collect/utils/hand_retargeter.py", line 49, in __init__
    kinDyn = KinDynComputations(os.path.join(CUR_PATH, "../../bidex_sim/assets/robots/ur_description/urdf/ur3e_leap_right.urdf"),
  File "/samsung4tb/venvs/isaacgym_venv/lib/python3.8/site-packages/adam/jax/computations.py", line 34, in __init__
    model = Model.build(factory=factory, joints_name_list=joints_name_list)
  File "/samsung4tb/venvs/isaacgym_venv/lib/python3.8/site-packages/adam/model/model.py", line 63, in build
    tree = Tree.build_tree(links=links_list, joints=joints_list)
  File "/samsung4tb/venvs/isaacgym_venv/lib/python3.8/site-packages/adam/model/tree.py", line 72, in build_tree
    raise ValueError("The model has more than one root link")
ValueError: The model has more than one root link

Loading the attached URDF erroneously says there are two root links (base_link and palm_lower) even though using check_urdf from ROS confirms there is only one. ur3e_leap_right.zip

traversaro commented 3 months ago

fyi @Giulero I can confirm that also iDynTree's URDF parser is able to load the URDF that @richardrl provided with no error, i.e. :


D:\ur3e_leap_right> conda create -n idyntree idyntree
D:\ur3e_leap_right> conda activate idyntree
(idyntree) D:\ur3e_leap_right>idyntree-model-info -m ./ur3e_leap_right.urdf --print
Model:
  Links:
    [0] base_link
    [1] shoulder_link
    [2] upper_arm_link
    [3] forearm_link
    [4] wrist_1_link
    [5] wrist_2_link
    [6] wrist_3_link
    [7] flange
    [8] tool0
    [9] wrist_axis
    [10] palm_lower
    [11] mcp_joint
    [12] mcp_joint_2
    [13] mcp_joint_3
    [14] pip_4
    [15] thumb_pip
    [16] thumb_dip
    [17] thumb_fingertip
    [18] pip_3
    [19] dip_3
    [20] fingertip_3
    [21] pip_2
    [22] dip_2
    [23] fingertip_2
    [24] pip
    [25] dip
    [26] fingertip
  Frames:
    [27] mcp_joint_root --> mcp_joint
    [28] mcp_joint_2_root --> mcp_joint_2
    [29] mcp_joint_3_root --> mcp_joint_3
    [30] thumb_fingertip_tip --> thumb_fingertip
    [31] fingertip_3_tip --> fingertip_3
    [32] fingertip_2_tip --> fingertip_2
    [33] fingertip_tip --> fingertip
  Joints:
    [0] shoulder_pan_joint (dofs: 1) : base_link<-->shoulder_link
    [1] shoulder_lift_joint (dofs: 1) : shoulder_link<-->upper_arm_link
    [2] elbow_joint (dofs: 1) : upper_arm_link<-->forearm_link
    [3] wrist_1_joint (dofs: 1) : forearm_link<-->wrist_1_link
    [4] wrist_2_joint (dofs: 1) : wrist_1_link<-->wrist_2_link
    [5] wrist_3_joint (dofs: 1) : wrist_2_link<-->wrist_3_link
    [6] 1 (dofs: 1) : palm_lower<-->mcp_joint
    [7] 5 (dofs: 1) : palm_lower<-->mcp_joint_2
    [8] 9 (dofs: 1) : palm_lower<-->mcp_joint_3
    [9] 12 (dofs: 1) : palm_lower<-->pip_4
    [10] 13 (dofs: 1) : pip_4<-->thumb_pip
    [11] 14 (dofs: 1) : thumb_pip<-->thumb_dip
    [12] 15 (dofs: 1) : thumb_dip<-->thumb_fingertip
    [13] 8 (dofs: 1) : mcp_joint_3<-->pip_3
    [14] 10 (dofs: 1) : pip_3<-->dip_3
    [15] 11 (dofs: 1) : dip_3<-->fingertip_3
    [16] 4 (dofs: 1) : mcp_joint_2<-->pip_2
    [17] 6 (dofs: 1) : pip_2<-->dip_2
    [18] 7 (dofs: 1) : dip_2<-->fingertip_2
    [19] 0 (dofs: 1) : mcp_joint<-->pip
    [20] 2 (dofs: 1) : pip<-->dip
    [21] 3 (dofs: 1) : dip<-->fingertip
    [22] wrist_3-flange (dofs: 0) : wrist_3_link<-->flange
    [23] flange-tool0 (dofs: 0) : flange<-->tool0
    [24] hand_joint (dofs: 0) : tool0<-->wrist_axis
    [25] wrist_joint (dofs: 0) : wrist_axis<-->palm_lower