ubuntu18.04配置mujoco
本文最后更新于:2025年3月15日 下午
ubuntu18.04配置mujoco
流程
安装mujoco
下载mujoco,解压到
~/.mujoco
路径下下载
mjkey.txt
,分别存放到~/.mujoco/mjkey.txt
和~/.mujoco/mujoco200/bin/mjkey.txt
修改
.bashrc
文件,添加环境变量1
2
3
4
5
6
7# MUJOCO200 START
export MUJOCO_PATH=$HOME/.mujoco/mujoco200
export MUJOCO_KEY_PATH=$HOME/.mujoco/mjkey.txt
export LD_LIBRARY_PATH=$MUJOCO_PATH/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib/nvidia
export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libGLEW.so
# MUJOCO200 END
安装mujoco-py
新建虚拟conda环境,
python==3.8
降低
Cython
版本,pip install Cython==0.29.30
pip install mujoco-py==2.0.2.8
测试
1
2
3
4
5
6
7
8
9
10
11
12import mujoco_py
from mujoco_py import utils
import os
mj_path = utils.discover_mujoco()
xml_path = os.path.join(mj_path[0], 'model', 'humanoid.xml')
model = mujoco_py.load_model_from_path(xml_path)
sim = mujoco_py.MjSim(model)
print(sim.data.qpos)
sim.step()
print(sim.data.qpos)
报错
ERROR: Could not open activation key file mjkey.txt
mjkey.txt存放路径错误.
.mujoco/mujoco200/bin
路径下需要有一个mjkey.txt,./mujoco
下面也要有一个mjkey.txt。Cython.Compiler.Errors.CompileError: xxx/anaconda3/envs/DRL/lib/python3.7/site-packages/mujoco_py/cymj.pyx
Cython版本降到
0.29.30
。最恶心的问题😅——subprocess.CalledProcessError: Command '['ldd', 'xxx/anaconda3/envs/DRL/lib/python3.7/site-packages/mujoco_py/generated/_pyxbld_2.0.2.8_37_linuxcpuextensionbuilder/lib.linux-x86_64-cpython-37/mujoco_py/cymj.cpython-37m-x86_64-linux-gnu.so']' returned non-zero exit status 1.
尝试定位问题,可跳过
- 手动执行
ldd cymj.cpython-37m-x86_64-linux-gnu.so
报错【不是动态可执行文件】。 - 猜测
cymj.cpython-37m-x86_64-linux-gnu.so
文件有问题。 - 使用
file xxx/anaconda3/envs/DRL/lib/python3.7/site-packages/mujoco_py/generated/_pyxbld_2.0.2.8_37_linuxcpuextensionbuilder/lib.linux-x86_64-cpython-37/mujoco_py/cymj.cpython-37m-x86_64-linux-gnu.so
查看文件并没有损坏。 - 猜测编译的
cymj.cpython-37m-x86_64-linux-gnu.so
内容有问题。 - 使用
sudo update-alternatives --config gcc
降低gcc
版本,使用pip install mujoco-py==2.0.2.8 --no-cache-dir
重新安装mujoco-py
,问题并没有解决。
参考:https://wangchujiang.com/linux-command/c/ldd.html
从上面的文档可以看出,
ldd
并不是一个原生命令,实际等价于运行/lib/ld-linux.so.2 --list
,那直接运行/lib/ld-linux.so.2 --list xxx/anaconda3/envs/DRL/lib/python3.7/site-packages/mujoco_py/generated/_pyxbld_2.0.2.8_37_linuxcpuextensionbuilder/lib.linux-x86_64-cpython-37/mujoco_py/cymj.cpython-37m-x86_64-linux-gnu.so
❗❗❗报错:
wrong ELF class: ELFCLASS64
❗❗❗gpt反馈问题原因【使用的动态链接器与共享库的架构不匹配】,即
/lib/ld-linux.so.2
是32位系统的动态链接器,而检查的共享库cymj.cpython-38-x86_64-linux-gnu.so
是64位的。
💥解决方案💥
方案1:根据报错信息,找到
anaconda3/envs/环境名/lib/python3.8/site-packages/mujoco_py/builder.py
文件,按照下图所示修改fix_shared_library
函数,再import mujoco_py
没问题了1
2
3
4
5
6
7
8
9def fix_shared_library(so_file, name, library_path):
""" Used to fixup shared libraries on Linux """
subprocess.check_call(['patchelf', '--remove-rpath', so_file])
# ldd_output = subprocess.check_output(['ldd', so_file]).decode('utf-8')
ldd_output = subprocess.check_output(['/lib64/ld-linux-x86-64.so.2', '--list', so_file]).decode('utf-8')
if name in ldd_output:
subprocess.check_call(['patchelf', '--remove-needed', name, so_file])
subprocess.check_call(['patchelf', '--add-needed', library_path, so_file])方案2:修改
ldd
脚本。运行vim /usr/bin/ldd
,找到对应位置修改,这个方案可能影响比较大,需要对linux比较熟悉再做尝试。- 手动执行
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!