更新日期:202409

前言:

记录下自己学习Mujoco历程,直接使用deepMind官方给的python使用方案。
平台:
python 3.12: DeepMind维护的Mujoco可以直接在3.8版本以后的python中直接安装。
Anacoda:利用anacoda管理的自己python环境。避免安装过多版本的python。

1.安装

pip install mujoco

在anacoda中,点运行,选择openTerminal。
【mujoco( DeepMind )】入门学习记录1-LMLPHP
一般3.8版本以上的可以顺利安装!

2.快速上手:

在命令窗terminal中运行

python -m mujoco.viewer   #代码1:启动mujoco,可以通过拖放加载模型。
python -m mujoco.viewer --mjcf=/path/to/some/mjcf.xml    #代码2:为指定的模型文件启动mujoco。

注意xml文件所在的路径中一定不要有中文!!!
xml文件用于描述机器人机械臂模型,后缀为.xml,此处提供几篇大佬文章供参考:
https://zhuanlan.zhihu.com/p/99991106
https://zhuanlan.zhihu.com/p/143983506

运行代码1:
【mujoco( DeepMind )】入门学习记录1-LMLPHP
弹出Mujoco窗口,但此时没有机器人模型,提示可以Drag-and-drop model file.
【mujoco( DeepMind )】入门学习记录1-LMLPHP
将.xml格式的机器人模型拖入mujoco即可显示,此处文件夹路径不要有中文.
【mujoco( DeepMind )】入门学习记录1-LMLPHP
如果没有xml模型,可以将下面的代码复制到txt文件中,保存,修改文件后缀为.xml,这段代码源自官方Mujoco Decumentation

<mujoco>
   <worldbody>
      <light diffuse=".5 .5 .5" pos="0 0 3" dir="0 0 -1"/>    
      <geom type="plane" size="1 1 0.1" rgba=".9 0 0 1"/>
      <body pos="0 0 1">
         <joint type="free"/>
         <geom type="box" size=".1 .2 .3" rgba="0 .9 0 1"/>
      </body>
   </worldbody>
</mujoco>

运行代码2:
【mujoco( DeepMind )】入门学习记录1-LMLPHP
代码2相当于直接打开对应文件夹的xml模型.

Python中使用

代码参考:mujoco最新教程

import time

import mujoco
import mujoco.viewer

import os

file_path = r"C:\Users\XXX\Desktop\robotxml\robot3.xml" #修改为自己的xml地址,注意地址不要有中文!!
print(f"File exists: {os.path.exists(file_path)}")
print(f"Current working directory: {os.getcwd()}")
print(f"File is readable: {os.access(file_path, os.R_OK)}")

m = mujoco.MjModel.from_xml_path(file_path)
d = mujoco.MjData(m)

with mujoco.viewer.launch_passive(m, d) as viewer:
    # 30时间步长后关闭mujoco程序窗口 viewer
    start = time.time()
    while viewer.is_running() and time.time() - start < 30:
        step_start = time.time()

        # Mj_step可以替换为同样求值的代码
        # mj_step可以替换为同样评估策略并在执行物理之前应用控制信号的代码。
        mujoco.mj_step(m, d)

        # 查看器选项的修改示例:每两秒钟切换一次接触点。
        with viewer.lock():
            viewer.opt.flags[mujoco.mjtVisFlag.mjVIS_CONTACTPOINT] = int(d.time % 2)

        # 获取物理状态的更改,应用扰动,从GUI更新选项。
        viewer.sync()

        # 粗略的计时,相对于挂钟会有漂移。
        time_until_next_step = m.opt.timestep - (time.time() - step_start)
        if time_until_next_step > 0:
            time.sleep(time_until_next_step)

分享下用的xml格式文件:

<mujoco model="example">
  <default>
    <geom rgba=".8 .6 .4 1"/>
  </default>

  <asset>
    <texture type="skybox" builtin="gradient" rgb1="1 1 1" rgb2=".6 .8 1" width="256" height="256"/>
  </asset>

  <worldbody>
    <light pos="0 1 1" dir="0 -1 -1" diffuse="1 1 1"/>
    <body pos="0 0 1">
      <joint type="ball"/>
      <geom type="capsule" size="0.06" fromto="0 0 0  0 0 -.4"/>
      <body pos="0 0 -0.4">
        <joint axis="0 1 0"/>
        <joint axis="1 0 0"/>
        <geom type="capsule" size="0.04" fromto="0 0 0  .3 0 0"/>
        <body pos=".3 0 0">
          <joint axis="0 1 0"/>
          <joint axis="0 0 1"/>
          <geom pos=".1 0 0" size="0.1 0.08 0.02" type="ellipsoid"/>
          <site name="end1" pos="0.2 0 0" size="0.01"/>
        </body>
      </body>
    </body>

    <body pos="0.3 0 0.1">
      <joint type="free"/>
      <geom size="0.07 0.1" type="cylinder"/>
      <site name="end2" pos="0 0 0.1" size="0.01"/>
    </body>
  </worldbody>

  <tendon>
    <spatial limited="true" range="0 0.6" width="0.005">
      <site site="end1"/>
      <site site="end2"/>
    </spatial>
  </tendon>
</mujoco>

使用效果如下图!
【mujoco( DeepMind )】入门学习记录1-LMLPHP

3.声明:引用了大佬的文章和代码,已注明,侵删!

引用

  1. https://mujoco.readthedocs.io/en/stable/overview.html
  2. https://zhuanlan.zhihu.com/p/380716224
  3. https://zhuanlan.zhihu.com/p/639017263
  4. https://zhuanlan.zhihu.com/p/656678983
  5. MuJoCo自定义机器人建模指南:https://zhuanlan.zhihu.com/p/143983506
09-15 08:28