导入机器人后更改 spring 常量会导致问题

Changing spring constants after importing robot causes issues

我必须 运行 优化模拟腿部的肌腱刚度。手动更改 spring 常量不会导致任何问题,并且物理模型似乎运行良好。当我尝试针对这些值进行优化时,问题就出现了。

由于这是一个优化问题,我必须 运行 模拟 1.5 秒,然后将机器人重置为初始状态,spring 常数略有不同。为此,我将机器人模型保存为 "Robot.wbo" 文件。在每次优化迭代结束时,我删除现有的机器人节点并使用 "def importMFNode" 创建一个新的机器人节点,这将创建处于初始状态的机器人。在每次新迭代开始时,我都会设置新的 spring 常量并设置这些常量会导致模型出现意外行为。我已将问题确定为这两行。

knee_spring_constant.setSFFloat(int(x[2]))
heel_spring_constant.setSFFloat(int(x[3]))

这两行所做的就是改变两个滑块关节的spring常量。如果我使用这两个命令执行此操作,则模型会失败。如果我手动执行,它会起作用。

模型没有表现正常,而是表现不稳定,不像它应该的那样。但是,如果我在主管代码导入机器人节点后立即手动创建一个新副本,并删除旧副本,机器人就会按预期运行。

我不确定为什么这不起作用,可能缺少 global physics reset

但可以肯定的是,您 unload/reload 机器人的方法很重,可以轻松简化。 有几种重置机器人的解决方案,它们更简单,因此可能会更好。

  1. 您可以 reset the robot position and its physics 在迭代结束时。在调用物理重置函数之前更改 spring 常量似乎是一个安全的想法。
  2. 您可以 reset the entire simulation 并更改 spring 常量。
  3. 您可以保留您的方法 as-is,但在加载它之前更改 Robot.wbo 中的 springs(使用基本模板引擎,简单的搜索和替换就可以完成这项工作).