从RoadRunner到Carla:高精地图导入与自动驾驶仿真全流程实战
2026/8/4 11:14:47 网站建设 项目流程

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项目文件,可能需要在新版中重新保存或检查导出设置。
  • 版本匹配清单:请务必对照下表检查你的环境,这是我用血泪教训换来的兼容性表格:
软件组件推荐版本必须避免的版本原因说明
Carla0.9.110.9.12+ (对于此流程)0.9.11是最后一个广泛使用且文档较全的UE4版本,后续版本架构变化大。
Unreal Engine4.24.34.25, 4.26, 4.27Carla 0.9.11源码仅适配UE4.24。高版本API变更会导致编译失败。
RoadRunner2020.1, 2021.12019b或更早老版本插件可能不支持UE4.24所需的材质或碰撞体导出功能。
Visual Studio2017 / 20192022UE4.24对VS2022支持不佳,编译工具链容易出问题。
Python3.73.8+Carla 0.9.11的PythonAPI主要针对3.7测试。

注意:安装UE4.24时,务必勾选安装“C++游戏开发”组件和对应的“Windows 10 SDK”,这是编译Carla源码的硬性要求。

2.2 Carla源码获取与编译

不建议使用预编译的Carla版本,因为我们需要其UE4编辑器项目来导入地图。

  1. 获取源码:使用Git克隆Carla 0.9.11的发布分支。
    git clone --branch 0.9.11 https://github.com/carla-simulator/carla.git
  2. 更新子模块:Carla依赖一些第三方库,需要同步。
    cd carla git submodule update --init
  3. 关键一步:生成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
    这个命令会启动一个漫长的编译过程,它会编译C++客户端库、PythonAPI等,并最终生成Unreal\CarlaUE4\CarlaUE4.uproject文件。第一次编译可能会耗时30分钟到1小时以上,取决于机器性能。

实操心得:编译过程中最常见的错误是“找不到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中手动添加,非常繁琐。

点击导出后,你会在输出目录得到以下几类重要文件:

  1. MyMap.udatasmith: 场景描述文件。
  2. MyMap_Assets文件夹: 里面包含所有的.fbx网格文件、纹理贴图。
  3. 可能还有MyMap_MetaData.json等包含语义信息的元数据文件。

4. UE4Editor中的地图导入与处理

这是将静态地图转化为Carla可交互场景的核心环节。

4.1 创建并准备UE4项目

  1. 不要直接打开编译生成的CarlaUE4.uproject。最佳实践是:复制一份这个uproject文件及其所在的CarlaUE4文件夹,重命名为MyCarlaMap(或其他名字),在新的副本上进行操作。这样可以避免污染原始的Carla项目。
  2. 双击MyCarlaMap.uproject,UE4Editor会启动并编译项目模块。第一次打开可能会提示“重新编译”,点击确认。

4.2 通过Datasmith插件导入

Carla 0.9.11 已经集成了Datasmith插件。如果未启用,需在“编辑 -> 插件”中搜索“Datasmith”并启用。

  1. 在UE4内容浏览器中,创建一个新文件夹,例如Maps/MyRRMap,用于存放所有导入的资源。
  2. 将RoadRunner导出的整个输出目录(包含.udatasmith文件和_Assets文件夹)复制到项目Content目录下的某个位置,例如Content/RR_Export
  3. 回到UE4编辑器,在内容浏览器中右键点击Maps/MyRRMap文件夹,选择“导入到关卡...”,然后选择MyMap.udatasmith文件。
  4. 会弹出Datasmith导入选项对话框。这里有几个关键点:
    • 几何体导入:通常保持默认。确保“生成光照贴图UV”被勾选,这对后续场景光照很重要。
    • 材质导入:选择“导入材质”。UE4会基于RoadRunner的材质定义创建对应的UE4材质球。
    • 纹理导入:选择“导入纹理”。
    • 目标内容文件夹:指向你刚才创建的Maps/MyRRMap。点击“导入”后,UE4会开始处理所有资源。

