文章目录

    • 概要
      • 要求
      • 安装MuJoCo
      • 安装和使用`mujoco-py`
      • 缺少 GLFW
      • Ubuntu安装疑难解答
    • Development
  • 接口参考
    • MjSim:基本模拟
    • PyMjData:瞬态数据
    • MjSimPool:批处理模拟
    • [MjViewer:3D 渲染](https://openai.github.io/mujoco-py/build/html/reference.html#id4)
      • `mujoco-py` 高级功能的示例:
        • 1、[`body_interaction.py`](./examples/body_interaction.py): 显示碰撞体之间的相互作用
        • 2、[`disco_fetch.py`](./examples/disco_fetch.py): 展示了如何使用 `TextureModder` 来随机化对象纹理
        • 3、[`internal_functions.py`](./examples/internal_functions.py): 显示如何调用原始 mujoco 函数,如 `mjv_room2model`
        • 4、[`markers_demo.py`](./examples/markers_demo.py): 显示如何将仅可视化的几何图形添加到查看器
        • 5、[`serialize_model.py`](./examples/serialize_model.py): 显示如何保存和恢复模型
        • 6、[`setting_state.py`](./examples/setting_state.py): 显示如何将模拟重置为给定状态
        • 7、[`tosser.py`](./examples/tosser.py): 展示了一个简单的驱动物体分拣机器人应用程序

MuJoCo 是一个物理引擎,用于使用contacts进行详细、高效的刚体模拟。
mujoco-py 允许使用 Python 3 中的 MuJoCo。

该库已更新为与 2021 年 10 月 18 日发布的 MuJoCo 2.1 版兼容。

概要

要求

目前支持以下平台:

  • Linux with Python 3.6+. See the Dockerfile for the canonical list of system dependencies.
  • OS X with Python 3.6+.

以下平台已弃用且不受支持:

  • Windows 支持已在 2.0.2.0 中被弃用和删除。 一个已知的良好过去版本是 1.50.1.68。
  • Python 2 已在 1.50.1.0 中被弃用和删除。 Python 2 用户可以留在 0.5 分支。 最新版本是 0.5.7,可以使用 pip install mujoco-py==0.5.7 安装。

安装MuJoCo

  1. Download the MuJoCo version 2.1 binaries for
    Linux orOSX.
  2. Extract the downloaded mujoco210 directory into ~/.mujoco/mujoco210.

If you want to specify a nonstandard location for the package,
use the env variable MUJOCO_PY_MUJOCO_PATH.

安装和使用mujoco-py

要将 mujoco-py 包含在您自己的包中,请将其添加到您的要求中,如下所示:

mujoco-py<2.2,>=2.1

要以交互方式使用“mujoco-py”,请执行以下步骤:

$ pip3 install -U 'mujoco-py<2.2,>=2.1'
$ python3
import mujoco_py
import os
mj_path = mujoco_py.utils.discover_mujoco()
xml_path = os.path.join(mj_path, 'model', 'humanoid.xml')
model = mujoco_py.load_model_from_path(xml_path)
sim = mujoco_py.MjSim(model)print(sim.data.qpos)
# [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]sim.step()
print(sim.data.qpos)
# [-2.09531783e-19  2.72130735e-05  6.14480786e-22 -3.45474715e-06
#   7.42993721e-06 -1.40711141e-04 -3.04253586e-04 -2.07559344e-04
#   8.50646247e-05 -3.45474715e-06  7.42993721e-06 -1.40711141e-04
#  -3.04253586e-04 -2.07559344e-04 -8.50646247e-05  1.11317030e-04
#  -7.03465386e-05 -2.22862221e-05 -1.11317030e-04  7.03465386e-05
#  -2.22862221e-05]

有关高级用法,请参阅 完整文档。

缺少 GLFW

安装时的常见错误是:

raise ImportError("Failed to load GLFW3 shared library.")

glfw python 包无法找到 GLFW 动态库时会发生这种情况。

MuJoCo 附带了它自己的这个库的副本,可以在安装过程中使用。

将 mujoco bin 目录的路径添加到动态加载器:

LD_LIBRARY_PATH=$HOME/.mujoco/mujoco210/bin pip install mujoco-py

这在没有 GLFW 包的 Ubuntu 14.04 上特别有用。

Ubuntu安装疑难解答

因为 mujoco_py 已经编译了需要链接到提供的 MuJoCo 二进制文件的本机代码,所以它正在安装
在 linux 上可能比纯 Python 源代码包更具挑战性。

要在 Ubuntu 上安装 mujoco-py,请确保已安装以下库:

sudo apt install libosmesa6-dev libgl1-mesa-glx libglfw3

如果您安装了上述库,但仍然看到找不到 -lGL 的错误,很可能您需要直接创建符号链接:

sudo ln -s /usr/lib/x86_64-linux-gnu/libGL.so.1 /usr/lib/x86_64-linux-gnu/libGL.so

Development

要运行提供的单元和集成测试:

make test

要测试 GPU 支持的渲染,请运行:

make test_gpu

目前这在一定程度上取决于内部 OpenAI 基础设施,但如果您为自己的设置更改“Makefile”参数,它应该会运行。




接口参考

  • MjSim:基本模拟
  • PyMjData:瞬态数据
  • MjSimPool:批处理模拟
  • MjViewer:3D 渲染

MjSim:基本模拟

  • mujoco_py.load_model_from_path(路径)

    ​ 从路径加载模型。

  • mujoco_py.load_model_from_xml(xml_string)

    ​ 从包含 XML 标记的字符串加载并返回 PyMjModel 模型。将用于在模型中创建返回的模型的 XML 字符串.xml。

  • mujoco_py.load_model_from_mjb(路径)

    ​ 从编码的 MJB 字节加载并返回 PyMjModel 模型。MJB是一种MuJoCo自定义格式,包括网格/纹理等资源。

  • mujoco_py.MjSim(modeldata=Nonensubsteps=1udd_callback=None)

    MjSim 表示一个正在运行的模拟,包括其状态。

    与 Gym的 MujocoEnv 类似,它在内部包装了一个PyMjModel 和一个 PyMjData

    参数型号PyMjModel

    ​ 要模拟的模型。

    数据PyMjData

    ​ 模拟状态的可选容器。如果出现以下情况,将创建

    ​ .None

    nsubsteps : int

    ​ 每次调用 step() 时要运行的 MuJoCo 步骤的可选数量。缓冲区每步只能交换一次。

    udd_callback : fn(MjSim) -> dict

    ​ 用户定义动态的可选回调。 在每次调用 step() 时,它都会在 sim.udd_state 中接收一个包含当 前用户定义的动态状态的 MjSim 对象 sim,并在应用用户定义的动态后返回下一个 udd_state。 这很有用,例如 对于在历史状态函数上运行的奖励函数。

    属性

    方法

    get_state()

    ​ 返回模拟器状态的副本。

    render()

    ​ 从摄像机渲染视图,并将图像作为 numpy.ndarray 返回。

    ​ Args: - width (int): 所需的图像宽度。- 高度(整型):所需的图像高度。- camera_name(str):模型中相机的名称。如果无,则免费将使用相机。

    ​ 深度(布尔):如果为 True,则返回深度缓冲区返回:- rgb(uint8 数组):来自相机的图像缓冲区 - 深度(浮点数组):来自相机的深度缓冲区(仅返回)如果深度 = 真)

    reset()

    ​ 重置仿真数据并清除缓冲区。

    save()

    ​ 将模拟器模型和状态作为 MuJoCo XML 或 MJB 文件保存到文件中。当前状态将另存为模型文件中的关键帧。这对于使用 MuJoCo 的模拟实用程序进行调试非常有用。

    ​ 请注意,这不会保存作为 MjSimState 一部分的 UDD 状态,因为 MuJoCo 本身不支持该状态。如果要将模型与UDD状态一起保存,则应在MjModel上使用get_xml或get_mjb方法以及MjSim.get_state,并使用例如pickle保存它们。

    ​ 参数:- 文件(IO 流):要将模型写入的流。- 格式:要使用的格式(“xml”或“mjb”) - keep_inertials(bool):如果为False,则删除所有<惯性>由 MuJoco 自动派生的 geoms 属性。请注意,这也会删除用户提供的那些。

    set_state()

    ​ 从 MjSimState 设置状态。如果 MjSimState 以前是从 numpy 数组中解压的,请考虑set_state_from_flattened,因为防御性副本是内部循环中的大量开销。

    ​ Args: - value (MjSimState): 所需的状态。- call_forward:可选择调用 sim.forward()。在以下情况下默认调用:

    ​ 设置udd_callback。

    set_state_from_flattened()

    ​ 此帮助器方法从数组设置状态,而无需防御性副本。

    step()

    ​ 通过调用mj_step来推进模拟。

    ​ 如果 qposqvel 被直接修改,则如果用户udd_callback需要访问在转发动态期间设置的 MuJoCo 状态,则需要在 step() 之前调用 forward()。

  • mujoco_py.MjSimState

    ​ 表示模拟器状态的快照。

    ​ 这包括时间,qpos,qvel,act和udd_state。

    属性

    方法

  • mujoco_py.ignore_mujoco_warnings()[来源]

    ​ 用于在某个范围内关闭 mujoco 警告异常的类。适用于大型矢量化部署。

