MJCF 导入
Unreal Robotics Lab 可以导入标准的 MuJoCo XML (MJCF) 文件,并将完整的模型层级结构重建为 Unreal 组件。您可以从 MuJoCo Menagerie 或您自己的项目中获取 .xml 模型,然后将其直接拖入内容浏览器。
导入
- 将
.xml文件拖入虚幻 内容浏览器(Content Browser) 。 UMujocoImportFactory自动作为子进程运行Scripts/clean_meshes.py:- 解析 XML 以查找所有引用的网格资产
- 检测 GLB stem 冲突(例如,
link1.obj和link1.stl两者都产生link1.glb),并重命名它们。 - 将网格转换为 GLB 格式(保留 UV,去除嵌入纹理)
- 生成带有更新网格参考的
_ue.xml - 优雅回退方案:如果缺少 Python 或 trimesh,则使用原始 XML 代替。
- 工厂通过四次解析过程创建
AMjArticulation蓝图: - 第一阶段: 资产(带缩放的网格、带文件路径的纹理、带 RGBA/纹理引用的材质)
- 第二阶段: 默认值(类层次结构作为
UMjDefault组件) - 第三阶段: Worldbody (递归的刚体(body)/几何(geom)/关节(joint)/位点(site)层次结构)
- 第四阶段: 执行器、传感器、肌腱、equalities、关键帧、接触 对/排除
- 将蓝图放置在关卡中,即可进行模拟。
创建的内容
| MJCF 元件 | 虚幻组件 |
|---|---|
<body> |
UMjBody (保留递归层次结构) |
<joint> |
UMjHingeJoint, UMjSlideJoint, UMjBallJoint, UMjFreeJoint |
<geom> |
UMjGeom / 原始子类 |
<site> |
UMjSite |
<actuator> |
UMjMotorActuator, UMjPositionActuator, etc. |
<sensor> |
UMjTouchSensor, UMjGyro, 等 (30 多种类型) |
<tendon> |
UMjTendon |
<equality> |
UMjEquality |
<keyframe> |
UMjKeyframe |
<default> |
UMjDefault |
<camera> |
UMjCamera |
编译器设置
导入器关于 MJCF <compiler> 元素:
| 属性 | 效果 |
|---|---|
angle="degree" / "radian" |
如何解读关节的限制和位置 |
autolimits="true" |
当 range 设置后自动启动限制 |
eulerseq |
用于调整物体姿态的欧拉旋转序列 |
默认值如何工作
MuJoCo XML 中的 <default> 块定义了子元素通过类名继承的共享属性。导入后,这些块会成为 UMjDefault 连接组件树中的组件。
这些组件并非仅供参考,而是实际存在的组件。插件在编译过程中会将它们用于将蓝图转换回 MuJoCo 的内部表示形式。每个组件都会检查其分配的属性 ClassName 是否与默认链匹配,MuJoCo 会在规范编译时应用继承关系,就像处理原始 XML 一样。
这意味着:
- 编辑某个
UMjDefault组件会影响所有引用该默认类的组件。 - 默认层次结构(嵌套默认值)得以保留并正常运行。
- 如果移除默认值,则依赖该默认值的组件将回退到它们自己的显式属性值。
FromTo 解析
使用该 fromto 属性定义的几何体在导入时会解析为显式的 pos、quat和 size。解析过程会考虑类型:
| 几何类型 | 尺寸映射 |
|---|---|
| 胶囊(Capsule) / 圆柱(Cylinder) | size[1] = 沿线段长度的一半 |
| 方框(Box) / 椭圆球(Ellipsoid) | size[2] = 沿线段长度的一半 |
导入后,组件存储的是已解析的变换,fromto 而不是已解析的变换。
材质与纹理
导入器会创建以 XML <material> 名称为键的共享 Unreal 材质实例。所有引用相同材质名称的几何体共享同一个实例(例如,所有 material="white" 使用 <material_name> 的几何体都使用 MI_white)。元素引用的纹理 <texture> 会应用到相应的材质实例上。
网格资产
导入程序会查找 XML 文件所在目录下的网格文件。 到的网格文件会被复制到导入目标目录下的 /Meshes/ 子文件夹中,以避免纹理名称冲突,然后在编译期间注册到 MuJoCo 的 VFS 中。
格式优先级: FBX > GLB > OBJ。导入器会尝试使用 ImportSingleMesh() 函数导入多种路径:首先是 GLB(通过 Interchange),然后是原始 OBJ/STL(通过 FBX 工厂),最后是 FBX 回退。如果所有路径都失败,则会创建不带可视网格的几何体,但该几何体仍作为碰撞图元存在。此时会记录一条警告信息,但编译仍然会成功。
自动网格准备: clean_meshes_trimesh.py 脚本会在导入过程中自动运行(参见上文 导入 部分)。您也可以手动运行它:
python Scripts/clean_meshes.py path/to/robot.xml
这将生成一个包含更新后的网格引用的 _ue.xml 文件,您可以将其拖入 Unreal 中,而不是使用原始 XML 文件。
调试导入问题
启用 AAMjManager 的 bSaveDebugXml 功能,即可在编译后将 scene_compiled.xml 和 scene_compiled.mjb 保存到 Saved/URLab/ 目录。对比原始 MJCF 和编译后的 XML 文件,找出导入/导出不匹配之处(例如缺少元素、属性值错误、默认继承关系损坏)。编译后的 XML 文件也可以加载到原生 MuJoCo 中进行验证。更多信息请参阅 开发者工具 。
导入后
导入的关节是一个普通的虚幻引擎动作者。您可以重新排列组件、添加传感器或摄像机、覆盖属性,或将其保存为可重用的蓝图。XML 仅在导入期间读取——之后,虚幻引擎组件才是最终的数据源。
有关导入流程内部结构的完整详细信息,请参阅 架构 部分。