首页 > 解决方案 > 导入机器人后更改弹簧常数会导致问题

问题描述

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

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

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

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

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

标签: pythonwebots

解决方案


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

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

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

推荐阅读