评估联系信息时出现递归错误

Recursion Error while evaluating contact information

我正在尝试访问工厂的联系信息,方法是在 this 评论后声明 AbstractInputPort

self.DeclareAbstractInputPort('contact_force', AbstractValue.Make(ContactResults()))

然后我尝试使用

从声明的输入端口 (2) 访问实际联系信息
contact_info = self.EvalAbstractInput(context, 2).get_value()

但是,每当我尝试模拟系统时,我都会得到 RecursionError: maximum recursion depth exceeded

知道出了什么问题吗?


编辑

尝试在模拟循环外评估方法,

contact_info = plant.get_contact_results_output_port().Eval(plant_context)

returns 使用

查询第 i^th 个接触力时的预期结果
contact_info.point_pair_contact_info(i).contact_force()

我的模拟设置需要计算模拟过程中每个瞬间的接触力。我有一个自定义 system,它有一个如上所述声明的抽象输入端口。然后连接输入端口以获得联系结果,

builder.Connect(plant.get_contact_results_output_port(), my_system.get_input_port(2))

现在,在尝试使用 get_value() 提取 my_system 内的值时,出现递归错误。

我用来获取联系结果的端口是否正确?或者有其他方法可以在模拟过程中获得接触结果吗?

我 运行 您链接的代码。

box_example.py

在 运行 之前,其中有一堆错误需要修复,很明显您 运行 正在使用旧版本的 drake(仍在导入来自 attic ,它已被长期删除)。也许新版本会给你更好的错误信息?

旧版本中可能更神秘的一个变化是您使用错误的上下文调用 SetPositions。我已将其更改为使用 plant_context,而不是 contextplant.SetPositions(plant_context, object_instance, [0, 0, 0, 1, 0, 0, 0])。通过该修复(以及 fixing/updating 导入),该文件 运行 对我来说没问题。

perception.py

实际上没有任何运行可用代码。所以我不确定我应该在那里看到什么。

为清楚起见,将评论中提供的解决方案作为答案发布。

如前所述,接触力是模拟的输入,是“直接馈通”,形成代数环(查看 this 获取 Matlab 参考)。

解决方案是按照建议简单地添加一个ZeroOrderHold

zoh = builder.AddSystem(ZeroOrderHold(time_step, AbstractValue.Make(ContactResults())))
builder.Connect(plant.get_contact_results_output_port(), zoh.get_input_port())
builder.Connect(zoh.get_output_port(), my_system.get_input_port())

相应的 GitHub 问题也在评论中链接。