ubuntu18.04配置mujoco

本文最后更新于:2025年3月15日 下午

ubuntu18.04配置mujoco

流程

安装mujoco

  1. 下载mujoco,解压到~/.mujoco路径下

  2. 下载mjkey.txt,分别存放到~/.mujoco/mjkey.txt~/.mujoco/mujoco200/bin/mjkey.txt

  3. 修改.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

  1. 新建虚拟conda环境,python==3.8

  2. 降低Cython版本,pip install Cython==0.29.30

  3. pip install mujoco-py==2.0.2.8

  4. 测试

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    import 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)

报错

  1. ERROR: Could not open activation key file mjkey.txt

    mjkey.txt存放路径错误..mujoco/mujoco200/bin路径下需要有一个mjkey.txt,./mujoco下面也要有一个mjkey.txt。

  2. Cython.Compiler.Errors.CompileError: xxx/anaconda3/envs/DRL/lib/python3.7/site-packages/mujoco_py/cymj.pyx

    Cython版本降到0.29.30

  3. 最恶心的问题😅——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
    9
    def 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 协议 ,转载请注明出处!