记录抽象值输出端口

Logging abstract-valued output ports

我找不到 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)))

这可行,但是为每种类型的抽象值输出设置一个可能会很乏味。有没有更好的方法来记录抽象值输出?谢谢!

在您说 AbstractValue.Make(ContactResults()) 的示例代码中,您可以说 AbstractValue.Make(model_value),其中 model_value 是此 class 的一个新的必需构造函数参数。

然后,将 class 重命名为 AbstractValueLogger 并将 contact_results_list 重命名为 values,现在你有一个可重复使用的记录器,system = AbstractValueLogger(model_value=ContactResults()).