编译安装
MuJoCo的代码质量非常高并且代码量并不庞大,因此适合进行学习。任何开源项目学习的第一步都是先编译源码,把整个环境跑通。
在github仓库下载2.3.6版本的源码,解压后创建build文件夹。然后cd到buidl目录下运行
cmake .. #配置cmake
cmake --build . #编译
cmake .. -DCMAKE_INSTALL_PREFIX=/opt/mujoco #安装位置设为/opt/mujoco
cmake --install . #安装
这个cmake只自动编译了MuJoCo的主体,没有python binding,python部分需要另外弄,我的主要目的是学习MuJoCo本身,因此这个先不搞。安装完成后运行,/opt/mujoco/bin 目录下的simulate,仿真器可以启动,将源码中提供的模型拽进去,也可以正常仿真,说明安装成功了。
目录分析
根据官方文档,源码主要分为6部分:
- Engine : 物理引擎,由C编写
- Parser :xml解释器,由C++编写,将MJCF模型文件生成mjCModel(C++对象)
- Compiler : 编译器,由C++编写,将mjCModel C++对象转为mjModel(C结构体)
- Abstract visualizer :抽象可视化,由C编写
- OpenGL renderer : 渲染引擎,可替换
- UI framework : UI框架
源码目录src下有6个文件夹:
- cc : 只有一个文件array_safety.h其中提供了几个函数来代替标准库中的内容
- engine : 应该是Engine部分的代码,是我们学习的核心
- xml :应该是Parser和Compiler的代码
- render : 应该是Abstract visualizer和OpenGL renderer的代码
- ui : 应该是UI框架的代码
- user :提供给用户的封装代码
项目组织结构
- cmake : cmake 文件夹
- dist : dist文件夹
- doc : 文档
- include : 头文件
- introspect :暂不确定,目测是给python用的
- model :一些示例模型
- plugin : 插件
- python : python binding
- sample :示例代码
- simulate :simulate仿真器的源码
- src :源码
- test : 测试代码
- unity :暂不确定,应该是给unity用的内容
构建过程
以上部分是根据文档和文件夹名称得到的信息,其中有不确定的部分,真正要弄明白还是得看看项目是怎么构建的。来分析一下MuJoCo的cmake文件。
include(MujocoOptions)
include(MujocoMacOS)
include(MujocoDependencies)
51到53行包含了cmake目录下的这三个文件,进行了一些配置,拉取了一些依赖。
其中添加的依赖有:
- lodepng : C++的png库
- TinyXML-2 :XML库
- tinyobjloader :对象加载器
- libccd :Libccd是用于两个凸形状之间的碰撞检测的库。
- qhull : convex hull、Delaunay三角刨分等
- Eigen : 线性代数库
- Abseil : Abseil是一个开源的c++库代码集合,旨在增强c++标准库。Abseil库代码是从Google自己的c++代码库中收集的,经过了广泛的测试并在生产中使用。
- gtest : 测试框架
- benchmark :测试框架
add_subdirectory(plugin/elasticity)
add_subdirectory(plugin/sensor)
add_subdirectory(src/engine)
add_subdirectory(src/user)
add_subdirectory(src/xml)
add_subdirectory(src/render)
add_subdirectory(src/ui)
编译时添加了这些文件夹,说明除了src下的源码,还是用了plugin下的两个插件中的源码。