目标: 例如,对于 mujoco 环境(我正在使用 Metaworld)-“扫入”,我想这样做:
重置环境: 采取一些行动... sim_state = 保存当前状态 采取一些行动......
env.seed(0)
env.reset()
env.step() ... several times
sim_state = env.sim.get_state()
img = env.render('rgb_array')
env.step() ... several actions
然后: 重置环境
env.seed(0)
env.reset()
env.sim.set_state(sim_state)
img_loaded = env.render('rgb_array')
sim_state_loaded = env.sim.get_state()
我发现 sim_state_loaded 与
env.sim.get_state()
相同,但图像 (img != img_loaded) 不一样。
我只关心设置状态后获取图像。
我已经尝试通过预先设置种子来玩耍。
有些领域使用
env.set_state(qpos, qvel)
[不是 env.sim.set_state] 将返回相同的图像观察,但使用相同的 env 对象不会呈现有效的图像/状态等。
我不熟悉元世界,但原则上在将新值写入状态向量和调用渲染函数之间需要进行一些计算(例如,运动学)。如果
set_state
和 render
都没有调用这些函数,这将解释您遇到的故障模式。
尝试在调用
env.step
之前先调用 render
,如果这解决了问题,您就会知道缺少什么。如果调用 step
是不可接受的(例如,因为您不想推进模拟),请寻找一种方法来调用 mj_forward
与底层 mjModel
和 mjData
结构。