python - 导入机器人后更改弹簧常数会导致问题
问题描述
我必须对模型腿的肌腱刚度进行优化。手动更改弹簧常数不会导致任何问题,并且物理模型似乎运行良好。当我尝试针对这些值进行优化时,问题就出现了。
由于这是一个优化问题,我必须运行模拟 1.5 秒,然后将机器人重置为其初始状态,弹簧常数略有不同。为此,我将机器人模型保存为“Robot.wbo”文件。在每次优化迭代结束时,我删除现有的机器人节点并使用“def importMFNode”创建一个新的机器人节点,从而创建处于初始状态的机器人。在每次新迭代开始时,我会设置新的弹簧常数,设置这些会导致模型出现意外行为。我已将问题归结为这两行。
knee_spring_constant.setSFFloat(int(x[2]))
heel_spring_constant.setSFFloat(int(x[3]))
这两条线所做的就是改变两个滑块接头的弹簧常数。如果我使用这两个命令执行此操作,模型将失败。如果我手动操作,它可以工作。
而不是模型表现正常,它只是表现不规律而不像它应该的那样。但是,如果我在主管代码导入机器人节点后立即手动制作它的新副本,并删除旧的,机器人会按预期运行。
解决方案
我不确定为什么这不起作用,也许缺少全局物理重置。
但是可以肯定的是,您卸载/重新加载机器人的方法很繁重,并且可以轻松简化。有几种解决方案可以重置机器人,它们更简单,因此可能会更好地工作。
- 您可以在迭代结束时重置机器人位置及其物理特性。在调用物理复位函数之前更改弹簧常数似乎是一个安全的想法。
- 您可以重置整个模拟并更改弹簧常数。
- 您可以保持方法不变,但在加载之前更改 Robot.wbo 中的弹簧(使用基本模板引擎,简单的搜索和替换就可以完成这项工作)。
推荐阅读
- azure - Windows 虚拟桌面:自动启动和解除分配专用 VM
- sql - 为什么我使用以下代码收到语法错误
- docker-compose - docker.compose 或 CMD 命令
- c++ - 通过推回 2D 向量导致的分段错误
- jquery - jQueryUI自动完成在没有匹配时在下拉列表中显示“其他”并让用户能够选择它
- sql - 在 SQL 中的单行中列出多个列
- mongodb - 另一个领域的流星天文触发验证错误
- url - JMeter: How can I capture the variable value which is dynamic in url?
- python - 仅在 python 中将日期格式更改为其各自的月份和年份
- android - 如何在 R8 混淆后使用回溯获取正确的行号?