PyMjData:瞬态数据

PyMjData相关类是从 MuJoCo C 头文件自动生成的。有关此过程的详细信息,请参阅自动生成的包装器。因此,它们的结构直接遵循MuJoCo结构。

  • mujoco_py.PyMjData

    属性act act_dot active_contacts_efc_pos actuator_force actuator_length actuator_moment actuator_velocity body_jacp body_jacr body_xmat body_xpos body_xquat body_xvelp body_xvelr cacc cam_xmat cam_xpos cdof cdof_dot cfrc_ext cfrc_int cinert contact crb ctrl cvel efc_AR efc_AR_colind efc_AR_rowadr efc_AR_rownnz efc_D efc_J efc_JT efc_JT_colind efc_JT_rowadr efc_JT_rownnz efc_J_colind efc_J_rowadr efc_J_rownnz efc_R efc_aref efc_b efc_diagApprox efc_force efc_frictionloss efc_id efc_margin efc_solimp efc_solref efc_state efc_type efc_vel energy geom_jacp geom_jacr geom_xmat geom_xpos geom_xvelp geom_xvelr light_xdir light_xpos maxuse_con maxuse_efc maxuse_stack mocap_pos mocap_quat nbuffer ncon ne nefc nf nstack pstack qLD qLDiagInv qLDiagSqrtInv qM qacc qacc_unc qacc_warmstart qfrc_actuator qfrc_applied qfrc_bias qfrc_constraint qfrc_inverse qfrc_passive qfrc_unc qpos qvel sensordata set_joint_qpos set_joint_qvel set_mocap_pos set_mocap_quat site_jacp site_jacr site_xmat site_xpos site_xvelp site_xvelr solver solver_fwdinv solver_iter solver_nnz subtree_angmom subtree_com subtree_linvel ten_length ten_moment ten_velocity ten_wrapadr ten_wrapnum time timer userdata warning wrap_obj wrap_xpos xanchor xaxis xfrc_applied ximat xipos

    方法

    • get_body_jacp(name)

      获取与给定名称的主体对应的 jacp 中的条目

    • get_body_jacr(name)

      获取与给定名称的主体对应的 jacr 中的条目

    • get_body_ximat(name)

      获取与给定名称的主体对应的 ximat 中的条目

    • get_body_xipos(name)

      获取与给定名称的主体对应的 xipos 中的条目

    • get_body_xmat(name)

      获取与给定名称的主体对应的 xmat 中的条目

    • get_body_xpos(name)

      获取与给定名称的主体对应的 xpos 中的条目

    • get_body_xquat(name)

      获取与给定名称的主体对应的 xquat 中的条目

    • get_body_xvelp(name)

      获取与给定名称的主体对应的 xvelp 中的条目

    • get_body_xvelr(name)

      获取与给定名称的主体对应的 xvelr 中的条目

    • get_cam_xmat(name)

      获取 xmat 中与给定名称的 cam 对应的条目

    • get_cam_xpos(name)

      获取 xpos 中与给定名称的 cam 对应的条目

    • get_camera_xmat(name)

      获取xmat中与给定名称的相机对应的条目

    • get_camera_xpos(name)

      获取xpos中与给定名称的相机对应的条目

    • get_geom_jacp(name)

      获取与给定名称的geom对应的jacp中的条目

    • get_geom_jacr(name)

      获取与给定名称的geom对应的jacr中的条目

    • get_geom_xmat(name)

      获取与给定名称的geom对应的xmat中的条目

    • get_geom_xpos(name)

      获取与给定名称的geom对应的xpos中的条目

    • get_geom_xvelp(name)

      获取与给定名称的geom对应的xvelp中的条目

    • get_geom_xvelr(name)

      获取与给定名称的geom对应的xvelr中的条目

    • get_joint_qpos(name)

      获取与给定名称的关节对应的 qpos 中的条目

    • get_joint_qvel(name)

      获取与给定名称的关节对应的 qvel 中的条目

    • get_joint_xanchor(name)

      获取与给定名称的关节对应的 xanchor 条目

    • get_joint_xaxis(name)

      获取与给定名称的关节对应的 xaxis 条目

    • get_light_xdir(name)

      获取与给定名称的灯光对应的 xdir 中的条目

    • get_light_xpos(name)

      获取与给定名称的灯对应的 xpos 中的条目

    • get_mocap_pos(name)

      获取与给定名称的mocap对应的pos中的条目

    • get_mocap_quat(name)

      获取与给定名称的动作捕捉对应的 quat 条目

    • get_site_jacp(name)

      获取与给定名称的站点对应的 jacp 中的条目

    • get_site_jacr(name)

      获取与给定名称的站点对应的 jacr 中的条目

    • get_site_xmat(name)

      获取与给定名称的站点对应的 xmat 中的条目

    • get_site_xpos(name)

      获取与给定名称的站点对应的 xpos 中的条目

    • get_site_xvelp(name)

      获取与给定名称的站点对应的 xvelp 中的条目

    • get_site_xvelr(name)

      获取与给定名称的站点对应的 xvelr 中的条目

