OpenAI 宣布开源一个高性能的 Python 库,它可用于使用 MuJoCo 引擎(在上年的机器人研究中开发出来)的机器人模拟。
该库是 OpenAI 用于深度学习机器人研究的核心工具之一,现在将其作为 mujoco-py(Python 3 的 MuJoCo 绑定)的主要版本发布。mujoco-py 1.50.1.0 有着大量的新能力,性能也获得显著提升。新功能有:
- 高效处理并行模拟
- GPU 加速的自动 3D 渲染
- 直接获取 MuJoCo 函数和数据结构
- 支持所有的 MuJoCo 1.50 功能,比如改进的 contact solver
批量模拟
轨迹(trajectory)优化和强化学习中的很多方法得益于能够并行运行多个模拟。mujoco-py 通过 OpenMP 使用数据并行,以及通过 Cython 和 NumPy 使用直接访问的内存管理,从而使批量模拟更有效。
新版本 MjSimPool 接口的单纯使用相比于旧版本有一个 400% 的提速,并且在一个已优化和受限的使用模式中(通过 Python 的多处理工具包获取相同水平的并行)仍然大约为 180%。提速主要来自于访问不同 MuJoCo 数据结构的时间的减少。查看示例/simpool.py 以了解 MjSimPool。
高性能纹理随机化
OpenAI 在很多项目上使用了域随机化技术。mujoco-py 的最新版本支持自动的(headless)GPU 渲染。相较于 CPU 渲染,这有了一个 40 倍的提速,每秒可产生数百帧的合成图像数据。上述动画中 OpenAI 使用纹理随机化技术改变了其众多机器人中的一个的纹理,帮助这个机器人辨识其身体(在将其从模拟器转移至现实时)。查看示例/disco_fetch.py 以了解随机化纹理生成。
通过 mujoco-py 实现虚拟现实
mujoco-py 公开的 API 足以实现虚拟现实交互而无需额外的 C++ 代码。OpenAI 使用 mujoco-py 将 MuJoCo 的 C++ VR 示例移植到 Python。如果你有一个 HTC Vive VR 设置,可以尝试使用这一示例(这一支持被认为是实验性的,但是 OpenAI 已在内部使用它了一段时间)。
API 和用法
开始 mujoco-py 的最简单方法是使用 MjSim class。它是围绕模拟模型和数据的包装(wrapper),可以使你轻易地进行模拟并从摄像头传感器中渲染图像,下面是一个简单示例:
from mujoco_py import load_model_from_path, MjSim
model = load_model_from_path("xmls/tosser.xml")
sim = MjSim(model)
sim.step()
print(sim.data.qpos)
# => [ -1.074e-05 1.043e-04 -3.923e-05 0.000e+00 0.000e+00]
对于高阶用户,OpenAI 提供了大量的低水平接口以直接访问 MuJoCo C 结构体和内部函数。