注意事项:导入过程可能较长,尤其是地图复杂时。导入后,你可能会在“世界大纲视图”中看到一个由许多静态网格体Actor组成的层级结构。同时,在内容浏览器中,会生成大量的静态网格体、材质和纹理资产。

4.3 材质与碰撞体修复

导入后最常见的问题是材质显示为“粉色”(缺失材质)和碰撞体缺失。

  1. 材质修复

    • 粉色通常是因为UE4无法自动连接材质节点。你需要手动双击这些粉色材质球,打开材质编辑器。
    • 检查纹理采样节点是否正确连接到了基础颜色、法线等引脚。通常,RoadRunner导出的材质结构相对简单,你只需要将对应的纹理贴图(在_Assets文件夹里找到的T_开头的文件)拖拽到材质图表中,并连接到相应输入即可。
    • 一个更高效的方法是:在内容浏览器中搜索导入的材质实例(MI_开头),检查其父材质是否被正确赋值。有时需要手动指定一个类似M_RoadM_Sidewalk的UE4默认材质作为父材质,然后在其参数中覆盖纹理。
  2. 碰撞体修复

    • 如果导出时未生成碰撞体,你需要为每个关键的静态网格体(如道路、建筑、路缘)添加碰撞。
    • 在内容浏览器中双击打开一个静态网格体(如SM_Road)。
    • 在静态网格体编辑器中,点击菜单栏的“碰撞 -> 添加简化碰撞体 -> 自动生成凸包分解”。UE4会自动生成一个近似的碰撞体积。
    • 对于道路这种长条形物体,自动生成的碰撞可能很粗糙。你可以选择“碰撞 -> 添加盒体简化碰撞”或“添加胶囊体简化碰撞”进行手动调整。目标是让碰撞体尽可能贴近可视网格,但又不要过于复杂影响性能。

4.4 创建Carla所需的地图蓝图

Carla不仅仅需要静态场景,还需要一个特殊的蓝图来定义生成车辆、行人的位置(Spawn Point)、交通灯逻辑、导航信息等。

  1. 设置玩家起点:在“世界大纲视图”中搜索“PlayerStart”,如果不存在,从模式面板拖拽一个“PlayerStart”到地图中合适的位置(如某条车道旁)。
  2. 生成车辆和行人出生点
    • Carla通过“目标点”(Target Point)来标记出生位置。在模式面板的“基本”类别下,拖拽多个“目标点”到地图的各条车道起点、人行道旁。
    • 选中这些目标点,在细节面板中,为其添加一个标签(Tag)。对于车辆出生点,添加标签VehicleSpawnPoint;对于行人出生点,添加标签PedestrianSpawnPoint。Carla的Python API会通过这些标签来寻找出生位置。
  3. 生成导航网格(NavMesh):这是让行人、车辆进行路径规划的基础。点击编辑器工具栏上的“构建”按钮(或按Ctrl+Shift+;),UE4会为当前关卡生成导航网格。生成后,地面会出现绿色的可行走区域。
  4. 保存地图:将当前关卡保存为MyRRMap.umap,存放在Content/Maps/MyRRMap文件夹下。

5. 打包地图并集成到Carla

现在,我们有了一个在UE4编辑器中看起来正常的关卡,但它还不能被Carla的服务器加载。

5.1 配置Carla地图描述文件

