robot-descriptions / robot_descriptions.py

Access 90+ robot descriptions from the main Python robotics frameworks
Apache License 2.0
268 stars 17 forks source link

Error loading pinocchio model with a root joint #98

Closed fabinsch closed 2 months ago

fabinsch commented 2 months ago

Hi @stephane-caron,

I want to load the allegro hand as Pinocchio model and this work well if I do not specify a root joint. However, it fails as soon as I define any joint as argument root_joint in the load_robot_description function. Steps to reproduce

conda create --name allegro python=3.11 pinocchio robot_descriptions ipython
conda activate allegro

then start ipython and run

import pinocchio as pin
from robot_descriptions.loaders.pinocchio import load_robot_description

robot = load_robot_description('allegro_hand_description')
print(robot.model)
robot_w_ff = load_robot_description('allegro_hand_description', root_joint=pin.JointModelFreeFlyer)
print(robot_w_ff)

and you should get the error trace:

---------------------------------------------------------------------------
ArgumentError                             Traceback (most recent call last)
Cell In[2], line 6
      4 robot = load_robot_description('allegro_hand_description')
      5 print(robot.model)
----> 6 robot_w_ff = load_robot_description('allegro_hand_description', root_joint=pin.JointModelFreeFlyer)
      7 print(robot_w_ff)

File ~/workspace/robot_descriptions.py/robot_descriptions/loaders/pinocchio.py:56, in load_robot_description(description_name, root_joint, commit)
     54 if commit is not None:
     55     os.environ.pop("ROBOT_DESCRIPTION_COMMIT", None)
---> 56 robot = pin.RobotWrapper.BuildFromURDF(
     57     filename=module.URDF_PATH,
     58     package_dirs=get_package_dirs(module),
     59     root_joint=root_joint,
     60 )
     61 return robot

File ~/mambaforge/envs/allego/lib/python3.11/site-packages/pinocchio/robot_wrapper.py:18, in RobotWrapper.BuildFromURDF(filename, package_dirs, root_joint, verbose, meshLoader)
     13 @staticmethod
     14 def BuildFromURDF(
     15     filename, package_dirs=None, root_joint=None, verbose=False, meshLoader=None
     16 ):
     17     robot = RobotWrapper()
---> 18     robot.initFromURDF(filename, package_dirs, root_joint, verbose, meshLoader)
     19     return robot

File ~/mambaforge/envs/allego/lib/python3.11/site-packages/pinocchio/robot_wrapper.py:29, in RobotWrapper.initFromURDF(self, filename, package_dirs, root_joint, verbose, meshLoader)
     21 def initFromURDF(
     22     self,
     23     filename,
   (...)
     27     meshLoader=None,
     28 ):
---> 29     model, collision_model, visual_model = buildModelsFromUrdf(
     30         filename, package_dirs, root_joint, verbose, meshLoader
     31     )
     32     RobotWrapper.__init__(
     33         self,
     34         model=model,
     35         collision_model=collision_model,
     36         visual_model=visual_model,
     37     )

File ~/mambaforge/envs/allego/lib/python3.11/site-packages/pinocchio/shortcuts.py:43, in buildModelsFromUrdf(filename, package_dirs, root_joint, verbose, meshLoader, geometry_types)
     41     model = pin.buildModelFromUrdf(filename)
     42 else:
---> 43     model = pin.buildModelFromUrdf(filename, root_joint)
     45 if verbose and not WITH_HPP_FCL and meshLoader is not None:
     46     print(
     47         "Info: MeshLoader is ignored. Pinocchio has not been compiled with HPP-FCL."
     48     )

ArgumentError: Python argument types in
    pinocchio.pinocchio_pywrap_default.buildModelFromUrdf(str, Boost.Python.class)
did not match C++ signature:
    buildModelFromUrdf(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > urdf_filename, pinocchio::JointModelTpl<double, 0, pinocchio::JointCollectionDefaultTpl> root_joint, pinocchio::ModelTpl<double, 0, pinocchio::JointCollectionDefaultTpl> {lvalue} model)
    buildModelFromUrdf(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > urdf_filename, pinocchio::ModelTpl<double, 0, pinocchio::JointCollectionDefaultTpl> {lvalue} model)
    buildModelFromUrdf(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > urdf_filename)
    buildModelFromUrdf(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > urdf_filename, pinocchio::JointModelTpl<double, 0, pinocchio::JointCollectionDefaultTpl> root_joint)

I have tried it both with pinocchio=3.1.0 and pinocchio=2.7.1 from conda. Am I doing some wrong here? Or is it maybe an issue with the RobotWrapper @jorisv ?

Thanks for your help.

stephane-caron commented 2 months ago

Hi @fabinsch, if you instantiate the root_joint it should work:

robot_w_ff = load_robot_description('allegro_hand_description', root_joint=pin.JointModelFreeFlyer())

Here we follow the API of pin.RobotWrapper.BuildFromURDF where the root joint is an instantiated joint rather than the general class. I've run into this previously as well, allow me to convert this to a discussion so that it may help future travelers :wink:

fabinsch commented 2 months ago

Thanks a lot for the prompt answer. You are right; this works! :-)