在 ForceElement 的子类上调用 super().__init__() 会导致未定义构造函数

Calling super().__init__() on subclass of ForceElement causes No constructor defined

我正在尝试创建自定义 ForceElement,如下所示

class FrontWheelForce(ForceElement):
    def __init__(self, plant):
        front_wheel = plant.GetBodyByName("front_wheel")
        front_wheel_node_index = front_wheel.index()
        pdb.set_trace()
        ForceElement.__init__(self, front_wheel.model_instance())

但是在ForceElement.__init__(self, front_wheel.model_instance())

行得到如下错误
TypeError: FrontWheelForce: No constructor defined!

您没有向我们展示 parent 的定义。

我有点惊讶你没有看到这个诊断:

TypeError: object.__init__() takes exactly one argument (the instance to initialize)

我想你正在使用的框架提高了 "no constructor" 提醒您还有更多代码要实现 在使用 parent class.

之前

请查看 hereForceElement 文档; "ForceElement allows modeling state and time dependent forces in a MultibodyTree model"。也就是说,作为车轮扭矩函数的力元素不能建模为 ForceElement。我相信您想要的是 FrontWheelSystem,即 LeafSystem,它输出您想要建模的力。您可以通过任一执行器将模型的外力应用于植物 连接到 get_actuation_input_port(),或作为连接到 get_applied_spatial_force_input_port().

的外部施加的空间力

将几条评论总结成正确答案

作者:ekhumoro

The error message suggests the ForceElement class does not support subclassing. That is, the python bindings for drake do not wrap the __init__ method for this class - so presumably ForceElement.__init__ will raise an AttributeError.

作者:埃里克·库西诺

this (ForceElement) is not written as a trampoline class, which is necessary for pybind11 to permit Python-subclassing of a bound C++ class

参考: pybind11 docs, ForceElementbinding