☰
Windows下Carla源码编译与RoadRunner地图导入完整指南
2026/10/3 11:03:22 网站建设 项目流程

最近在公司Windows工作站上折腾了两周,最终把Carla从源码编译跑通,同时接上了RoadRunner插件,实现了从RoadRunner画路到Carla加载自定义地图的完整链路。整个过程踩坑不少,网上资料又散,干脆整理成一篇完整的实操记录,覆盖Windows下Carla源码安装、RoadRunner插件配置、地图导入和常见问题排查,给同样要在这条路上走一遍的朋友当个参考。

先说结论:如果你是打算长期拿Carla做自动驾驶仿真,而不是随便跑几个内置Town地图,那Windows源码安装几乎是绕不开的。预编译包适合快速体验,但你要接入RoadRunner导出的自定义道路、要管理自研传感器、要改Carla源码加日志,预编译包根本不够用。源码编译虽然重,但是值得。

我用的环境是Windows 10 Pro 21H2,显卡RTX 3080,内存32GB,系统盘剩余120GB。Carla版本选的是0.9.13,RoadRunner版本是2022a,对应带RR插件。下面按我实际操作顺序来写。

1. 为什么Windows上要折腾源码编译:预编译包的限制在哪

1.1 预编译包"能用"和"不够用"的分界线

很多新手第一步会去下Release页面的预编译压缩包,解压即玩,里面自带Town01到Town10等地图,配合PythonAPI跑一下CARLA挑战赛示例似乎一切正常。但等你真正要把RoadRunner导出的地图放进来,问题立刻出现:预编译包是一个只包含运行时的发行版,没有Unreal Editor,而你导入RoadRunner的三维网格资产时,几乎都需要在Carla编辑器中做语义标签、碰撞体设置、路面烘焙,预编译包完全做不到。

预编译包还硬绑定了Python版本。Carla 0.9.13的PythonAPI只支持Python 3.8(64位),你去conda里建一个3.9环境,连carla包都装不上。源码编译至少能自己控制这些绑定关系,虽然官方还是建议固定版本,但你可以根据业务场景调整。

另外一个问题是调试。仿真平台在自动驾驶研发里是基础设施,出了问题必须能定位到引擎层。比如某个路口的信号灯状态不对,你要去查Carla的交通管理器源码,断点调试加日志输出,这时候必须从源码编译出Debug/Development版本,否则只能对着黑盒猜。

1.2 源码编译带来的核心能力

源码安装最直接的价值是获得完整的Unreal Editor环境,Carla在UE4上的所有工程文件、C++源码、PythonAPI源码都躺在本地,你可以:

  • 修改CarlaUE4工程的渲染设置、物理设置,做各种定制;
  • 把RoadRunner导出的FBX网格直接拖进Content Browser,手工指定道路语义标签;
  • 编译Debug版本定位内存崩溃类问题;
  • 接入自己的传感器模型,比如自研激光雷达的仿真模型;
  • 随时切换分支,方便地图烘焙后重新生成可驾驶路面。

这些在预编译包里都是做不到的。凡是需要进入Carla引擎内部的地图制作、交通流定制、传感器扩展,源码版是唯一选择。

1.3 源码安装的整体流程预览

Carla的构建系统和UE4深度绑定,官方针对Windows提供了一套批处理脚本,整体流程可以概括为:

克隆Carla仓库 → 运行Setup准备依赖和内容资产 → 生成VS工程文件 → 编译CarlaUE4编辑器 → 编译PythonAPI → 启动模拟器验证

在这里要特别提醒,整个过程最耗时的是编译Unreal Engine本身,即使是i7-12700 + 32GB内存,也要2~4个小时。Setup阶段下载的Content资产包也很大,大约10GB以上,网络不稳定会反复失败。所以时间和网络两个条件都要准备好。

2. 环境准备:硬件、系统和软件依赖的精确组合

2.1 硬件和系统版本建议

Carla是典型的大体量3D仿真项目,源码编译对硬件要求比运行预编译包高一个档次。官方文档给的是最低要求,实际体验下来我建议这样配:

