建模概述
MuJoCo 中有几个称为“模型”的实体。 用户在以 MJCF 或 URDF 编写的 XML 文件中定义模型。 然后,该软件可以在不同媒体(文件或内存)和不同描述级别(高或低)上创建同一模型的多个实例。 所有组合都是可能的,如下表所示:
High Level | Low Level | |
---|---|---|
File | MJCF/URDF (XML) | MJB (binary) |
Memory | mjCModel (C++ class) | mjModel (C struct) |
所有运行时计算均使用 mjModel 执行,该模型太复杂而无法手动创建。 这就是为什么我们有两个层次的建模。 高层的存在是为了方便用户:它的唯一目的是编译成可以执行计算的低层模型。 生成的 mjModel 可以加载并保存到二进制文件 (MJB) 中,但是这些文件是特定于版本的并且无法反编译,因此模型应始终保留为 XML 文件。
(内部)C++ 类 mjCModel 与 MJCF 文件格式大致一一对应。 XML 解析器解释 MJCF 或 URDF 文件并创建相应的 mjCModel。 原则上,用户可以通过编程方式创建 mjCModel,然后将其保存到 MJCF 或编译它。 然而,此功能尚未公开,因为无法从独立于编译器的库导出 C++ API。 有计划围绕它开发一个 C 包装器,但目前解析器和编译器总是一起调用,并且只能在 XML 中创建模型。
下图显示了获取 mjModel 的不同路径(同样,第二个要点尚不可用):
- (文本编辑器)→ MJCF/URDF 文件→(MuJoCo parser → mjCModel → MuJoCo compiler)→ mjModel
- (用户代码)→ mjCModel →(MuJoCo compiler)→ mjModel
- MJB 文件→(MuJoCo loader)→ mjModel
示例
这是 MuJoCo 的 MJCF 格式的简单模型。 它定义了一个固定在世界上的平面、一个可以更好地照亮物体并投射阴影的灯光,以及一个具有 6 个自由度的浮动框(这就是“自由”关节的作用)。简单的一个MJCF文件
<!-- demo_1.xml -->
<mujoco>
<worldbody>
<light diffuse=".5 .5 .5" pos="0 0 3" dir="0 0 -1"/>
<geom type="plane" size="1 1 0.1" rgba=".9 0 0 1"/>
<body pos="0 0 10" quat=".33 .44 .55 .66">
<joint type="free"/>
<geom type="box" size=".1 .2 .3" rgba="0 .9 0 1"/>
</body>
</worldbody>
</mujoco>
下面从零搭建这个MuJoCo可视化应用。使用Cmake构建MinGW Makefiles,(个人习惯如下结构写c),从CMakeLists.txt开始。需要预先配置好MinGW c编译环境。
建立项目结构如下:
使用MuJoCo发布版Releases · deepmind/mujoco (github.com)里的Sample下basic.cc文件,这是加载MJCF并OpenGL可视化的demo。MuJoCo使用OpenGL渲染,对接GLFW,OpenGL推荐有认识,推荐学习资源:主页 - LearnOpenGL CN (learnopengl-cn.github.io)。
- include:头文件,从MuJoCo和GLFW发布版里整个拷贝
- lib:库文件glfw3.dll mujoco.lib mujoco.dll
- model:存放MJCF模型,上述demo_1.xml
- src:源码,MuJoCo发布版Sample内的basic.cc
- CMakeLists.txt:cmake必须
CMakeLists.txt内简单一写:
cmake_minimum_required(VERSION 3.5)
project(MuJoCoDemo_1)
# 安装路径
set(CMAKE_INSTALL_PREFIX ${CMAKE_CURRENT_SOURCE_DIR}/install)
# 库路径
set(LIB_DIR ${CMAKE_CURRENT_SOURCE_DIR}/lib)
# include路径
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
# 抓代码
file(GLOB SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cc)
# 生成可执行程序MuJoCoDemo_1
add_executable(MuJoCoDemo_1 ${SOURCES})
# 链接glfw3和mujoco库
target_link_libraries(MuJoCoDemo_1 ${LIB_DIR}/mujoco.lib)
target_link_libraries(MuJoCoDemo_1 ${LIB_DIR}/glfw3.dll)
# install到一起去
install(FILES ${LIB_DIR}/mujoco.dll ${LIB_DIR}/glfw3.dll ${CMAKE_CURRENT_SOURCE_DIR}/model/demo_1.xml
DESTINATION ${CMAKE_INSTALL_PREFIX})
install(TARGETS MuJoCoDemo_1
RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX})
到项目目录中,执行:
cmake -B ./build -G "MinGW Makefiles"
cmake --build ./build
cmake --install ./build
进入install路径下,可以测试程序了,很简单:
.\MuJoCoDemo_1.exe .\demo_1.xml
结果,天上掉下个小绿块儿,按下Backspace可以reset重新掉落:
这个红色的平面和绿色的快都是由demo_1.xml中描述的。MJCF建模语言参考MJCF XML Reference