博主在安装mujoco以及mujoco_py的过程中,遇到无数坑,并且感觉我们天朝还没有人对以上的两样东西写出完整的安装教程啊!苦逼的我只能去Github上扣人家的issues,基本上,上面出现的问题,博主都遇到了(心累),咳咳,进入正题。这里我安装的是mjpro150以及mujoco_py1.50.1.34.
  • 1
  • 2

我的环境
Ubuntu 16.04 64bit
cuda 8.0
cudnn 6.0
python3.5.2
tensorflow-gpu 1.4.1

Mujoco安装

1.去Mujoco官网下载mjpro150 linux。
2.在home目录下创建隐藏文件夹mujoco,并将刚才下载好的安装包解压到这个文件夹下。

mkdir ~/.mujoco
cp mjpro150_linux.zip ~/.mujoco
cd ~/.mujoco
unzip mjpro150_linux.zip
  • 1
  • 2
  • 3
  • 4
  • 5

3.在官网的license界面,下载getid_linux,获取该执行程序的可执行权限后,运行此程序,获得你computer_id.填写你的信息,下载免费30天的license,博主直接获取了学生免费license,可以用一年,非学生用户是要付钱的。总之你会获得一个mjkey.txt文件,拷贝到刚才创建的文件夹下面,以及mjpro150的bin目录里。
运行getid_linux:

chmod +x getid_linux
./getid_linux
  • 1
  • 2

拷贝许可证:

cp mjkey.txt ~/.mujoco
cp mjkey.txt ~/.mujoco/mjpro150/bin
  • 1
  • 2

4.添加环境变量

gedit ~/.bashrc
  • 1

内容如下:

export LD_LIBRARY_PATH=~/.mujoco/mjpro150/bin${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
export MUJOCO_KEY_PATH=~/.mujoco${MUJOCO_KEY_PATH}
  • 1
  • 2

说明:没有这一步,运行下面内容的时候,会报以下错,几个动态链接没找到:

./simulate: error while loading shared libraries: libmujoco150.so: cannot open shared object file: No such file or directory
  • 1
ldd simulate
  • 1

出现以下信息,bin目录下三个链接文件都没有找到:

linux-vdso.so.1 =>  (0x00007fffb27f8000)
    libmujoco150.so => not found
    libGL.so.1 => /usr/lib/nvidia-384/libGL.so.1 (0x00007fca30c9f000)
    libglew.so => not found
    libglfw.so.3 => not found
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fca30995000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fca305cb000)
    libnvidia-tls.so.384.111 => /usr/lib/nvidia-384/tls/libnvidia-tls.so.384.111 (0x00007fca303c6000)
    libnvidia-glcore.so.384.111 => /usr/lib/nvidia-384/libnvidia-glcore.so.384.111 (0x00007fca2e509000)
    libX11.so.6 => /usr/lib/x86_64-linux-gnu/libX11.so.6 (0x00007fca2e1cf000)
    libXext.so.6 => /usr/lib/x86_64-linux-gnu/libXext.so.6 (0x00007fca2dfbc000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fca2ddb8000)
    /lib64/ld-linux-x86-64.so.2 (0x000056302c1db000)
    libxcb.so.1 => /usr/lib/x86_64-linux-gnu/libxcb.so.1 (0x00007fca2db96000)
    libXau.so.6 => /usr/lib/x86_64-linux-gnu/libXau.so.6 (0x00007fca2d991000)
    libXdmcp.so.6 => /usr/lib/x86_64-linux-gnu/libXdmcp.so.6 (0x00007fca2d78b000)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

添加的环境变量的第二条是为安装mujoco_py做准备,这里直接先写上了。
5.进入bin目录下,运行simulate,拖动xml文件进去,会看到下图:

cd ~/.mujoco/mjpro150/bin
./simulate
  • 1
  • 2

这里写图片描述

Mujoco_py的安装

博主的安装方法并不唯一,另外注意的是,安装完mujoco_py之后,3D渲染器的功能没有实现,但是别担心,博主后面会提出补救措施,如果介意的话,请查阅其他资料。
1.下载mujoco_py的源码,解压到你指定的目录下,比如home目录。
2.先把可能缺的东西装全, 建议去更换一下软件源。