硬件项最低要求推荐配置说明
内存16GB32GB以上编译UE4工程时,MSVC多个进程并发,16GB会很吃力,我实测峰值到过27GB
显存6GB8GB以上主要影响后续运行地图时的渲染,编译阶段影响不大
系统盘60GB空闲120GB以上UE4源码+编译产物+Content资产,体积很夸张
CPU8核16核以上决定编译速度,多核提升明显

系统上强烈建议用Windows 10 21H2以后的版本,Windows 11也兼容,但个别老版本UE4在Win11上有输入法崩溃问题。总之,别用太老的Win10,显卡驱动更新到最新稳定版。

2.2 软件依赖清单:版本匹配是灵魂

Carla 0.9.13依赖的是Unreal Engine 4.26的Carla定制分支,对这个版本,官方推荐用Visual Studio 2019。我当时装了VS2022,编译时遇到一堆MSVC版本不兼容问题,老老实实换回VS2019,世界清静了。

装VS2019时,工作负载记得勾选:

  • 使用C++的桌面开发
  • Windows 10 SDK(版本选10.0.18362或更高)
  • 若有需要,可额外勾选.NET桌面开发,Pay attention to Python Tools for Visual Studio,非必需,但调试PythonAPI时会方便一些。

Python版本用3.8 x64,安装时勾选"Add Python to PATH"。这里注意,Carla源码要求的是64位Python,官方编译脚本按py -3.8查找解释器,如果你同时装了多个版本,建议用Python Launcher统一管理。

Git、CMake这两个也必须装。CMake要3.16以上版本,装的时候一定要勾选"Add CMake to the system PATH",否则后面GenerateProjectFiles脚本可能找不到cmake命令。

2.3 目录规划是个隐形坑

Carla和UE4对路径很敏感,官方推荐的是无空格、无中文、无特殊符号的纯英文路径。我自己出现过在D:\carla project目录编译时,某个第三方库的脚本解析路径失败的情况,后来统一改成C:\src\carla这类短路径才稳定。

建议目录结构如下:

C:\src\ ├── carla\ # Carla主源码仓库 ├── carla-content\ # Content资产缓存目录(Setup时下载) └── UE4\ # Unreal Engine源码仓库

尤其是Content资产包,下载下来解压后会被Carla的Setup.bat处理,如果路径里有中文,后续启动Carla时一堆贴图加载不出来,排查起来极其痛苦,直接避掉这个隐患。

3. 从GitHub检出源码到Unreal Engine编译完成

3.1 克隆仓库与分支选择

Carla官方仓库托管在GitHub上,你可以只克隆Carla主仓库,用--depth 1浅克隆省流量:

git clone --depth 1 -b 0.9.13 https://github.com/carla-simulator/carla.git cd carla

这里-b 0.9.13指定版本分支。源码安装不建议用master/main最新主线,因为主线改动频繁,RoadRunner插件和PythonAPI的兼容性未必跟得上。实测0.9.13和0.9.14都算稳定,0.9.13和RoadRunner插件配合的案例更多。

克隆完Carla仓库,还需要Unreal Engine的Carla定制版。Carla官方维护了一个UE4分支,需要用git单独拉取:

git clone --depth 1 -b 4.26-carla https://github.com/carla-simulator/UnrealEngine.git C:\src\UE4

注意,这个UE4仓库体积很大,浅克隆相对能省不少时间,但后续生成工程时会需要补一些历史提交。如果网络条件一般,建议在网络状态好的时间段操作。UE4拉下来之后,接下来就是Setup环节。

3.2 Setup.bat:资产下载、子模块更新和依赖补全

回到Carla仓库目录,双击或命令行执行:

Setup.bat

这一步做的事情很多:下载预编译的Content资产包(包含Carla自带的地图、车辆模型、贴图等)、把Carla依赖的第三方库子模块拉取完整、解压并整理内容到对应目录、生成CarlaUE4工程需要的中间文件。

实际运行时你会看到一连串的下载输出,包括Dist、Content、Plugins等目录被创建。这个阶段最容易翻车的就是网络中断,导致某些文件下载不完整。我遇到过一次Retry了七八次才把所有Content包下完。如果反复失败,检查一下磁盘剩余空间,Content包解压后接近20GB,别等到一半才报磁盘满。