MjSimPool:批处理模拟

  • classmujoco_py.MjSimPool

    保留多个 MjSim 的池,并允许并行快速步进它们。

    参数simMjSim 列表组成池的模拟器列表。

    nsubsteps:

    ​ 要在 step() 上运行的子步骤数。各个模拟器的nsubstep将被忽略。

    属性

    方法

    staticcreate_from_sim()

    ​ 通过克隆提供simnsims总共次数来创建 MjSimPool。返回创建的 MjSimPool

    参数simMjSim

    ​ 要克隆的原型。

    nsims : int

    ​ 要创建的克隆数。

    forward()

    ​ 并行调用所有模拟mj_forward。如果指定 nsims,则仅转发第一个 nsims模拟器。

    reset()

    ​ 重置池中的所有模拟。如果指定了 nsims,则仅重置第一个 nsims模拟器。

    step()

    ​ 并行调用所有模拟,并按照创建池时的指定进行调用。

    mj_step nsubsteps

    ​ 如果指定了nsims,则仅对第一个 nsims模拟器进行步进。

MjViewer:3D 渲染

  • classmujoco_py.MjViewerBasic(sim)[来源]

    一个简单的显示 GUI,显示带有鼠标可移动摄像头的 MjSim 场景。

    MjViewer 扩展了此类以提供更复杂的播放和交互控件。

    参数:simMjSim

    ​ 要显示的模拟器。

    属性

    方法

    render()[来源]

    ​ 将当前模拟状态呈现到屏幕或屏幕外缓冲区。在主循环中调用它。

  • classmujoco_py.MjViewer(sim)[来源]

