Я пытаюсь использовать методы DirectTranscription / DirectCollocation с объявленным пользователем Vector или LeafSystem, но сталкиваюсь с проблемой приведения к 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. Я попытался собрать систему с типом AutoDiffXd, выполнив VectorSystem_ [AutoDiffXd], но DirectTranscription, похоже, принимает только типы с плавающей запятой и пытается выполнить преобразование самостоятельно.
Все рабочие примеры DirectTranscription, которые я обнаружил, используют либо LinearSystem, либо Plant, динамика которых определяется в коде C ++ - как мне объявить систему так, чтобы на ней можно было запускать DirectTranscription?