Setup完成后,建议检查一下CarlaUE4/Content目录是否存在,里面应该有一堆.umap开头的地图文件和车辆模型资产,至少几百MB以上。如果没有,说明Content下载和解压有问题,要重新跑Setup。

3.3 GenerateProjectFiles:生成VS2019解决方案

Setup完成后,继续执行:

GenerateProjectFiles.bat

这一步会调用CMake和Unreal Build Tool,把Carla的C++工程生成Visual Studio解决方案文件carla.sln。最终解决方案会出现在Carla仓库根目录下。如果这步报错,优先检查环境变量:UE4_ROOT要指向UE4源码目录,CMAKE要能在PATH里找到。

在Windows上,有些场景需要先手动设置UE4_ROOT环境变量:

set UE4_ROOT=C:\src\UE4

然后在当前终端窗口执行Generate。设置系统环境变量的话,记得重新打开终端,否则不生效。

3.4 编译CarlaUE4编辑器:最耗时的环节

用VS2019打开carla.sln,这会在Visual Studio里加载大量UE4项目,首次加载会有点慢。确保解决方案配置选为Development Editor,平台选x64,然后在解决方案资源管理器里找到CarlaUE4项目(通常是启动项目),右键生成。

编译过程非常久,我第一次大概跑了3小时40分钟。编译期间不要动CPU密集型任务,否则容易把编译进程卡住。如果编译过程中出现内存溢出,可以参考后面问题排查章节。编译完成后,VS输出窗口会显示"===== Build: 1 succeeded ====="之类的信息。

到这里CarlaUE4编辑器就编译好了。你可以直接从VS里按F5启动CarlaUE4编辑器,看到带Carla菜单的Unreal Editor窗口,就说明引擎层面成功了。

这之后还需要编译PythonAPI。回到Carla仓库根目录,执行:

Build.bat --python-api

它会生成PythonAPI/carla/dist下的wheel包(.whl文件)。安装到当前Python环境:

pip install PythonAPI\carla\dist\carla-0.9.13-cp38-cp38-win_amd64.whl

Python版本必须严格是3.8 x64,否则文件名里的cp38对不上,pip直接报"not a supported wheel on this platform"。安装后测试一下:

import carla print(carla.__version__)

能输出版本号就说明PythonAPI成功。

4. RoadRunner插件安装与配置:导出链路的关键一环

4.1 插件在整个流程里扮演什么角色

RoadRunner是MathWorks出的道路建模工具,用来画道路、交叉口、标注线、交通标志,还能做场景逻辑。但RoadRunner导出的原始数据不是Carla原生格式,需要经过一个插件转换成Carla能识别的文件集合。

这个插件的作用就是"翻译官":把RoadRunner场景导出为OpenDRIVE(.xodr)格式的逻辑道路描述,以及FBX + 贴图格式的三维网格资产,再配上一些元数据文件。Carla拿到.xodr可以动态生成可驾驶路面,拿到FBX才能还原完整的视觉场景。

所以不要试图省掉插件,直接拿RoadRunner自带的导出功能导出FBX,再自己解析,那是在造轮子,而且大概率做不完整。

4.2 安装步骤和版本匹配

Carla官方为RoadRunner提供了专门插件包,在Carla官网或GitHub Release资源中能下载到,文件名类似RR_Plugin_0.9.13.zip。解压后里面是一个rr_plugin目录。

安装方法不复杂:

  1. 关闭RoadRunner;
  2. 找到RoadRunner的安装目录,比如C:\Program Files\RoadRunner2022a\bin;
  3. 把插件目录复制到RoadRunner的插件搜索路径下,通常是把整个rr_plugin文件夹放到RoadRunner安装目录的bin或toolbox子目录中,具体看插件包里的README;
  4. 重启RoadRunner,看到顶部工具栏出现Carla图标,说明插件加载成功。

这里最核心的坑是版本匹配。RoadRunner的版本、Carla的版本、插件的版本三者必须对上,官方通常对每个Carla版本提供对应插件版本。我用的是Carla 0.9.13 + RoadRunner 2022a + RR Plugin 0.9.13,运行正常。如果你用Carla 0.9.14,就去下0.9.14的插件,千万别跨版本。