​ 扩展 MjViewerBasic 以添加视频录制、交互式时间和交互控件。

​ 键绑定如下所示:

  1. TAB:在 MuJoCo 摄像机之间切换。
  2. H:切换隐藏所有 GUI 组件。
  3. 空格键:暂停/取消暂停模拟。
  4. 右:将仿真提前一步。
  5. V:开始/停止视频录制。
  6. T:捕获屏幕截图。
  7. I:放入ipdb调试器。
  8. S/F(信噪比):降低/提高模拟播放速度。
  9. C:切换接触力的可视化(默认关闭)。
  10. D:在渲染滞后于实时时启用/禁用帧跳过。
  11. R:切换地理区域的透明度。
  12. M:切换动作帽主体的显示。

​ 参数:simMjSim

​ 要显示的模拟器。

属性

方法

render()[来源]

​ 将当前模拟状态呈现到屏幕或屏幕外缓冲区。在主循环中调用它。




mujoco-py 高级功能的示例:

1、body_interaction.py: 显示碰撞体之间的相互作用

#!/usr/bin/env python3
"""
身体如何相互作用的例子。 为了身体能够移动它需要有关节。 在这个例子中,“机器人”是一个红球
带有 X 和 Y 滑动接头(以及不受控制的 Z 滑动接头)。
在地板上,有一个带有 X 和 Y 滑动接头的圆柱体,所以它可以被机器人推来推去。 还有一个没有接头的盒子。 由于
盒子没有关节,是固定的,不能推来推去。
"""
from mujoco_py import load_model_from_xml, MjSim, MjViewer
import math
import osMODEL_XML = """
<?xml version="1.0" ?>
<mujoco><option timestep="0.005" /><worldbody><body name="robot" pos="0 0 1.2"><joint axis="1 0 0" damping="0.1" name="slide0" pos="0 0 0" type="slide"/><joint axis="0 1 0" damping="0.1" name="slide1" pos="0 0 0" type="slide"/><joint axis="0 0 1" damping="1" name="slide2" pos="0 0 0" type="slide"/><geom mass="1.0" pos="0 0 0" rgba="1 0 0 1" size="0.15" type="sphere"/><camera euler="0 0 0" fovy="40" name="rgb" pos="0 0 2.5"></camera></body><body mocap="true" name="mocap" pos="0.5 0.5 0.5"><geom conaffinity="0" contype="0" pos="0 0 0" rgba="1.0 1.0 1.0 0.5" size="0.1 0.1 0.1" type="box"></geom><geom conaffinity="0" contype="0" pos="0 0 0" rgba="1.0 1.0 1.0 0.5" size="0.2 0.2 0.05" type="box"></geom></body><body name="cylinder" pos="0.1 0.1 0.2"><geom mass="1" size="0.15 0.15" type="cylinder"/><joint axis="1 0 0" name="cylinder:slidex" type="slide"/><joint axis="0 1 0" name="cylinder:slidey" type="slide"/></body><body name="box" pos="-0.8 0 0.2"><geom mass="0.1" size="0.15 0.15 0.15" type="box"/></body><body name="floor" pos="0 0 0.025"><geom condim="3" size="1.0 1.0 0.02" rgba="0 1 0 1" type="box"/></body></worldbody><actuator><motor gear="2000.0" joint="slide0"/><motor gear="2000.0" joint="slide1"/></actuator>
</mujoco>
"""model = load_model_from_xml(MODEL_XML)  # 从包含 XML标记的字符串加载并返回 PyMjModel模型。
sim = MjSim(model) # MjSim 表示一个正在运行的模拟,包括其状态。
viewer = MjViewer(sim) # 要显示的模拟器。
t = 0
while True:sim.data.ctrl[0] = math.cos(t / 10.) * 0.01sim.data.ctrl[1] = math.sin(t / 10.) * 0.01t += 1sim.step() #   通过调用`mj_step`来推进仿真。viewer.render() # 从摄像机渲染视图,并将图像作为 numpy.ndarray 返回。if t > 100 and os.getenv('TESTING') is not None:break# getenv():获取环境变量,如果不存在则返回None。

