Переопределение динамики для систем, которые являются привязками C ++ - PullRequest
0 голосов
/ 30 апреля 2020

Я пытаюсь загрузить систему, а затем переопределить ее динамику, чтобы классы, такие как Симулятор, использовали новую динамику. Это просто для систем, объявленных в python, но, похоже, не работает для систем, которые являются привязками C ++ - например, пример ниже:

from pydrake.all import DirectCollocation, Simulator, VectorSystem
from pydrake.examples.pendulum import PendulumPlant

import numpy as np


class CustomVectorSystem(VectorSystem):
    def __init__(self):
        VectorSystem.__init__(self, 1, 0)
        self.DeclareContinuousState(2)

    def DoCalcVectorTimeDerivatives(self, context, u, x, x_dot):
        x_dot[0] += u


class OverwrittenVectorSystem(CustomVectorSystem):
    def __init__(self):
        CustomVectorSystem.__init__(self)

    def DoCalcVectorTimeDerivatives(self, context, u, x, x_dot):
        x_dot = np.zeros_like(x_dot)


class OverwrittenPendulumPlant(PendulumPlant):
    def __init__(self):
        PendulumPlant.__init__(self)

    def DoCalcTimeDerivatives(self, context, derivatives):
        derivatives = np.zeros_like(derivatives)


def run_sim_step(sys, t=0.1):
    context = sys.CreateDefaultContext()
    simulator = Simulator(sys)
    context = simulator.get_mutable_context()
    context.SetContinuousState([0, 1])
    context.FixInputPort(index=0, data=[1.0])
    simulator.AdvanceTo(t)
    return context.get_continuous_state_vector().get_value()


vector_sys = CustomVectorSystem()
overwritten_vector_sys = OverwrittenVectorSystem()

print(
    "CustomVectorSystem results are {}, and {} for overwrite".format(
        run_sim_step(vector_sys), run_sim_step(overwritten_vector_sys)
    )
)

pendulum = PendulumPlant()
overwritten_pendulum = OverwrittenPendulumPlant()

print(
    "PendulumPlant results are {}, and {} for overwrite".format(
        run_sim_step(pendulum), run_sim_step(overwritten_pendulum)
    )
)

возвращает следующее:

CustomVectorSystem results are [1.4075 1.    ], and [0. 1.] for overwrite
PendulumPlant results are [0.11427129 1.24633296], and [0.11427129 1.24633296] for overwrite

И также для дискретных систем. Есть ли способ получить новый метод для переопределения динамики в этом случае?

1 Ответ

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

Это поведение, которое я ожидал - системы C ++, которые допускают перегрузку, имеют некоторые специальные «батутные» логики c в слое pybind11. Но это также не рабочий процесс, который я ожидал. Вы на самом деле пытаетесь использовать PendulumPlant или какой-то другой базовый класс? Действительно ли намного хуже перегрузить из VectorSystem?

Обратите внимание, что даже в C ++ PendulumPlant помечен final, и мы не ожидали, что пользователи получат от него. (Я не думаю, что это имеет какое-то отношение к вашему коду; я просто упоминаю это как еще одно доказательство нашего дизайнерского мышления).

...