4.3 插件面板里的导出选项

RoadRunner里打开一个场景后,点击Carla插件图标,会弹出导出面板。面板主要选项有:

  • 导出路径:插件会把所有生成文件导到一个文件夹,建议单独建一个carla_export目录;
  • 导出范围:可选整个场景或当前选中区域;
  • 是否导出静态网格:勾选后会生成FBX和纹理,纹理文件会打包在导出目录的Textures目录下;
  • 是否生成OpenDRIVE:这个是核心,默认勾选。

实际导出后,目录结构大概长这样:

carla_export\ ├── map.xodr ├── map.fbx ├── mapInfo.json └── Textures\ ├── road_....png └── ...

这个map.xodr就是Carla能加载的核心文件,map.fbx是完整视觉网格。

插件用到的坑我在后面单开一节讲,这里先提醒一个高频问题:导出时RoadRunner会卡在"Processing"很久,看上去像程序死了,其实是在生成大尺寸FBX。如果你的场景很大,耐心等10分钟以上都是正常的,别急着强制关闭。

5. RoadRunner地图导入Carla:两种方案对应的完整操作

5.1 先决定你要哪种"导入"

RoadRunner地图进Carla有两条路,理解它们的差异能帮你省很多时间:

方案导入内容优点缺点适用场景
OpenDRIVE动态生成.xodr文件快速、不需要编辑器操作、纯代码可控路面视觉比较单调,没有RR里做的标线、护栏等精美模型算法验证、路径规划调试、CI环境自动化测试
FBX完整导入.fbx+贴图+OpenDRIVE完整还原RR场景,视觉逼真必须在CarlaUE4编辑器里手工操作、流程复杂仿真测试展示、传感器仿真、HIL测试

下面分别讲两条路的具体操作。

5.2 快速方案:用generate_opendrive_world加载OpenDRIVE

Carla客户端API提供generate_opendrive_world方法,它读取.xodr内容,在服务端动态构建一个运行世界。这个方案不需要进入编辑器,适合快速验证。

操作步骤:

  1. 启动Carla服务端。源码编译版可以直接启动CarlaUE4的打包版本(如果有),或者在编辑器界面上点击Play按钮以Play In Editor模式运行,相当于启动服务器;
  2. 编写Python脚本:
import carla import time # 连接Carla服务端 client = carla.Client('127.0.0.1', 2000) client.set_timeout(30.0) # 读取RoadRunner导出的OpenDRIVE文件 with open('map.xodr', 'r', encoding='utf-8') as f: xodr_content = f.read() # 动态生成OpenDRIVE世界 world = client.generate_opendrive_world( xodr_content, vertex_distance=2.0, max_road_length=50.0, wall_height=5.0, extra_traffic_light=False ) # 等待服务端加载 time.sleep(15) # 验证地图是否加载成功 map_info = world.get_map() print('Map name:', map_info.name) print('Spawn points:', len(map_info.get_spawn_points()))

脚本里vertex_distance和max_road_length两个参数很关键。vertex_distance控制生成路面的网格精度,越小精度越高,但加载越慢;max_road_length控制单段道路的最大长度,太短会让道路看起来一节一节的,建议在50~100之间。

这一步常见问题是加载后地图本身黑屏,大概率是wall_height设成0导致没有侧墙,视觉上测距很难受,一般建议设3~5。

5.3 完整方案:FBX资产导入Carla编辑器并烘焙可驾驶路面

如果你需要还原RoadRunner里的全部视觉内容,就得走编辑器方案。这个流程我在实际项目中复现过,步骤比较多。

第一步是整理导出文件。把RoadRunner插件的导出目录整体复制到Carla工程的Content目录下,我习惯放在:

C:\src\carla\Unreal\CarlaUE4\Content\Carla\RoadRunner\my_map\

目录下要有map.fbx、map.xodr和Textures文件夹。

第二步是在Carla编辑器里导入资产。打开CarlaUE4工程(VS里F5打开的编辑器),在Content Browser里切到刚才的目录,能识别出map.fbx。右键导入,选择导入选项:导入网格、材质并勾选"Import as Skeletal"不要选。Unreal会自动把纹理文件关联到材质上。

