URLab 编辑器
编辑器(URLabEditor)模块提供了将 MuJoCo 的 MJCF XML 定义与虚幻引擎的参与者(Actor)和组件(Component)系统相桥接所需的专用工具。该模块负责处理资源导入流程、网格预处理以及编辑器端的自定义设置,使用户能够在虚幻编辑器环境中管理复杂的机器人资源。
编辑工具的主要目标是自动将层次化的 XML 机器人描述转换为功能性的 AMjArticulation 蓝图,该蓝图包含物理就绪的组件和优化的几何体。
系统概述:从MJCF到蓝图
下图展示了从原始 MJCF 文件到虚幻编辑器中生成机器人的高层流程。
flowchart TD
subgraph subGraph2 ["Asset Space"]
H["StaticMesh Assets"]
I["AMjArticulation Blueprint"]
end
subgraph subGraph1 ["Editor Code Space (URLabEditor)"]
C["UMujocoImportFactory"]
D["MujocoXmlParser"]
E["MujocoMeshImporter"]
F["UMjPythonHelper"]
G["UMujocoGenerationAction"]
end
subgraph subGraph0 ["Natural Language Space"]
A["MJCF XML File"]
B["Mesh Assets (STL/OBJ)"]
end
A --> C
B --> E
C --> D
D --> G
E --> F
F --> H
G --> I
MJCF 导入管线
导入流程是一个多阶段的过程,当将 .xml 文件拖入虚幻内容浏览器时,该流程即开始。UMujocoImportFactory 会拦截此操作,并协调多个专用类将 MuJoCo 场景图重建为虚幻引擎的参与者。
-
1.XML 解析:MujocoXmlParser 读取 MJCF 结构,并将 MuJoCo 元素(物体、关节、几何体)映射到其对应的UMjComponent子类。 尝试运行 clean_meshed.py 来准备网格。
1.1.确保引擎的 Python 是否准备好(包括检查 Python 和依赖的包)。位于 hutb\Build\engine\Engine\Binaries\ThirdParty\Python3\Win64\Python.exe 。
1.2.运行网格准备:python clean_mesh.py g1_29dof_rev_1_0.xml
1.3.将导入用的原始 XML 文件路径写入新建蓝图的类默认对象(Class Default Object, CDO),以便该路径随蓝图资产持久保存并能在编辑器/运行时访问。
-
2.网格处理(使用已准备好的 XML 生成 蓝图 组件):由于 MuJoCo 经常使用可能未针对虚幻引擎优化的 STL(立体光刻、Stereolithography:描述三角面片组成的 3D 模型表面)或 OBJ 文件,因此 MujocoMeshImporter (由 UMjPythonHelper 支持)负责将其转换为 GLB 格式,并进行三角网格清理。
-
3.蓝图生成:编译来保存修改,并确保组件是有效的。 UMujocoGenerationAction 接收解析后的组件树,并通过编程方式构建一个从 AMjArticulation 派生的蓝图类。
导入的资产位于项目的:Content/MuJoCoImports/g1_29dof_rev_1_0_ue_ue_Assets 目录下。
3.0. 预扫描:收集默认网格比例,以便资源解析能够继承这些比例。
3.1 传递:已处理的资产。导入纹理 中的 导入单个纹理 失败,FFileHelper::LoadFileToArray 失败。放在纹理资产变量 TextureAsserts(值 D:\hutb\Unreal\CarlaUE4\Content\Humanoid\robots\g1/groundplane 为空) 中。
核心为递归解析资产: 如果这是一个容器,请在直接子项中查找编译器标签,以便为所有同级项设置目录覆盖。 递归处理顶级容器(不包括上面处理过的标签,如 include/asset)。
3.2. 动态创建组织节点。首先解析编译器设置(角度、eulerseq),以便将其传播到 \
-block 导入中——默认类中的关节范围取决于编译器级别的 angle设置。然后分别解析:默认、接触对和排除、等式约束、关键帧、结构遍历(worldbody 递归导入节点(ImportNodeRecursive) 报错);解析\
有关这些类和数据映射逻辑的详细介绍,请参阅 MJCF导入管线 。
编辑器自定义设置与Python助手
为了满足机器人仿真领域的独特需求,编辑器模块包含了多个用户界面(UI)和后端扩展。
- 自定义细节面板:UMjGeomDetailCustomization 几何组件提供了一个定制界面,允许用户可视化特定于 MuJoCo 的属性(如摩擦力
friction或solimp),这些属性不属于标准虚幻引擎静态网格组件(UStaticMeshComponent)属性的一部分。 - Python 集成:UMjPythonHelper 负责管理绑定的 Python 脚本(如 clean_meshes.py)。它确保编辑器能够获取如 trimesh 和 numpy 等依赖库,以便进行自动网格清理和凸分解。
- 模块结构: URLabEditor 模块与运行时 URLab 模块严格分离,以确保仅供编辑器使用的依赖项(如 UnrealEd 或 KismetCompiler )不会包含在已发布的版本中。
关键编辑工具与脚本
该存储库包含一个 Scripts/ 目录,其中包含支持编辑器管线的独立工具。
| 脚本 | 目的 | 代码参考 |
|---|---|---|
| clean_meshes.py | 将网格转换为 GLB 格式,并修复 Unreal 中的方向(Z轴向上)。 | Scripts/clean_meshes.py48-61 |
| generate_subclasses.py | 为新的 MuJoCo 组件类型构建 C++ 类框架。 | Scripts/generate_subclasses.py37-83 |
代码实体映射:网格清理流程
flowchart LR
subgraph subGraph2 ["Unreal Editor"]
PH["UMjPythonHelper"]
MI["MujocoMeshImporter"]
end
subgraph subGraph1 ["Python Tooling"]
CM["clean_meshes.py"]
F_CM["clean_mesh()"]
F_CV["convert_mesh()"]
end
subgraph subGraph0 ["External Dependencies"]
TM["trimesh"]
NP["numpy"]
end
TM --> F_CM
NP --> F_CM
F_CM --> F_CV
F_CV --> PH
PH --> MI
报错解决方案
-
运行到 GenerateForBlueprintXml() 虚幻编辑器提示:导入"meshes/*.glb"失败。未知扩展名"glb"。
解决:启用 glTF 插件(注意是小写 l 不是大写的 I)。备注:安装 glTF 插件解决不了。
-
调试模式报错:FPlatformMisc::IsDebuggerPresent()在无人值守脚本模式下运行时,一个模态窗口试图接管控制。该窗口已被取消。
解决:在 VS 中点击
开始执行(不调试)。 -
在编辑器中拖入生成的蓝图并运行报错:
MuJoCo compile failed: Error: mesh 'g1_29dof_rev_1_4_pelvis_contour_link' not found in geom 1 Element name 'g1_29dof_rev_1_4_Geom_Mesh1', id 1