DeepMimic环境配置

1. 前言

DeepMimic是一种基于深度强化学习的技术,用于生成高质量的人类样式角色动画。这项技术旨在让虚拟角色学会像人类一样执行各种动作,例如跑步、跳跃、跌倒等。通过深度强化学习算法,虚拟角色可以从试错中学习,逐渐改进其动作的流畅性和逼真度。

DeepMimic的核心思想是借助深度神经网络来学习动作控制策略,使得虚拟角色能够在仿真环境中执行各种复杂的动作。这种技术在游戏开发、动画制作以及机器人控制等领域具有广泛的应用前景。
总的来说,DeepMimic代表了深度学习在动作生成和控制方面的前沿应用,为虚拟角色赋予了更加逼真和智能的行为表现能力。

  • DeepMimic基于Tensorflow框架
  • 物理仿真与可视化部分基于Bullet引擎
  • Python&C++自身环境
  • SWIGC++&Python两种语言接口通信
  • MPI是一个跨语言的通讯协议,用于实现高性能计算;
  • MPI4py是一个构建在MPI之上的Python库。

本篇记录一下DeepMimic环境配置踩的一些坑。

2. 环境配置(Win10)

2.1. Python相关

2.1.1. Conda

Conda下载并安装, 以下三者选其一

  • Anaconda
  • Miniconda
  • Miniforge
    因涉及商业性质, geren 使用的Miniforge

2.1.2. Python

conda create -n test_deepmimic python=3.7
conda activate test_deepmimic

Deepmimic用到的是tensorflow-1.13.0,对应的Python版本为3.5-3.7

2.1.3. PyOpenGL

  • PyOpenGL‑3.1.6‑cp37‑cp37m‑win_amd64.whl
  • PyOpenGL_accelerate‑3.1.6‑cp37‑cp37m‑win_amd64.whl

原作者cgohlke下载站点已不维护, 寻到的一个下载方法, 更换成了新的类似下载站点, 若需下载其他版本whl文件, 后缀改成对应要下载的版本文件夹&文件名即可。

// PyOpenGL‑3.1.6‑cp37‑cp37m‑win_amd64.whl对应的下载站点
// https://download.lfd.uci.edu/pythonlibs/archived/cp37/PyOpenGL‑3.1.6‑cp37‑cp37m‑win_amd64.whl
// PyOpenGL_accelerate‑3.1.6‑cp37‑cp37m‑win_amd64.whl对应的下载站点
// https://download.lfd.uci.edu/pythonlibs/archived/cp37/PyOpenGL_accelerate‑3.1.6‑cp37‑cp37m‑win_amd64.whl

进入test_deepmimic环境

pip install PyOpenGL-3.1.6-cp37-cp37m-win_amd64.whl
pip install PyOpenGL_accelerate-3.1.6-cp37-cp37m-win_amd64.whl

2.1.4. 其他相关依赖

  • tensorflow
  • mpi4py
  • numpy
pip install tensorflow==1.13.1
pip install mpi4py
pip install numpy

2.2. C++相关

2.2.1. Bullet

下载Bullet 2.88,打开 build_visual_studio_vr_pybullet_double.bat,修改myvarconda里的Python路径目录。

该项目用的是单精度,所以需将 premake4 这句里面的 –double 删掉,表示使用单精度编译,不删掉的话之后编译一定会出现链接错误。

双击 build_visual_studio_vr_pybullet_double.bat,在 build3/vs2010/ 下会生成文件,使用对应Visual Studio版本打开0_Bullet3Solution.sln,解决方案默认版本为2019, 个人用的是2019, 做了重定向。

打开之后,选择 Release x64,可以直接点击生成解决方案构建整个项目,但其实只会用到其中三个,Bullet3Collision、Bullet3Dynamics、LinearMath。

构建好之后,在 bin 目录找到 BulletDynamics_vs2010_x64_release.lib、BulletCollision_vs2010_x64_release.lib、LinearMath_vs2010_x64_release.lib,把它们名字里的 _vs2010_x64_release 去掉,即改名为 BulletDynamics.lib、BulletCollision.lib、LinearMath.lib.

为什么要改名?
DeepMimic 链接库引用的库名配置如此, 或直接更改 DeepMimic 引用的库名也可。

2.2.2. OpenGL

OpenGL 一般电脑自带了,版本需要 >= 3.2.

2.2.3. 其他相关依赖

  • Eigen 3.3.7, 解压即可
  • freeglut 3.0.0
  • glew 2.1.0, 解压即可
  • swig 4.0.0, 解压即可
  • MS-MPI 10.1.2, 直接安装

其中仅freeglut需源码编译, 借助CMake工具构建Visual Studio解决方案, 选择Release x64来编译