第三步是关键的语义标签和碰撞体设置。RoadRunner导出的FBX里的所有网格默认是纯静态网格,Carla并不知道哪条路是Road、哪个人行道是Sidewalk。官方推荐做法是利用Carla提供的RoadRunner导入工具,它会按照RR导出的命名规则自动给网格打上正确的语义标签。如果你没有工具,只能手动选中网格,在细节面板里设置Carla标签,工作量很大,不推荐。

第四步是烘焙地图。Carla有一个地图烘焙工具,它在OpenDRIVE信息和三维网格之间建立对应关系,生成可驾驶的车道线、信号灯位置。这个烘焙过程是在编辑器菜单里触发的,一般位于Carla菜单或Editor工具面板。烘焙后,把当前关卡保存,地图就真正变成Carla原生地图了。

第五步是验证。重启Carla服务端,在启动参数或配置里切换地图到my_map,再跑PythonAPI确认车辆能生成在道路上:

import carla client = carla.Client('127.0.0.1', 2000) client.set_timeout(30.0) # 切换到新地图 world = client.load_world('Carla/Maps/my_map') time.sleep(20) spawn_points = world.get_map().get_spawn_points() print('spawn points:', len(spawn_points))

如果spawn_points数量为0,多半是烘焙没成功,回到编辑器检查道路是否标记为Road标签。

5.4 地图加载后的基本验证方法

地图加载不代表地图可用,还需要检查几个基本指标:

  • 车辆能否生成:随机取10个spawn_point生成车辆,如果有车直接掉到地下,说明碰撞体或静态网格有问题;
  • 车道线是否正确:用Carla的map.get_waypoint()沿道路取几个点,看路径是否连续;
  • 车辆能否自动驾驶:用Carla自带的Autopilot在场景里跑一圈,如果在某个路口直接冲出跑道,往往是OpenDRIVE里的道路连接器没闭合。

这些验证脚本我在实际项目中会融合到一起,每次导入新地图先跑一遍,能省很多调试时间。

6. 编译和导入过程中的高频坑与完整排查链路

6.1 UE4编译过程中的内存和工具集问题

源码安装最让人崩溃的就是编译期报错。我在编译CarlaUE4时遇到的最常见的两类错误:

第一类是MSVC版本不匹配。错误信息通常带有_MSC_VER相关提示,或者直接提示找不到某个C++标准库头文件。解决方法很简单:检查VS版本是否为2019,然后在Visual Studio Installer里确认安装了"MSVC v142生成工具和C++工作负载"。VS2022对应的是v143工具集,与UE4.26的第三方库不兼容,这也是我放弃VS2022的原因。

第二类是内存溢出的C1060致命错误。这个错误在16GB内存机器上频率很高,因为VS默认开了多个编译进程。解决办法是在解决方案资源管理器里右键CarlaUE4工程,进入属性 → C/C++ → 命令行,添加:

/MP2

限制最多两个并行编译进程。同时把系统的虚拟内存调到32GB以上,可以明显降低崩溃概率。在BIOS开了XMP的朋友,检查一下内存是否稳定,编译时期高频访问内存,蓝屏也不少见。

6.2 RoadRunner插件不加载或导出为空

这个坑我印象太深了。安装插件后,重启RoadRunner,发现工具栏没有Carla图标,八成是插件放错了目录。RoadRunner有自己的插件搜索路径,不是你随便放一个rr_plugin文件夹就行的。我第二次安装时仔细看了插件包里的README,发现它要求把插件放到Documents\RoadRunner\Plugins之类的地方,而不是RoadRunner安装目录。这和版本有关,记得以你下载的插件包说明为准。

另一个情况是插件图标有了,但导出时生成的文件是空的或缺少map.xodr。我排查下来的原因是RoadRunner场景本身有问题:有些道路段没有正确的连接器,两个平面交叉处有悬空段,导出时OpenDRIVE生成器直接放弃了整条路。这个修复必须在RoadRunner里处理,把道路交叉口重新连接好再导出。

排查时建议先导一个最简单的场景,比如只有一条直路的空场景,确认插件本身能产出有效的map.xodr,再逐步增加复杂度,这样能快速定位是场景问题还是插件问题。

