将 DirectTranscription 与 VectorSystem 结合使用

Using DirectTranscription with a VectorSystem

我正在尝试对用户声明的 Vector 或 LeafSystem 使用 DirectTranscription / DirectCollocation 方法,但 运行 转换为 AutoDiffXd 时遇到问题。例如,下面的代码片段:

from pydrake.all import VectorSystem, DirectTranscription


class CustomVectorSystem(VectorSystem):
    def __init__(self):
        VectorSystem.__init__(self, 1, 1)
        self.DeclarePeriodicDiscreteUpdate(0.01)
        self.DeclareDiscreteState(1)

    def DoCalcVectorOutput(self, context, u, x, y):
        y.SetFromVector(x + u)

    def DoCalcVectorTimeDerivatives(self, context, u, x, x_dot):
        x_dot.SetFromVector(x + u)

    def DoCalcVectorDiscreteVariableUpdates(self, context, u, x, x_n):
        x_n.SetFromVector(x + u)


sys = CustomVectorSystem()
DirectTranscription(sys, sys.CreateDefaultContext(), 10) 

导致此错误:

Traceback (most recent call last):
  File "debugging.py", line 24, in <module>
    DirectTranscription(sys, sys.CreateDefaultContext(), 10)
RuntimeError: The object named [] of type drake::pydrake::(anonymous)::Impl<double>::PyVectorSystem does not support ToAutoDiffXd.

与 LeafSystem 类似。我尝试通过执行 VectorSystem_[AutoDiffXd] 来构建类型为 AutoDiffXd 的系统,但 DirectTranscription 似乎只接受浮点类型并尝试自行进行转换。

我发现的所有有效的 DirectTranscription 示例都使用 LinearSystem 或在 C++ 代码中定义动态的 Plant——我应该如何声明一个系统以便我可以 运行 DirectTranscription?

您必须添加一点装饰器才能使其适用于 autodiff。请参阅 https://github.com/RussTedrake/underactuated/blob/c976d29192e185ab9aab6808bc608312bb39b8b6/underactuated/quadrotor2d.py#L14