编译完成后, 根据本地生成或安装目录, 配置如下环境变量

必须配置SWIG_DIR该变量, 编译工程需要

可使用命令

PATH

查看系统环境变量是否生效

2.3. Build解决方案

2.3.1. DeepMimic仓库拉取

git clone https://github.com/xbpeng/DeepMimic.git

2.3.2. DeepMimicCore编译

  • 打开DeepMimicCore目录下的DeepMimicCore.sln,设置为 Release_Swig x64

打开项目属性

  • 在 C/C++ -> 常规,修改附加包含目录,将 bullet、freeglut、glew、python 的 include、eigen 添加进去
  • 在 C/C++ -> 预处理器 添加一条预处理器定义 _USE_MATH_DEFINES
  • 在 链接器->常规,修改附加库目录,将 bullet、freeglut、glew、python 的 lib 路径添加进去

配置完成后Build, 成功的话会生成一个_DeepMimicCore.pyd的python动态库.

2.3.3. DeepMimic编译

打开 DeepMimic.sln,配置Conda创建的 Python 环境

选择已准备好的Python环境或新建环境

在项目属性中配置一下脚本参数,随便选一个 args/ 下的配置文件

开始运行, 理论上可以看到小人的动作

3. 期间遇到的问题

3.1. ‘ImportError: No module named xxx’

可能是xxx.pyd所在路径不在sys.path中

解决方法: import之前用sys.path.append()方法加入xxx.pyd所在路径,确定当前路径推荐用os.path.realpath(‘.’)

3.2. ‘ImportError: DLL load failed: 找不到指定的程序’

使用Python import 模块时, 模块的搜索路径次序为(前面会覆盖之后出现的同名模块)
1>. 程序的主目录(交互模式下当前的工作目录或 脚本文件所在的目录)
2>. 环境变量 PYTHONPATH目录(如果已经进行了设置)
3>. 标准链接库目录(标准库模块所在目录 C:\Python27或C:\Python27\Lib\site-packages 目录中)
4>. 任何放在标准链接库目录中的.pth文件中记录的目录

出现 No module 错误时,说明无法找到对应的 .pyd 文件(Python中的动态链接库文件)
可能的原因是
a. 该 _DeepMimicCore.pyd 文件不在搜索目里。(需拷入到搜索目录下 或 将其目录设置到PYTHONPATH中)
b. 该 module的 名字有问题, 比如输错了或 应该为Debug版(如应该为 _DeepMimicCore_d.pyd, Debug版的都需在 Python_d.exe中执行,且都需加_d后缀)

参考CSDN上Python动态库导入问题.

3.3. Protobuf版本问题

在当前Conda环境下

pip uninstall protobuf

重新安装protobuf

pip install protobuf==3.19.0

参考CSDN上Descriptors cannot not be created directly.

3.4. glutInit未定义

Traceback (most recent call last): File "DeepMimic.py", line 314, in <module> main() File "DeepMimic.py", line 306, in main init_draw() File "DeepMimic.py", line 267, in init_draw glutInit()   File "E:\ProgramData\miniforge-pypy3\envs\test_deepmimic\lib\python3.7\site-packages\OpenGL\GLUT\special.py", line 333, in glutInit _base_glutInit( ctypes.byref(count), holder ) File "E:\ProgramData\miniforge-pypy3\envs\test_deepmimic\lib\python3.7\site-packages\OpenGL\platform\baseplatform.py", line 425, in __call__ self.__name__, self.__name__, OpenGL.error.NullFunctionError: Attempt to call an undefined function glutInit, check for bool(glutInit) before calling

可能PyOpenGL库版本问题, 参照环境配置(Win10)指定安装对应的PyOpenGL Arm64版本

3.5. glew32的dll导入问题

Traceback (most recent call last): File "E:\Workspaces\dl\deepmimic\DeepMimic.py", line 9, in <module> from env.deepmimic_env import DeepMimicEnv File "E:\Workspaces\dl\deepmimic\env\deepmimic_env.py", line 3, in <module> from DeepMimicCore import DeepMimicCore File "E:\Workspaces\dl\deepmimic\DeepMimicCore\DeepMimicCore.py", line 13, in <module> from . import _DeepMimicCore ImportError: DLL load failed: The specified module could not be found

将glew32.dll添加进系统环境变量, 诸如变量值E:\Workspaces\dl\glew-2.1.0\bin\Release\x64\, 参考Github上的Issure.

3.6. GL相关函数执行的问题

出现glutPostRedisplay相关函数问题

注释对应代码段, 如图所示, 可能会有其他隐患, 但这样尝试过目前可行, 参考Github上的Issure.

4. 示例演示

5. 参考

1.DeepMimic 实践 | Windows 下 DeepMimic 的环境配置
2.DeepMimic作者官方站点