Класс BodyFrame несовместим как аргумент конструктора для DifferentialInverseKinematicsIntegrator

#drake

#drake

Вопрос:

Я использую pydrake с urdf HSR от Toyota.

Я хочу использовать класс DifferentialInverseKinematicsIntegrator.

Когда я попытался инициализировать решатель, я передал класс BodyFrame в качестве параметра frame конструктора.

Выдает следующую ошибку несовместимости

 TypeError: __init__(): incompatible constructor arguments. The following argument types are supported:
    1. pydrake.manipulation.planner.DifferentialInverseKinematicsIntegrator(robot: pydrake.multibody.plant.MultibodyPlant_[float], frame_E: pydrake.multibody.tree.Frame_[float], time_step: float, parameters: pydrake.manipulation.planner.DifferentialInverseKinematicsParameters, robot_context: pydrake.systems.framework.Context_[float] = None, log_only_when_result_state_changes: bool = True)

Invoked with: <pydrake.multibody.plant.MultibodyPlant_[float] object at 0x7f0633be88b0>, <BodyFrame_[float] name='hand_palm_link' index=31 model_instance=2>, <pydrake.manipulation.planner.DifferentialInverseKinematicsParameters object at 0x7f0633be8630>, 0.01, <pydrake.systems.framework.LeafContext_[float] object at 0x7f0633be84b0>, True
 

Как я приобрел BodyFrame:

 gripper = plant.GetBodyByName('hand_palm_link')
gripper_frame = gripper.body_frame()
 

и gripper_frame был передан в конструктор в качестве frame_E: drake::multibody::Frame<double> аргумента, указанного в документе python.

Насколько я понимаю, BodyFrame является дочерним классом класса Frame, поскольку вы можете получить BodyFrame из объекта Frame.

примечание: результат тот же, когда я использовал plant.GetFrameByName('hand_palm_link')

Я искал документ и не смог найти способ расширить класс BodyFrame в класс Frame

Это также может быть pydrake.systems.framework.LeafContext_[float] несоответствие, pydrake.systems.framework.Context_[float] но я уже тестировал с контекстом по умолчанию, и ошибка сохранялась.

Кто-нибудь сталкивался с этой проблемой раньше? Я недостаточно хорошо разбираюсь в drake, чтобы знать, как получить объект фрейма, связанный напрямую с определенной ссылкой. Любая помощь очень ценится. 🙂

Ответ №1:

При беглом взгляде (так что я могу ошибаться) он выглядит time_step и params передается в неправильном порядке. Попробуйте поменять их местами?