1. 项目概述与核心价值
最近在折腾自动驾驶仿真,想把RoadRunner里精心制作的高精度地图弄到Carla里跑起来,结果发现从Carla 0.9.11到UE4Editor,再到RoadRunner的fbx文件,这中间的坑是一个接一个。网上资料要么太老,要么语焉不详,光是版本匹配和路径设置就能卡住半天。今天我就把从RoadRunner导出地图开始,到最终在Carla仿真环境中成功加载的完整流程,以及我踩过的所有坑和解决方案,一次性讲透。无论你是刚接触Carla仿真的研究者,还是想把自家高精地图导入进行算法测试的工程师,这篇指南都能帮你省下大量摸索的时间。整个过程核心就是打通“RoadRunner -> UE4 -> Carla”这条数据流水线,确保模型、材质、碰撞体、语义标签这些关键元素一个不丢地迁移过去。
2. 环境准备与版本对齐:万事开头难
2.1 软件版本“锁死”策略
这是整个流程中最关键、也最容易出错的一步。Carla、Unreal Engine 4 (UE4) 和 RoadRunner 三者之间存在着严格的版本依赖关系,版本不匹配会导致后续所有步骤失败。
- Carla 0.9.11 的UE4版本要求:Carla 0.9.11 官方明确要求使用Unreal Engine 4.24。使用4.25或4.26等更高版本,在编译Carla时几乎百分之百会遇到兼容性错误。因此,第一步就是去Epic Games Launcher的“库” -> “引擎版本”中,精确添加并安装4.24.3这个版本(建议使用该小版本,最为稳定)。
- RoadRunner 版本选择:RoadRunner的版本主要影响其导出插件的功能。经过实测,RoadRunner 2020.1及之后的版本,其针对UE4的导出插件对4.24的支持较好。建议使用2020.1或2021.1。如果你用的是更老的RoadRunner项目文件,可能需要在新版中重新保存或检查导出设置。
- 版本匹配清单:请务必对照下表检查你的环境,这是我用血泪教训换来的兼容性表格:
| 软件组件 | 推荐版本 | 必须避免的版本 | 原因说明 |
|---|---|---|---|
| Carla | 0.9.11 | 0.9.12+ (对于此流程) | 0.9.11是最后一个广泛使用且文档较全的UE4版本,后续版本架构变化大。 |
| Unreal Engine | 4.24.3 | 4.25, 4.26, 4.27 | Carla 0.9.11源码仅适配UE4.24。高版本API变更会导致编译失败。 |
| RoadRunner | 2020.1, 2021.1 | 2019b或更早 | 老版本插件可能不支持UE4.24所需的材质或碰撞体导出功能。 |
| Visual Studio | 2017 / 2019 | 2022 | UE4.24对VS2022支持不佳,编译工具链容易出问题。 |
| Python | 3.7 | 3.8+ | Carla 0.9.11的PythonAPI主要针对3.7测试。 |
注意:安装UE4.24时,务必勾选安装“C++游戏开发”组件和对应的“Windows 10 SDK”,这是编译Carla源码的硬性要求。
2.2 Carla源码获取与编译
不建议使用预编译的Carla版本,因为我们需要其UE4编辑器项目来导入地图。
- 获取源码:使用Git克隆Carla 0.9.11的发布分支。
git clone --branch 0.9.11 https://github.com/carla-simulator/carla.git - 更新子模块:Carla依赖一些第三方库,需要同步。
cd carla git submodule update --init - 关键一步:生成UE4项目文件:在Carla根目录下,运行以下命令。这里有个大坑:官方文档可能让你直接运行
Make launch,但在Windows上,我们需要先确保UE4Editor的路径被正确识别。- 首先,找到你的UE4.24安装目录,通常是
C:\Program Files\Epic Games\UE_4.24。 - 打开“系统属性 -> 高级 -> 环境变量”,在“系统变量”中新建或编辑
UE4_ROOT,将其值设置为上述路径。 - 然后,在Carla根目录打开“x64 Native Tools Command Prompt for VS 2019”(对应你的VS版本),执行:
make launch
Unreal\CarlaUE4\CarlaUE4.uproject文件。第一次编译可能会耗时30分钟到1小时以上,取决于机器性能。 - 首先,找到你的UE4.24安装目录,通常是
实操心得:编译过程中最常见的错误是“找不到
WinSDK”或“MSBuild错误”。99%的原因是你的VS安装时没有勾选“使用C++的桌面开发”和正确的Windows SDK版本。去Visual Studio Installer里修改安装,添加这些组件,然后重启电脑再试。
3. RoadRunner地图导出:细节决定成败
在RoadRunner中完成地图设计后,导出步骤的每一个选项都直接影响后续在UE4和Carla中的效果。
3.1 导出插件配置与安装
确保你的RoadRunner安装了对应版本的“Unreal Engine Datasmith Exporter”插件。在RoadRunner的“工具 -> 插件管理器”中可以查看和管理。安装后,在导出菜单中会出现“Unreal Engine (Datasmith)”选项。
3.2 关键导出参数详解
点击导出后,会弹出一个包含多个标签页的对话框,以下是每个标签页必须检查的核心设置:
General (通用):
Output Directory: 选择一个干净的、路径中无中文和空格的文件夹,例如D:\RR_Exports\MyMap。Format: 选择Unreal Engine (Datasmith) .udatasmith。这是关键,.udatasmith文件包含了场景的完整描述,而不仅仅是几何模型。
Mesh (网格):
Export Method: 选择One File Per Mesh(每个网格一个文件)。虽然“Single File”更简单,但一旦某个模型出问题,整个导入都会失败。分文件导出更利于在UE4中排查问题。Coordinate System: 选择Z-Up (Unreal)。RoadRunner默认是Y-Up,但UE4是Z-Up,这里必须转换,否则地图会“躺”在地上。Export Vertex Colors:务必勾选。RoadRunner将道路标线、车道信息等语义信息存储在顶点颜色中,这是Carla识别车道、人行道等元素的关键。Export Materials:务必勾选。导出材质定义。
Materials (材质):
- 保持默认设置即可。RoadRunner会生成对应的材质实例和纹理。
Terrain (地形):
- 如果场景中有地形,确保勾选导出。地形通常会以高度图或单独网格形式导出。
Additional Options (附加选项):
Export Traffic Signs: 勾选。导出交通标志的几何体和元数据。Export Road Markings: 勾选。导出道路标线。Export Collision Meshes:强烈建议勾选。RoadRunner可以为道路、路缘石等生成简化的碰撞体网格。如果没有,你需要在UE4中手动添加,非常繁琐。
点击导出后,你会在输出目录得到以下几类重要文件:
MyMap.udatasmith: 场景描述文件。MyMap_Assets文件夹: 里面包含所有的.fbx网格文件、纹理贴图。- 可能还有
MyMap_MetaData.json等包含语义信息的元数据文件。
4. UE4Editor中的地图导入与处理
这是将静态地图转化为Carla可交互场景的核心环节。
4.1 创建并准备UE4项目
- 不要直接打开编译生成的
CarlaUE4.uproject。最佳实践是:复制一份这个uproject文件及其所在的CarlaUE4文件夹,重命名为MyCarlaMap(或其他名字),在新的副本上进行操作。这样可以避免污染原始的Carla项目。 - 双击
MyCarlaMap.uproject,UE4Editor会启动并编译项目模块。第一次打开可能会提示“重新编译”,点击确认。
4.2 通过Datasmith插件导入
Carla 0.9.11 已经集成了Datasmith插件。如果未启用,需在“编辑 -> 插件”中搜索“Datasmith”并启用。
- 在UE4内容浏览器中,创建一个新文件夹,例如
Maps/MyRRMap,用于存放所有导入的资源。 - 将RoadRunner导出的整个输出目录(包含
.udatasmith文件和_Assets文件夹)复制到项目Content目录下的某个位置,例如Content/RR_Export。 - 回到UE4编辑器,在内容浏览器中右键点击
Maps/MyRRMap文件夹,选择“导入到关卡...”,然后选择MyMap.udatasmith文件。 - 会弹出Datasmith导入选项对话框。这里有几个关键点:
- 几何体导入:通常保持默认。确保“生成光照贴图UV”被勾选,这对后续场景光照很重要。
- 材质导入:选择“导入材质”。UE4会基于RoadRunner的材质定义创建对应的UE4材质球。
- 纹理导入:选择“导入纹理”。
- 目标内容文件夹:指向你刚才创建的
Maps/MyRRMap。点击“导入”后,UE4会开始处理所有资源。
注意事项:导入过程可能较长,尤其是地图复杂时。导入后,你可能会在“世界大纲视图”中看到一个由许多静态网格体Actor组成的层级结构。同时,在内容浏览器中,会生成大量的静态网格体、材质和纹理资产。
4.3 材质与碰撞体修复
导入后最常见的问题是材质显示为“粉色”(缺失材质)和碰撞体缺失。
材质修复:
- 粉色通常是因为UE4无法自动连接材质节点。你需要手动双击这些粉色材质球,打开材质编辑器。
- 检查纹理采样节点是否正确连接到了基础颜色、法线等引脚。通常,RoadRunner导出的材质结构相对简单,你只需要将对应的纹理贴图(在
_Assets文件夹里找到的T_开头的文件)拖拽到材质图表中,并连接到相应输入即可。 - 一个更高效的方法是:在内容浏览器中搜索导入的材质实例(
MI_开头),检查其父材质是否被正确赋值。有时需要手动指定一个类似M_Road或M_Sidewalk的UE4默认材质作为父材质,然后在其参数中覆盖纹理。
碰撞体修复:
- 如果导出时未生成碰撞体,你需要为每个关键的静态网格体(如道路、建筑、路缘)添加碰撞。
- 在内容浏览器中双击打开一个静态网格体(如
SM_Road)。 - 在静态网格体编辑器中,点击菜单栏的“碰撞 -> 添加简化碰撞体 -> 自动生成凸包分解”。UE4会自动生成一个近似的碰撞体积。
- 对于道路这种长条形物体,自动生成的碰撞可能很粗糙。你可以选择“碰撞 -> 添加盒体简化碰撞”或“添加胶囊体简化碰撞”进行手动调整。目标是让碰撞体尽可能贴近可视网格,但又不要过于复杂影响性能。
4.4 创建Carla所需的地图蓝图
Carla不仅仅需要静态场景,还需要一个特殊的蓝图来定义生成车辆、行人的位置(Spawn Point)、交通灯逻辑、导航信息等。
- 设置玩家起点:在“世界大纲视图”中搜索“PlayerStart”,如果不存在,从模式面板拖拽一个“PlayerStart”到地图中合适的位置(如某条车道旁)。
- 生成车辆和行人出生点:
- Carla通过“目标点”(Target Point)来标记出生位置。在模式面板的“基本”类别下,拖拽多个“目标点”到地图的各条车道起点、人行道旁。
- 选中这些目标点,在细节面板中,为其添加一个标签(Tag)。对于车辆出生点,添加标签
VehicleSpawnPoint;对于行人出生点,添加标签PedestrianSpawnPoint。Carla的Python API会通过这些标签来寻找出生位置。
- 生成导航网格(NavMesh):这是让行人、车辆进行路径规划的基础。点击编辑器工具栏上的“构建”按钮(或按
Ctrl+Shift+;),UE4会为当前关卡生成导航网格。生成后,地面会出现绿色的可行走区域。 - 保存地图:将当前关卡保存为
MyRRMap.umap,存放在Content/Maps/MyRRMap文件夹下。
5. 打包地图并集成到Carla
现在,我们有了一个在UE4编辑器中看起来正常的关卡,但它还不能被Carla的服务器加载。
5.1 配置Carla地图描述文件
Carla服务器通过一个名为*Map.umap的文件和一个同名的.xodr文件(OpenDRIVE道路描述)来识别地图。我们目前只有.umap文件。
- 生成/准备.xodr文件:最准确的方法是从RoadRunner项目中导出OpenDRIVE文件(通常为
.xodr)。在RoadRunner的“文件 -> 导出”中,选择“OpenDRIVE”格式。将导出的MyMap.xodr文件复制到Carla源码目录下的Unreal\CarlaUE4\Content\Carla\Maps\OpenDrive文件夹中(如果没有则创建)。 - 修改Carla地图列表:打开
Unreal\CarlaUE4\Content\Carla\Maps目录,你会发现有Town01,Town02等文件夹。复制其中一个文件夹(如Town01),重命名为MyRRMap。 - 进入
MyRRMap文件夹,你会看到Town01.umap和Town01.xodr。将Town01.umap删除,把我们之前保存的MyRRMap.umap复制进来并重命名为MyRRMap.umap(确保文件名与文件夹名一致)。同样,把Town01.xodr替换为从RoadRunner导出的MyMap.xodr并重命名为MyRRMap.xodr。 - 关键一步:更新地图引用:用文本编辑器打开
Unreal\CarlaUE4\Config\DefaultEngine.ini文件,搜索MapsToCook。你会看到一行类似+MapsToCook=/Game/Carla/Maps/Town01的列表。在这列表的最后,添加新的一行:+MapsToCook=/Game/Carla/Maps/MyRRMap。这告诉UE4在打包时需要包含我们的新地图。
5.2 重新编译并打包Carla
- 关闭UE4编辑器。
- 重新打开“x64 Native Tools Command Prompt”,进入Carla源码根目录(你最初运行
make launch的地方)。 - 运行以下命令进行“开发”构建,这会将我们的新地图编译进Carla:
这会重新编译并启动UE4编辑器,加载的是我们修改过的make launchMyCarlaMap.uproject。在编辑器中,你应该能在“世界场景设置”的地图列表里看到MyRRMap。 - (可选)打包发布版本:如果你需要独立的可执行文件,可以运行:
这个命令会执行一个更长时间的打包过程,最终在make packageDist文件夹下生成一个包含所有资源的独立Carla版本。打包版本中也会包含你的MyRRMap。
6. 在Carla中加载与测试自定义地图
6.1 启动Carla服务器并加载地图
- 如果你使用
make launch启动的编辑器,可以直接在编辑器里点击“运行”来启动本地服务器。 - 如果你打包了独立版本,进入
Dist\CARLA_0.9.11\WindowsNoEditor目录,运行CarlaUE4.exe。这会启动Carla服务器并打开一个窗口。 - 使用Python API连接并加载地图:
如果一切顺利,服务器窗口会加载你自定义的地图场景。import carla # 连接客户端 client = carla.Client('localhost', 2000) client.set_timeout(10.0) # 获取世界对象 world = client.get_world() # 加载自定义地图 world = client.load_world('MyRRMap') # 这里的名字就是文件夹名/地图名
6.2 常见问题与排查技巧实录
即使按照上述步骤,仍然可能遇到各种问题。下面是我遇到过的典型问题及解决方法:
| 问题现象 | 可能原因 | 排查与解决思路 |
|---|---|---|
| 导入UE4后,地图一片空白或只有天空盒 | 1. Datasmith导入失败。 2. 模型比例异常巨大或微小,不在视口内。 | 1. 检查导入日志(输出日志窗口)。确认.udatasmith和.fbx文件路径无误。2. 在世界大纲视图中查找导入的Actor,选中后按 F键聚焦。检查其变换(Transform)中的缩放值,RoadRunner导出单位可能是厘米,而UE4默认1单位=1厘米,通常缩放应为(1,1,1)。 |
| 材质全部显示为粉色 | 1. 纹理路径丢失。 2. 材质域(Material Domain)设置错误。 | 1. 打开一个粉色材质,检查所有纹理采样节点的纹理引用是否有效(无黄色警告)。 2. 在材质细节面板,检查“材质域”是否设置为“表面”(Surface),着色模型是否为“默认点亮”。 |
| Carla服务器加载地图时崩溃 | 1. 地图中缺少必要的Carla Actor。 2. .xodr文件与.umap地图不匹配。3. 地图中有未正确设置碰撞的复杂网格体。 | 1. 确保地图中有至少一个PlayerStart。2. 用文本编辑器打开 .xodr文件,检查其道路网络的基本结构是否与你的地图吻合。可以使用libcarla中的工具进行校验。3. 在UE4编辑器中,运行“碰撞分析”(碰撞 -> 显示碰撞),检查是否有网格体缺失碰撞或碰撞过于复杂。简化复杂物体的碰撞。 |
| 车辆生成后掉入地下或浮在空中 | 1. 车辆生成点(Spawn Point)的Z轴坐标不对。 2. 地面网格体没有碰撞体。 | 1. 在UE4中检查标记为VehicleSpawnPoint的目标点,其位置是否精确放在道路网格体的表面上(可使用端点吸附)。2. 确保道路静态网格体已添加碰撞(见4.3节)。 |
| 行人或车辆无法移动 | 导航网格(NavMesh)未生成或生成不完整。 | 1. 在UE4编辑器中,按“P”键显示导航网格,查看绿色区域是否覆盖了人行道和车道。 2. 确保用于行走的网格体(如人行道)在“项目设置 -> 导航网格体 -> 导航区域”中,被设置为“可行走”的导航区域。在静态网格体的细节面板中,也可以设置其“导航区域类”。 |
Python API无法找到MyRRMap | 1. 地图未正确添加到DefaultEngine.ini的MapsToCook列表。2. 打包/编译后未重启服务器。 | 1. 双重检查DefaultEngine.ini文件的修改是否正确保存。2. 运行 client.get_available_maps()查看服务器当前可用的地图列表,确认MyRRMap在其中。 |
6.3 性能优化与后续工作
地图成功加载后,你可能发现帧率较低。这是因为从RoadRunner导入的模型通常面数较高,且UE4默认的渲染设置并非最优。
- LOD(细节层次)生成:在内容浏览器中,为主要的静态网格体(如建筑、复杂植被)生成LOD。右键点击网格体 -> 资源操作 -> 生成LOD。这可以显著减少远处物体的渲染开销。
- 光照烘焙:如果你使用了静态光照,需要对光照进行烘焙(构建光照),以获得更好的视觉效果和性能。但这过程非常耗时,建议在最终版本确定后再进行。
- 添加Carla特效:可以在地图中添加Carla特有的天气系统、路面湿滑效果等,这些需要通过Carla的Python API或UE4的Carla插件蓝图进行控制。
- 语义分割与深度图:确保你的材质能够支持Carla的语义分割和深度渲染输出。这通常需要检查材质中是否使用了正确的着色器节点和渲染目标。
整个流程走下来,虽然步骤繁琐,但一旦打通,你就拥有了将任意高精地图转化为可仿真场景的能力。这套方法不仅适用于RoadRunner,其核心思路(导出通用格式->UE4导入修复->集成到Carla框架)对于其他建模软件(如Blender、3ds Max)导出的模型也同样具有参考价值。最关键的是保持版本一致、耐心处理材质与碰撞、以及理解Carla加载地图的配置文件规则。希望这篇超详细的指南能让你少走弯路。