2、disco_fetch.py: 展示了如何使用 TextureModder 来随机化对象纹理

#!/usr/bin/env python3
"""
Displays robot fetch at a disco party.
显示disco派对上的机器人取物。
"""
from mujoco_py import load_model_from_path, MjSim, MjViewer
from mujoco_py.modder import TextureModder
import osmodel = load_model_from_path("xmls/fetch/main.xml")
sim = MjSim(model)viewer = MjViewer(sim)
modder = TextureModder(sim) # TextureModder用来随机化对象纹理
t = 0 while True:for name in sim.model.geom_names:modder.rand_all(name)# modder.py : 创建MuJoCo模拟后更改纹理和材料的实用程序,允许超快速的场景生成。
# rand_all(name):随机生成许多东西。viewer.render() # 从摄像机渲染视图,并将图像作为 numpy.ndarray 返回。t += 1 # 仿真的时间步if t > 100 and os.getenv('TESTING') is not None:break

3、internal_functions.py: 显示如何调用原始 mujoco 函数,如 mjv_room2model

#!/usr/bin/env python3
"""
展示如何从 MuJoCo 访问内部函数。
"""
from mujoco_py import load_model_from_xml, MjSim, functions
import numpy as npMODEL_XML = """
<?xml version="1.0" ?>
<mujoco><option timestep="0.005" /><worldbody><body name="robot" pos="0 0 1.2"><joint axis="1 0 0" damping="0.1" name="robot:slide0" pos="0 0 0" type="slide"/><geom mass="1.0" pos="0 0 0" rgba="1 0 0 1" size="0.15" type="sphere"/></body></worldbody>
</mujoco>
"""model = load_model_from_xml(MODEL_XML)
sim = MjSim(model)print("Nicely exposed function:\n") # 很好暴露的功能
print(sim.model.get_xml())print("\nversus MuJoCo internals:\n\n") # functions.mj_saveLastXML("/tmp/saved.xml", model, "", 0)
with open("/tmp/saved.xml", "r") as f:print(f.read())sim.render(100, 100)modelpos = np.zeros(3)
modelquat = np.zeros(4)
roompos = np.ones(3)
roomquat = np.array([1., 0., 1., 0.])functions.mjv_room2model(modelpos, modelquat, roompos,roomquat, sim.render_contexts[0].scn)print("\n\nAnother internal function, mjv_room2model:")
print("modelpos = %s, modelquat = %s" % (str(modelpos), str(modelquat)))res = np.zeros(9)
functions.mju_quat2Mat(res, roomquat)
print("\n\nAnother internal function, mju_quat2Mat:\n%s" % res)