sudo apt-get update -q
sudo DEBIAN_FRONTEND=noninteractive apt-get install -y curl git libgl1-mesa-dev libgl1-mesa-glx libglew-dev libosmesa6-dev python3-pip python3-numpy python3-scipy net-tools unzip vim wget xpra xserver-xorg-dev
sudo apt-get clean
rm -rf /var/lib/apt/lists/*
  • 1
  • 2
  • 3
  • 4

3.安装patchelf

sudo -s
curl -o /usr/local/bin/patchelf https://s3-us-west-2.amazonaws.com/openai-sci-artifacts/manual-builds/patchelf_0.9_amd64.elf
chmod +x /usr/local/bin/patchelf
  • 1
  • 2
  • 3

4.确认显卡驱动安装正确,cuda、cudnn安装无误,进行下一步操作

cp ~/mujoco-py-master/vendor/10_nvidia.json /usr/share/glvnd/egl_vendor.d/10_nvidia.json
  • 1

5.进入mujoco_py目录里,执行以下语句,把依赖包装好。

cd ~/mujoco-py-master
cp requirements.txt requirements.dev.txt mujoco_py
cd mujoco_py
sudo pip3 install -r requirements.txt
sudo pip3 install -r requirements.dev.txt
  • 1
  • 2
  • 3
  • 4
  • 5

6.安装

cd ~/mujoco-py-master/vendor
./Xdummy-entrypoint
cd ..
sudo python3 setup.py install
  • 1
  • 2
  • 3
  • 4

这里注意的是,博主都是sudo pip3安装的,会安装到/usr/local/lib/python3.5/dist-packages这个目录下,当然,也可以不加sudo,会安装到/home/ls/.local/lib/python3.5/site-packages里面,注意的是,要么都加,要么都不加,不然会出现一些包找不到的问题。
7.测试是否可用:
如果你像我一样sudo安装的话,建议你第一次先sudo python3 打开编辑界面,import mujoco_py,不然会出现以下报错:
这里写图片描述
执行上一步操作后,运行以下代码:
这里写图片描述
运行examples下面的body_interaction.py ,会报错:
这里写图片描述
这个问题在Github上有热烈讨论,见issues,mujoco_py.MjViewer不能用,不能显示你的控制成果。不过别着急,可以自己写渲染器,比如我在issues回答里面找到的这个:

import glfw
import numpy as np
from OpenGL.GLU import *
from OpenGL.GL import *

class Viewer():
    def __init__(self, sim):
        self.sim = sim

        if not glfw.init():
            return
        # Create a windowed mode window and its OpenGL context
        self._window = glfw.create_window(640, 480, "Hello World", None, None)
        if not self._window:
            glfw.terminate()
            return

        # Make the window's context current
        glfw.make_context_current(self._window)

    def render(self):
        # Make the window's context current
        glfw.make_context_current(self._window)
        if glfw.window_should_close(self._window):
            glfw.terminate()

        self.image = self.sim.render(640, 480).astype(np.float) / 255.0

        # Render here, e.g. using pyOpenGL
        self.texture = glGenTextures(1)
        glEnable(GL_TEXTURE_2D)
        glPixelStorei(GL_UNPACK_ALIGNMENT, 1)
        glBindTexture(GL_TEXTURE_2D, self.texture)
        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR)
        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)
        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP)
        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP)
        glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE)
        glTexImage2D(GL_TEXTURE_2D, 0,
                     GL_RGB,
                     self.image.shape[1], self.image.shape[0], 0,
                     GL_RGB,
                     GL_FLOAT,
                     self.image)
        glDisable(GL_TEXTURE_2D)

        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
        glClearColor(0., 0., 0., 0.)
        glClearDepth(1)
        glMatrixMode(GL_MODELVIEW)
        glLoadIdentity()
        glBindTexture(GL_TEXTURE_2D, self.texture)
        glEnable(GL_TEXTURE_2D)
        # draw a textured quad, shrink it a bit so the edge is clear
        glBegin(GL_QUADS)
        glTexCoord2f(0., 0.)
        glVertex3f(-0.9, -0.9, 0.)
        glTexCoord2f(1., 0.)
        glVertex3f(0.9, -0.9, 0.)
        glTexCoord2f(1., 1.)
        glVertex3f(0.9, 0.9, 0.)
        glTexCoord2f(0., 1.)
        glVertex3f(-0.9, 0.9, 0.)
        glEnd()
        glDisable(GL_TEXTURE_2D)

        # Swap front and back buffers
        glfw.swap_buffers(self._window)

        # Poll for and process events
        glfw.poll_events()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71

调用这个viewer可以勉强使用,检测运行动态。

总结

其实mujoco可以用c++语言控制,但是博主最近在做强化学习下的控制,主要用的python代码,对python的环境熟悉一些,所以踏遍所有坑也要安装mujoco_py。当然还有一些不完美,比如3D渲染器不能用,issues上也没有给出有效解决措施,只能先用上面的代替一下,后期会继续改进。另外,后期博主会更新一些mujoco中xml代码的编写规范,和mujoco_py的运用,希望做强化学习控制的小伙伴多多交流。比心~*^_^*~


Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