Регистрация выходных портов с абстрактными значениями

#drake

Вопрос:

Я не могу найти абстрактно-значимую версию SignalLogger . Я писал пользовательские регистраторы для вывода абстрактных значений, такие как этот для ContactResults :

 class ContactResultsLogger(LeafSystem):
    def __init__(self, publish_period_seconds: float):
        super().__init__()
        self.DeclarePeriodicPublish(publish_period_seconds)
        self.contact_results_input_port = self.DeclareAbstractInputPort(
            'contact_results', AbstractValue.Make(ContactResults()))
        self.sample_times = []
        self.contact_results_list = []

    def DoPublish(self, context, event):
        super().DoPublish(context, event)
        self.sample_times.append(context.get_time())
        self.contact_results_list.append(
           copy.deepcopy(self.contact_results_input_port.Eval(context)))
 

Это работает, но наличие одного для каждого типа вывода с абстрактными значениями может быть утомительным. Есть ли лучший способ регистрировать результаты с абстрактными значениями? Спасибо!

Ответ №1:

В вашем примере кода , где вы говорите AbstractValue.Make(ContactResults()) , вместо этого вы могли бы сказать AbstractValue.Make(model_value) , где model_value находится новый, необходимый аргумент конструктора для этого класса.

Затем переименуйте класс во что-то подобное AbstractValueLogger и переименуйте contact_results_list его во что-то подобное values , и теперь у вас есть многоразовый регистратор, system = AbstractValueLogger(model_value=ContactResults()) .