4、markers_demo.py: 显示如何将仅可视化的几何图形添加到查看器

#!/usr/bin/env python
# demonstration of markers (visual-only geoms)import math
import time
import os
import numpy as np
from mujoco_py import load_model_from_xml, MjSim, MjViewerMODEL_XML = """
<?xml version="1.0" ?>
<mujoco><worldbody><body name="box" pos="0 0 0.2"><geom size="0.15 0.15 0.15" type="box"/><joint axis="1 0 0" name="box:x" type="slide"/><joint axis="0 1 0" name="box:y" type="slide"/></body><body name="floor" pos="0 0 0.025"><geom size="1.0 1.0 0.02" rgba="0 1 0 1" type="box"/></body></worldbody>
</mujoco>
"""model = load_model_from_xml(MODEL_XML)
sim = MjSim(model)
viewer = MjViewer(sim)
step = 0   # 运行多少时间步
while True:t = time.time() # 开始运行时间x, y = math.cos(t), math.sin(t)viewer.add_marker(pos=np.array([x, y, 1]),label=str(t))viewer.render()step += 1if step > 100 and os.getenv('TESTING') is not None:break

5、serialize_model.py: 显示如何保存和恢复模型

"""
有时通过网络发送 mujoco 模型或将其保存到嵌入了所有资产的文件中很有用。
显示如何保存和恢复模型
"""
import mujoco_py# The binary MJB format is preferable, since it includes assets like
# textures and meshes.二进制 MJB 格式是可取的,因为它包括资产,例如纹理和网格。
model = mujoco_py.load_model_from_path("xmls/claw.xml")
mjb_bytestring = model.get_mjb()
model_from_binary = mujoco_py.load_model_from_mjb(mjb_bytestring)
assert model.nbody == model_from_binary.nbody# XML is preferable to MJB when readability and backward compatibility are
# important.当可读性和向后兼容性很重要时,XML 比 MJB 更可取。
xml_string = model.get_xml()
model_from_xml = mujoco_py.load_model_from_xml(xml_string)
assert model.nbody == model_from_xml.nbody