6.3 OpenDRIVE动态加载后车辆寻路失败

用generate_opendrive_world加载地图后,车辆能生成,但用Autopilot跑起来会出现不走车道或直接跑出地图的情况。这里要说明,OpenDRIVE本质上描述的是道路中心线的逻辑连接,Carla在动态生成时只把这条路"铺"出来,但缺少连接点处的拓扑关系优化。特别是RoadRunner里道路的沉余点很多,Carla生成的路面可能与实际轴的连线有偏差。

排查办法是先把vertex_distance调小到1.0,重新加载,看路径是否连贯。如果还不行,检查map.xodr里<laneLink>标签是否存在。RoadRunner正常情况下应该生成这些信息,但版本不同有差异。用文本编辑器打开map.xodr搜laneLink,如果找不到,说明导出的OpenDRIVE不完整,回到RoadRunner升级插件或换导出选项。

如果只是个别弯道不正常,一个折中的办法是在Carla里用carla.Map的get_waypoint手动修正路径,比如在弯道处让自动驾驶请求时多取中间点,但这些属于算法层面的绕路方案,治标不治本,根因还是地图数据。

6.4 完整导入后的贴图丢失和路面浮空

FBX完整导入时,最容易出现的两个视觉问题是贴图全紫和路面悬空。

贴图全紫,本质是纹理没被正确打包进材质。RoadRunner导出的纹理路径如果带有中文或空格,UE4在自动关联材质时会失败。解决办法是导出文本格式时把RoadRunner的项目路径和导出路径都改成纯英文,再重新导出。另外导入FBX时,弹出导入选项里一定要勾选"Import Textures",否则即便贴图文件都在,UE4也不会自动建材质参考。

路面悬空或穿地,通常是场景原点偏移导致的。RoadRunner场景如果设置在世界坐标原点很远的地方,导入UE4后,坐标精度下降,路面网格会出现抖动或直接穿插。解决办法是在RoadRunner导出前,把场景原点重置到地图中心,然后再导出。FBX导入到UE4时也可以勾选"Convert Scene"和"Re-orient",让引擎自动校正坐标。

6.5 地图导入后帧率极低的优化思路

完整导入的RoadRunner地图往往带有海量静态网格,哪怕场景很简单,一个路口也可能包含几十个独立Mesh,渲染合并没做好,帧率直接掉到十几帧。这里有三条优化路径:

  • 在编辑器里对同材质、同标签的网格做合并,UE4的Merge Actors工具可以批量合并静态网格Actor;
  • 调整CarlaUE4的渲染距离设置,在Project Settings里把r.StaticMeshLODDistanceScale调低;
  • 如果只是仿真算法测试,不需要完整视觉,干脆退回OpenDRIVE动态生成方案,视觉简单但帧率高很多。

我自己在实际项目里,算法调试阶段一律用OpenDRIVE方案,只有对外演示和传感器采集时才切到完整FBX地图,这样效率和效果都兼顾了。

7. 顺带提一个省时的后续思路

整个流程跑通之后,给我最大的感触是:源码安装Carla其实是一次性成本,之后的地图导入流程会非常快。RoadRunner画路、导出、Carla加载,从RoadRunner打开软件到Carla里跑起车,熟练后十分钟内能完成。难点全在第一次的环境搭建和引擎编译上。

如果你只是想在某个项目里快速验证一下RoadRunner导出的地图,不必急着上源码编译,先用预编译包跑一遍OpenDRIVE方案,确认你的道路场景在Carla里逻辑正确之后,再决定要不要彻底切换到源码环境。反过来,只要有一天你需要改Carla内部代码,哪怕只是加一个传感器模型,源码编译就是必选项。

我个人在实际操作中的体会是:在仿真平台这类基础设施上,不要心疼那2~4小时的编译时间,它会换来后面无数小时的调试时间。源码在手,地图数据和引擎行为都是可查可改的。最后一个小技巧:每次装完新地图,把验证脚本保存成固定的verify_map.py,里面包含生成车辆、检查spawn_point、跑一小段Autopilot三个步骤,新地图进来一键验证,比每次手动点界面高效太多。

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

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

立即咨询