系列文章目录
前言
从 2.1.2 版开始,MuJoCo 附带使用 pybind11 以 C++ 开发的本地 Python 绑定。Python API 与底层的 C API 保持一致。这导致了一些非 Python 代码结构(如函数参数的顺序),但其好处是 API 文档适用于两种语言。
Python 绑定作为 mujoco 包发布在 PyPI 上。这些都是底层绑定,旨在尽可能直接访问 MuJoCo 库。不过,为了提供开发人员期望在典型 Python 库中使用的 API 和语义,这些绑定在许多地方故意与原始 MuJoCo API 有所不同,本页将对此进行详细记录。
Google DeepMind 的 dm_control 强化学习库(在 1.0.0 版本之前,该库基于 ctypes 实现了自己的 MuJoCo 绑定)已更新为依赖于 mujoco 包,并继续得到 Google DeepMind 的支持。dm_control 中的更改对以前版本的用户来说应该基本透明,但直接依赖于其底层 API 的代码可能需要更新。详情请查阅迁移指南。
对于 mujoco-py 用户,我们在下文中提供了帮助迁移的说明。
一、教程笔记本
这里有使用 Python 绑定的 MuJoCo 教程:colab
二、安装
建议通过 PyPI 安装此软件包:
pip install mujoco
MuJoCo 库的副本作为软件包的一部分提供,无需单独下载或安装。
三、交互式查看器
作为 Python 软件包的一部分,mujoco.viewer 模块提供了一个交互式图形用户界面查看器。它与随 MuJoCo 二进制版本一起发布的仿真应用程序基于相同的代码库。支持三种不同的使用情况:
3.1 独立应用程序
-
会启动一个空的可视化会话,可通过拖放方式加载模型。python -m mujoco.viewer
-
启动指定模型文件的可视化会话。python -m mujoco.viewer --mjcf=/path/to/some/mjcf.xml
3.2 托管查看器
通过函数 viewer.launch 从 Python 程序/脚本中调用。该函数会阻塞用户代码,以支持物理循环的精确计时。如果用户代码是作为引擎插件或物理回调实现的,并在 mj_step 期间被 MuJoCo 调用,则应使用此模式。
-
会启动一个空的可视化会话,可通过拖放方式加载模型。viewer.launch()
-
为给定的 mjModel 启动一个可视化会话,在该会话中,可视化器会在内部创建自己的 mjData 实例viewer.launch(model)
-
与上述操作相同,但可视化器会直接对给定的 mjData 实例进行操作,退出时数据对象将被修改。viewer.launch(model, data)
3.3 被动查看器
调用 viewer.launch_passive(model,data)。该函数不会阻塞,允许用户代码继续执行。在此模式下,用户脚本负责计时和推进物理状态,除非用户明确同步传入事件,否则鼠标拖动扰动将不起作用。
警告
在 MacOS 上,launch_passive 要求通过特殊的 mjpython 启动器执行用户脚本。mjpython 命令是作为 mujoco 软件包的一部分安装的,可直接用于替代常用的 python 命令,并支持相同的命令行标志和参数集。例如,脚本可以通过 mjpython my_script.py 执行,IPython shell 可以通过 mjpython -m IPython 启动。
launch_passive 函数返回一个句柄,可用于与查看器交互。它具有以下属性:
- cam、opt 和 pert 属性:分别对应 mjvCamera、mjvOption 和 mjvPerturb 结构。
- lock():为作为上下文管理器的查看器提供一个互斥锁。由于查看器运行自己的线程,用户代码必须确保在修改任何物理或可视化状态之前持有查看器锁。这些属性包括传递给 launch_passive 的 mjModel 和 mjData 实例,以及查看器句柄的 cam、opt 和 pert 属性。
- sync():同步 mjModel、mjData 和 GUI 用户输入自上次调用 sync 后的状态。为了允许用户脚本在无需锁定查看器的情况下对 mjModel 和 mjData 进行任意修改,被动查看器不会在同步调用之外访问或修改这些结构。
- 用户脚本必须调用同步才能使查看器反映物理状态的变化。同步函数还会将用户输入从图形用户界面传回 mjOption(位于 mjModel 内部)和 mjData,包括启用/禁用标志、控制输入和鼠标扰动。
- update_hfield(hfieldid):更新指定 hfieldid 处的高度字段数据,以便后续渲染。
- update_mesh(meshid): 更新指定网格 ID 上的网格数据,以便后续渲染使用。
- update_texture(texid): 更新指定 texid 处的纹理数据,以便后续渲染使用。
- close():以编程方式关闭查看器窗口。该方法可以在不锁定的情况下安全调用。
- is_running():如果查看器窗口正在运行,则返回 True;如果已关闭,则返回 False。该方法可在不加锁的情况下安全调用。
- user_scn:一个 mjvScene 对象,允许用户在渲染场景中添加更改渲染标志和添加自定义可视化地形。它与查看器内部用于渲染最终场景的 mjvScene 是分开的,完全由用户控制。用户脚本可以调用 mjv_initGeom 或 mjv_makeConnector 等脚本向 user_scn 添加可视化几何图形,在下一次调用 sync() 时,查看器就会将这些几何图形添加到未来渲染的图像中。同样,用户脚本也可以更改 user_scn.flags,这些更改将在下一次调用 sync() 时被接收。同步()调用还会将通过图形用户界面对渲染标志所做的更改复制到 user_scn 中,以保持一致性。例如
with mujoco.