导入机器人后更改弹簧常数会导致问题



我必须对建模腿的肌腱刚度进行优化。 手动更改弹簧常数不会引起任何问题,物理模型似乎运行良好。当我尝试针对这些值进行优化时,问题就出现了。

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

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

这两条线所做的只是改变两个滑块接头的弹簧常数。如果我使用这两个命令执行此操作,则模型将失败。如果我手动执行,它可以工作。

模型不是正常行为,而是行为不规律,不像它应该的那样。但是,如果我在主管代码导入机器人节点后立即手动创建机器人节点的新副本,并删除旧副本,则机器人的行为将按预期运行。

我不确定为什么这不起作用,也许缺少全局物理重置。

但可以肯定的是,卸载/重新装载机器人的方法很繁重,可以轻松简化。 有几种解决方案可以重置机器人,这些解决方案更简单,因此可能会更好地工作。

  1. 您可以在迭代结束时重置机器人位置及其物理特性。在调用物理复位函数之前更改弹簧常数似乎是一个安全的想法。
  2. 您可以重置整个模拟并更改弹簧常数。
  3. 您可以保持方法不变,但在加载之前更改 Robot.wbo 中的弹簧(使用基本的模板引擎,简单的搜索和替换就可以完成这项工作)。

最新更新