Carla服务器通过一个名为*Map.umap的文件和一个同名的.xodr文件(OpenDRIVE道路描述)来识别地图。我们目前只有.umap文件。

  1. 生成/准备.xodr文件:最准确的方法是从RoadRunner项目中导出OpenDRIVE文件(通常为.xodr)。在RoadRunner的“文件 -> 导出”中,选择“OpenDRIVE”格式。将导出的MyMap.xodr文件复制到Carla源码目录下的Unreal\CarlaUE4\Content\Carla\Maps\OpenDrive文件夹中(如果没有则创建)。
  2. 修改Carla地图列表:打开Unreal\CarlaUE4\Content\Carla\Maps目录,你会发现有Town01,Town02等文件夹。复制其中一个文件夹(如Town01),重命名为MyRRMap
  3. 进入MyRRMap文件夹,你会看到Town01.umapTown01.xodr。将Town01.umap删除,把我们之前保存的MyRRMap.umap复制进来并重命名为MyRRMap.umap(确保文件名与文件夹名一致)。同样,把Town01.xodr替换为从RoadRunner导出的MyMap.xodr并重命名为MyRRMap.xodr
  4. 关键一步:更新地图引用:用文本编辑器打开Unreal\CarlaUE4\Config\DefaultEngine.ini文件,搜索MapsToCook。你会看到一行类似+MapsToCook=/Game/Carla/Maps/Town01的列表。在这列表的最后,添加新的一行:+MapsToCook=/Game/Carla/Maps/MyRRMap。这告诉UE4在打包时需要包含我们的新地图。

5.2 重新编译并打包Carla

  1. 关闭UE4编辑器。
  2. 重新打开“x64 Native Tools Command Prompt”,进入Carla源码根目录(你最初运行make launch的地方)。
  3. 运行以下命令进行“开发”构建,这会将我们的新地图编译进Carla:
    make launch
    这会重新编译并启动UE4编辑器,加载的是我们修改过的MyCarlaMap.uproject。在编辑器中,你应该能在“世界场景设置”的地图列表里看到MyRRMap
  4. (可选)打包发布版本:如果你需要独立的可执行文件,可以运行:
    make package
    这个命令会执行一个更长时间的打包过程,最终在Dist文件夹下生成一个包含所有资源的独立Carla版本。打包版本中也会包含你的MyRRMap

6. 在Carla中加载与测试自定义地图

6.1 启动Carla服务器并加载地图

  1. 如果你使用make launch启动的编辑器,可以直接在编辑器里点击“运行”来启动本地服务器。
  2. 如果你打包了独立版本,进入Dist\CARLA_0.9.11\WindowsNoEditor目录,运行CarlaUE4.exe。这会启动Carla服务器并打开一个窗口。
  3. 使用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无法找到MyRRMap1. 地图未正确添加到DefaultEngine.iniMapsToCook列表。
2. 打包/编译后未重启服务器。
1. 双重检查DefaultEngine.ini文件的修改是否正确保存。
2. 运行client.get_available_maps()查看服务器当前可用的地图列表,确认MyRRMap在其中。

6.3 性能优化与后续工作

地图成功加载后,你可能发现帧率较低。这是因为从RoadRunner导入的模型通常面数较高,且UE4默认的渲染设置并非最优。

  1. LOD(细节层次)生成:在内容浏览器中,为主要的静态网格体(如建筑、复杂植被)生成LOD。右键点击网格体 -> 资源操作 -> 生成LOD。这可以显著减少远处物体的渲染开销。
  2. 光照烘焙:如果你使用了静态光照,需要对光照进行烘焙(构建光照),以获得更好的视觉效果和性能。但这过程非常耗时,建议在最终版本确定后再进行。
  3. 添加Carla特效:可以在地图中添加Carla特有的天气系统、路面湿滑效果等,这些需要通过Carla的Python API或UE4的Carla插件蓝图进行控制。
  4. 语义分割与深度图:确保你的材质能够支持Carla的语义分割和深度渲染输出。这通常需要检查材质中是否使用了正确的着色器节点和渲染目标。

整个流程走下来,虽然步骤繁琐,但一旦打通,你就拥有了将任意高精地图转化为可仿真场景的能力。这套方法不仅适用于RoadRunner,其核心思路(导出通用格式->UE4导入修复->集成到Carla框架)对于其他建模软件(如Blender、3ds Max)导出的模型也同样具有参考价值。最关键的是保持版本一致、耐心处理材质与碰撞、以及理解Carla加载地图的配置文件规则。希望这篇超详细的指南能让你少走弯路。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询