Использование DirectTranscription с VectorSystem - PullRequest
0 голосов
/ 29 апреля 2020

Я пытаюсь использовать методы 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?

1 Ответ

0 голосов
/ 30 апреля 2020

Вы должны добавить небольшой декоратор, чтобы он работал для автодиффазов. Пожалуйста, смотрите https://github.com/RussTedrake/underactuated/blob/c976d29192e185ab9aab6808bc608312bb39b8b6/underactuated/quadrotor2d.py#L14

...