评估联系信息时出现递归错误
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
,而不是 context
:plant.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 问题也在评论中链接。
我正在尝试访问工厂的联系信息,方法是在 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
,而不是 context
:plant.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 问题也在评论中链接。