#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())
.