6、setting_state.py: 显示如何将模拟重置为给定状态

#!/usr/bin/env python3
"""
如何在执行期间修改 MuJoCo qpos 的示例。
"""import os
from mujoco_py import load_model_from_xml, MjSim, MjViewerMODEL_XML = """
<?xml version="1.0" ?>
<mujoco><worldbody><body name="box" pos="0 0 0.2"><geom size="0.15 0.15 0.15" type="box"/><joint axis="1 0 0" name="box:x" type="slide"/><joint axis="0 1 0" name="box:y" type="slide"/></body><body name="floor" pos="0 0 0.025"><geom size="1.0 1.0 0.02" rgba="0 1 0 1" type="box"/></body></worldbody>
</mujoco>
"""def print_box_xpos(sim):print("box xpos:", sim.data.get_body_xpos("box"))model = load_model_from_xml(MODEL_XML)
sim = MjSim(model)
viewer = MjViewer(sim)states = [{'box:x': +0.8, 'box:y': +0.8},# 状态{'box:x': -0.8, 'box:y': +0.8},{'box:x': -0.8, 'box:y': -0.8},{'box:x': +0.8, 'box:y': -0.8},{'box:x': +0.0, 'box:y': +0.0}]# MjModel.joint_name2id returns the index of a joint in
# MjData.qpos.
x_joint_i = sim.model.get_joint_qpos_addr("box:x") # 获取关节位置地址
y_joint_i = sim.model.get_joint_qpos_addr("box:y")print_box_xpos(sim) # 打印位置while True:for state in states: # 状态sim_state = sim.get_state() # 返回模拟器状态sim_state.qpos[x_joint_i] = state["box:x"] # x_joint_i位置sim_state.qpos[y_joint_i] = state["box:y"] # y_joint_i位置sim.set_state(sim_state) #设置状态sim.forward() # 向前推进仿真print("updated state to", state) # 更新状态到print_box_xpos(sim) # 打印盒子的位置viewer.render() # 可视化if os.getenv('TESTING') is not None:break

7、tosser.py: 展示了一个简单的驱动物体分拣机器人应用程序

#!/usr/bin/env python3
"""
展示如何将胶囊扔到容器中。
"""
from mujoco_py import load_model_from_path, MjSim, MjViewer
import osmodel = load_model_from_path("xmls/tosser.xml")
sim = MjSim(model)viewer = MjViewer(sim)sim_state = sim.get_state()while True:sim.set_state(sim_state)for i in range(1000):if i < 150:sim.data.ctrl[:] = 0.0else:sim.data.ctrl[:] = -1.0sim.step()viewer.render()if os.getenv('TESTING') is not None:break

有关高级用法,请参阅 完整文档。

mujoco_py中文文档相关推荐

  1. PyTorch官方中文文档:torch.optim 优化器参数

    内容预览: step(closure) 进行单次优化 (参数更新). 参数: closure (callable) –...~ 参数: params (iterable) – 待优化参数的iterab ...

  2. golang中文文档_Golang 标准库 限流器 time/rate 设计与实现

    限流器是后台服务中十分重要的组件,在实际的业务场景中使用居多,其设计在微服务.网关.和一些后台服务中会经常遇到.限流器的作用是用来限制其请求的速率,保护后台响应服务,以免服务过载导致服务不可用现象出现 ...

  3. springboot中文文档_登顶 Github 的 Spring Boot 仓库!艿艿写的最肝系列

    源码精品专栏 中文详细注释的开源项目 RPC 框架 Dubbo 源码解析 网络应用框架 Netty 源码解析 消息中间件 RocketMQ 源码解析 数据库中间件 Sharding-JDBC 和 My ...

  4. Apache Spark 2.2.0 中文文档 翻译活动

    为什么80%的码农都做不了架构师?>>>    Spark 2.2.0 已然发布(2017-07-11 发布) 5 天了,更新了一些新套路吧! 此版本从 Structured Str ...

  5. Python爱好者周知:Scikit-Learn中文文档正式发布

    整理 | 费棋 出品 | AI科技大本营(公众号ID:rgznai100) 近日,Scikit-Learn 中文文档已由开源组织 ApacheCN 完成校对.该中文文档依然包含了 Scikit-Lea ...

  6. GitHub 中文文档正式发布

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 中国作为全球最大的人口大国,所属开发者在 GitHub 上的占比自 ...

  7. 推荐:Webpack2入门到深入的中文文档

    2019独角兽企业重金招聘Python工程师标准>>> 最近看了一本不错的<<webpack2中文文档>>的PDF,对比于wepack2官网(https:// ...

  8. matlab中文文档_Linux下Matlab安装

    如果觉得文章好看,欢迎点赞.同时欢迎关注微信公众号:氷泠之路. 引言 抱歉国庆由于各种原因一直没空更新文章,啊啊啊啊啊.... 因为在忙各种各样的事情,都怪女朋友,另外也更新了"装备&quo ...

  9. 使用编译器——Solidity中文文档(8)

    写在前面:HiBlock区块链社区成立了翻译小组,翻译区块链相关的技术文档及资料,本文为Solidity文档翻译的第八部分<使用编译器>,特发布出来邀请solidity爱好者.开发者做公开 ...

  10. Android 3.0 r1 API中文文档(107) —— AsyncPlayer

    一.结构 public class AsyncPlayer extends Object java.lang.Object android.media.AsyncPlayer 二.概述 播放一个连续( ...

最新文章

  1. 【Qt】解决在linux上使用Qt的媒体模块(Qt += multimedia)缺少模块multimedia的问题
  2. 请收藏!新型冠状病毒感染的肺炎防控知识手册.pdf
  3. linux环境用pycharm开发,Linux中部开发环境(Pycharm)(示例代码)
  4. php swfupload handlers.js,swfupload使用代码说明
  5. 图像分割 | FCN数据集制作的全流程(图像标注)
  6. react 事件处理_在React中处理事件
  7. 小世界网络模型代码 c 语言,新的小世界网络模型实现文本特征的提取方法与流程...
  8. dnf全部使用_DNF:1.13拍卖最后1天物价,花瓣礼箱破千万,果然人人都是黑商
  9. IEC104规约调试
  10. 深雁论坛GhostXP专业装机版 V3.0
  11. 服务器四核cpu性能排行,服务器cpu性能排行
  12. 数据分析之大数据分析
  13. WPS做好一个PPT后,用microsoft系列的放映软件打开,出现空白页
  14. 计算机网络实训报告总结,学习计算机网络的实训总结
  15. keras导入weights方式
  16. JPBC库的使用实例——BLS签名
  17. 用python实现erp出入库_ERP采购入库成品入库流程(精)
  18. Android使用addr2line定位native崩溃堆栈
  19. 快手年终奖25个月,背后故事你们知道吗?
  20. 传奇开服教程:传奇开服技术要学多久?好学嘛?

热门文章

  1. linux中不用命令安装flash,如何在Linux下安装flash player
  2. 计算机word设置渐变填充,word文本效果在哪里?怎么设置填充渐变颜色?
  3. 【SAP】实施方法论-ASAP
  4. android ios emoji表情,iOS和Android的Emoji表情同步方案
  5. JPG/PNG转真SVG,非base64
  6. 软件工程专业的论文答辩_软件工程专业本科毕业答辩?
  7. Xilinx - WP509阅读笔记 - 了解射频采样数据转换器的关键参数
  8. phpstudy php乱码,PHP_完美解决PHP中文乱码,一.首先是PHP网页的编码 1. php - phpStudy...
  9. 用c语言双向循环链表,C语言实现双向循环链表
  10. 代码 点胶gcode_3D打印☞Gcode代码详解(含详解PDF附件)