更新日期:202409
前言:
记录下自己学习Mujoco历程,直接使用deepMind官方给的python使用方案。
平台:
python 3.12: DeepMind维护的Mujoco可以直接在3.8版本以后的python中直接安装。
Anacoda:利用anacoda管理的自己python环境。避免安装过多版本的python。
1.安装
pip install mujoco
在anacoda中,点运行,选择openTerminal。
一般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窗口,但此时没有机器人模型,提示可以Drag-and-drop model file.
将.xml格式的机器人模型拖入mujoco即可显示,此处文件夹路径不要有中文.
如果没有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:
代码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>
使用效果如下图!
3.声明:引用了大佬的文章和代码,已注明,侵删!
引用
- https://mujoco.readthedocs.io/en/stable/overview.html
- https://zhuanlan.zhihu.com/p/380716224
- https://zhuanlan.zhihu.com/p/639017263
- https://zhuanlan.zhihu.com/p/656678983
- MuJoCo自定义机器人建模指南:https://zhuanlan.zhihu.com/p/143983506