最近在公司Windows工作站上折腾了两周最终把Carla从源码编译跑通同时接上了RoadRunner插件实现了从RoadRunner画路到Carla加载自定义地图的完整链路。整个过程踩坑不少网上资料又散干脆整理成一篇完整的实操记录覆盖Windows下Carla源码安装、RoadRunner插件配置、地图导入和常见问题排查给同样要在这条路上走一遍的朋友当个参考。先说结论如果你是打算长期拿Carla做自动驾驶仿真而不是随便跑几个内置Town地图那Windows源码安装几乎是绕不开的。预编译包适合快速体验但你要接入RoadRunner导出的自定义道路、要管理自研传感器、要改Carla源码加日志预编译包根本不够用。源码编译虽然重但是值得。我用的环境是Windows 10 Pro 21H2显卡RTX 3080内存32GB系统盘剩余120GB。Carla版本选的是0.9.13RoadRunner版本是2022a对应带RR插件。下面按我实际操作顺序来写。1. 为什么Windows上要折腾源码编译预编译包的限制在哪1.1 预编译包能用和不够用的分界线很多新手第一步会去下Release页面的预编译压缩包解压即玩里面自带Town01到Town10等地图配合PythonAPI跑一下CARLA挑战赛示例似乎一切正常。但等你真正要把RoadRunner导出的地图放进来问题立刻出现预编译包是一个只包含运行时的发行版没有Unreal Editor而你导入RoadRunner的三维网格资产时几乎都需要在Carla编辑器中做语义标签、碰撞体设置、路面烘焙预编译包完全做不到。预编译包还硬绑定了Python版本。Carla 0.9.13的PythonAPI只支持Python 3.864位你去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_ROOTC:\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.whlPython版本必须严格是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目录。安装方法不复杂关闭RoadRunner找到RoadRunner的安装目录比如C:\Program Files\RoadRunner2022a\bin把插件目录复制到RoadRunner的插件搜索路径下通常是把整个rr_plugin文件夹放到RoadRunner安装目录的bin或toolbox子目录中具体看插件包里的README重启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加载OpenDRIVECarla客户端API提供generate_opendrive_world方法它读取.xodr内容在服务端动态构建一个运行世界。这个方案不需要进入编辑器适合快速验证。操作步骤启动Carla服务端。源码编译版可以直接启动CarlaUE4的打包版本如果有或者在编辑器界面上点击Play按钮以Play In Editor模式运行相当于启动服务器编写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, encodingutf-8) as f: xodr_content f.read() # 动态生成OpenDRIVE世界 world client.generate_opendrive_world( xodr_content, vertex_distance2.0, max_road_length50.0, wall_height5.0, extra_traffic_lightFalse ) # 等待服务端加载 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三个步骤新地图进来一键验证比每次手动点界面高效太多。