1. 项目概述与核心价值如果你正在自动驾驶仿真领域摸爬滚打尤其是深度使用CARLA那么你一定遇到过这个痛点官方提供的地图虽然经典但无论是用于测试特定场景比如复杂的城市立交、乡村窄路还是为了匹配自己研发的感知或规划算法都显得捉襟见肘。自己动手丰衣足食制作一张专属的高精度仿真地图就成了从“算法使用者”迈向“场景定义者”的关键一步。这个项目就是在Ubuntu 18.04这个经典的机器人开发环境下串联起RoadRunner 2022b专业的道路设计工具、Unreal Engine 4.24强大的实时渲染引擎和CARLA 0.9.10前沿的自动驾驶仿真平台打造一条从零开始创建、并最终能在CARLA中流畅运行的专属地图生产线。这不仅仅是几个软件的简单堆叠而是一套涉及三维建模、材质处理、引擎配置和仿真接口的完整工作流。我花了相当长的时间踩遍了从环境依赖、软件兼容性到数据导出的几乎所有“坑”才把这条流水线跑通。今天我就把这套经过实战检验的完整流程连同那份用“血泪”换来的避坑清单毫无保留地分享给你。2. 环境准备与核心工具链解析工欲善其事必先利其器。在Ubuntu 18.04上搭建这套工具链本身就是一个不小的挑战因为各个软件对系统库、驱动版本的依赖错综复杂。我们的目标是建立一个稳定、可复现的工作环境。2.1 Ubuntu 18.04基础系统配置Ubuntu 18.04 LTSBionic Beaver之所以成为很多机器人、自动驾驶项目的首选是因为其长期支持带来的稳定性以及其软件源中包含了大量成熟且兼容性好的开发库。但原版系统离我们的需求还有距离。首先更新系统并安装基础编译工具链是必须的sudo apt update sudo apt upgrade -y sudo apt install build-essential cmake git wget curl software-properties-common -y接下来是关键一步显卡驱动。UE4编辑器对显卡驱动有较高要求而CARLA的渲染质量也直接受其影响。对于NVIDIA显卡我强烈建议通过官方PPA安装指定版本的驱动而不是使用Ubuntu自带的“附加驱动”。我曾因为驱动版本不匹配导致UE4编辑器启动崩溃或渲染异常。# 添加Graphics Drivers PPA sudo add-apt-repository ppa:graphics-drivers/ppa -y sudo apt update # 安装适合你显卡的驱动版本例如对于大多数较新的显卡470或510版本是比较稳定的选择 # 使用ubuntu-drivers devices命令查看推荐版本 sudo apt install nvidia-driver-470 -y安装完成后务必重启系统。使用nvidia-smi命令验证驱动是否安装成功并能正确识别你的GPU。注意Ubuntu 18.04的内核版本可能较老与最新版NVIDIA驱动存在兼容性问题。如果遇到安装后无法进入图形界面卡在登录循环可能需要回退到稍旧的驱动版本如450或者考虑升级系统内核。这是一个经典的“坑”我的避坑清单里会详细说明恢复方法。2.2 RoadRunner 2022b的安装与配置RoadRunner是MathWorks公司推出的专业道路与场景建模工具它生成的模型和车道线数据格式能被自动驾驶仿真工具如CARLA很好地识别。2022b是它的一个特定版本我们需要确保版本匹配因为不同版本导出的数据接口可能有细微差别。获取安装包你需要从MathWorks官网获取RoadRunner 2022b的Linux安装包。通常它是一个.zip或.tar.gz文件。解压与安装将其解压到你希望安装的目录例如/opt。sudo tar -xzf roadrunner-linux-2022b.tar.gz -C /opt/设置环境变量为了方便在终端启动需要将RoadRunner的可执行文件路径加入系统环境变量。# 编辑你的shell配置文件如 ~/.bashrc echo export PATH$PATH:/opt/RoadRunner2022b/bin ~/.bashrc source ~/.bashrc处理库依赖RoadRunner作为商业软件其动态链接库可能依赖一些特定版本的系统库。最常见的错误是启动时提示libxxx.so.x未找到。你需要根据错误信息安装对应版本的库或者创建符号链接。例如# 假设报错缺少 libicuuc.so.60 # 首先查找系统是否有其他版本的libicuuc find /usr/lib -name libicuuc.so.* # 如果存在 libicuuc.so.66可以尝试创建一个软链接此法有风险可能影响其他软件 sudo ln -s /usr/lib/x86_64-linux-gnu/libicuuc.so.66 /usr/lib/x86_64-linux-gnu/libicuuc.so.60实操心得处理库依赖是最繁琐的一步。一个更稳健的方法是使用patchelf工具修改RoadRunner可执行文件或库文件本身的运行时库搜索路径RPATH使其指向一个包含所有必需库的自定义目录。你可以将缺失的库文件从网上下载或从其他兼容系统拷贝过来集中放在一个文件夹如/opt/rr_libs然后用patchelf进行设置。这能有效避免污染系统库环境。2.3 Unreal Engine 4.24源码编译安装CARLA 0.9.10官方明确兼容并推荐使用UE 4.24。我们不能直接使用Epic Games启动器安装的二进制版本因为CARLA需要修改引擎源码并重新编译。这个过程耗时较长视机器性能可能需要1-3小时但至关重要。获取源码# 克隆Unreal Engine仓库确保你有GitHub账户并关联了Epic Games账户 git clone https://github.com/EpicGames/UnrealEngine.git -b 4.24 cd UnrealEngine安装依赖UE4编译需要大量的开发库。运行自带的脚本是最方便的方式./Setup.sh ./GenerateProjectFiles.shSetup.sh脚本会自动检测并安装大部分依赖。但在Ubuntu 18.04上你很可能需要手动补充一些sudo apt install clang-6.0 lld-6.0 libc-dev libcabi-dev libxinerama-dev libxcursor-dev libxrandr-dev libfreetype6-dev libglew-dev libogg-dev libvorbis-dev libssl-dev libnss3-dev libudev-dev libxi-dev libx11-dev libxcb-icccm4-dev libxcb-image0-dev libxcb-keysyms1-dev libxcb-randr0-dev libxcb-render-util0-dev libxcb-shape0-dev libxcb-xfixes0-dev libxcb-xkb-dev libxkbcommon-dev libxkbcommon-x11-dev -y编译引擎make -j$(nproc)-j$(nproc)表示使用所有CPU核心并行编译以加快速度。这个过程会占用大量内存和CPU请确保系统有足够的资源建议16GB以上内存。验证安装编译成功后在UnrealEngine/Engine/Binaries/Linux/目录下会生成UE4Editor可执行文件。可以尝试运行./UE4Editor来启动编辑器确认编译成功。避坑清单项1编译UE4时最常见的失败原因是内存不足OOM Killer杀死了编译进程。如果编译中途失败可以尝试减少并行任务数如make -j4。另外确保交换空间swap足够大建议8GB-16GB可以作为内存的缓冲。2.4 CARLA 0.9.10的获取与准备CARLA 0.9.10是我们地图的最终运行环境。我们需要获取其源码因为后续的地图导入需要用到CARLA的构建工具和资源。# 克隆CARLA仓库并切换到0.9.10标签 git clone https://github.com/carla-simulator/carla.git cd carla git checkout tags/0.9.10克隆完成后先不急于编译CARLA本身。我们主要需要它的Import脚本和资源目录。此时你的工作区应该有三个主要的目录UnrealEngine、carla和存放RoadRunner的目录如/opt/RoadRunner2022b。3. RoadRunner地图设计与数据导出详解环境就绪后我们进入核心创作环节——使用RoadRunner设计地图。RoadRunner的优势在于它能以车道为中心进行设计并生成丰富的语义信息车道线类型、交通标志、路面材质等这些信息对于自动驾驶仿真至关重要。3.1 地图设计的基本原则与规划在打开RoadRunner之前先进行纸上谈兵式的规划能事半功倍。确定范围与比例仿真地图不需要像真实城市一样庞大。一个1km x 1km的区域足以设计出包含十字路口、环岛、弯道、坡道、辅路等丰富元素的测试场景。明确比例尺保持道路宽度、转弯半径符合常规标准例如城市主干道双向四车道宽度约14-16米。设计路网结构规划好主干道、支路、连接线的布局。考虑交通流设计合理的交叉口信号灯控制或无信号路口。可以引入一些具有挑战性的元素如急弯、连续S弯、狭窄的桥梁或隧道用于测试车辆的操控和感知极限。丰富场景元素除了道路本身考虑添加路肩、人行道、绿化带、建筑物简单方块即可细节由UE4资产补充、路灯、交通护栏等。这些静态元素能极大地增强场景的真实感并为感知算法提供更多可学习的特征。3.2 RoadRunner核心工作流实操启动RoadRunner后你会看到一个三维视图和多种编辑工具。创建地形与道路使用“地形”工具生成基础网格然后用“道路”工具绘制道路中心线。RoadRunner是参数化设计绘制完中心线后你可以方便地调整道路的横断面车道数、宽度、路肩、纵向坡度、超高等属性。车道线及路缘石设置这是赋予道路语义的关键。在道路属性中详细定义每条车道的类型行驶道、公交道、应急车道、车道线样式实线、虚线、双黄线、颜色以及路缘石的高度和材质。确保这些设置符合你目标地区的交通规范。添加场景对象与信号从内置的资产库中拖拽交通标志限速、停止、让行等、信号灯、树木、电线杆到场景中。对于交通信号灯需要为其指定控制逻辑相位、配时虽然这个逻辑在RoadRunner中定义但最终需要CARLA的交通管理器来接管所以此处主要是放置和关联。烘焙与纹理生成设计完成后需要进行“烘焙”Bake操作。这个过程会将参数化的道路和地形转化为带有UV坐标的三维网格并生成对应的纹理贴图沥青、水泥、草地等。烘焙质量直接影响最终地图的视觉效果和性能。实操心得RoadRunner的资产库可能有限。对于独特的建筑或景观你可以在其他三维软件如Blender中制作好FBX模型然后导入到RoadRunner项目中作为“自定义模型”使用。导入时注意单位比例通常使用米和轴向Y向前Z向上。3.3 导出为FBX与OpenDRIVE地图设计完成并烘焙后需要导出两种核心数据格式FBX文件三维模型这是包含所有三维网格、材质信息和基础UV的模型文件。在导出设置中务必注意几何体选择导出“所有场景对象”或你定义的地图组。单位设置为“米”Meters。轴向确保为“Y向前Z向上”Y Forward, Z Up这是UE4和CARLA的标准。平滑组这是一个巨坑RoadRunner导出的FBX有时会丢失平滑组信息导致模型在UE4中导入后所有面呈现不自然的“硬边”断裂感而不是光滑的曲面。在导出FBX的“高级选项”中务必找到关于“平滑组”Smoothing Groups或“切线空间”Tangent Space的选项并尝试勾选“导出平滑组”或类似设置。如果RoadRunner界面没有你可能需要在导出后用Autodesk FBX Converter命令行工具进行二次处理添加平滑组信息。OpenDRIVE文件.xodr这是描述路网拓扑、车道几何、交通标志和信号逻辑的XML格式文件。CARLA的交通流、导航和传感器语义分割都依赖于此文件。导出时选择OpenDRIVE 1.4或1.5格式CARLA 0.9.10支持1.4。检查导出的.xodr文件确保其中包含了你设置的所有车道连接关系和信号灯位置。至此你得到了两个核心文件MyCityMap.fbx和MyCityMap.xodr。4. UE4.24中的地图加工与CARLA适配拿到FBX和OpenDRIVE文件只是完成了原材料的生产。接下来需要在UE4这个“厨房”里对食材进行加工、调味最终做成CARLA能“食用”的菜肴。4.1 创建UE4项目与导入FBX创建空项目启动编译好的UE4.24编辑器创建一个“空白”Blank项目选择“无初学者内容”No Starter Content项目模板选择“C”因为后续需要编译CARLA的插件。给项目起个名字例如CarlaMapProject。导入FBX模型在内容浏览器中右键选择“导入”Import找到你的MyCityMap.fbx文件。导入设置窗口非常关键导入为静态网格体保持勾选。组合网格体如果RoadRunner导出的FBX包含多个部分可以尝试勾选此项将其合并便于管理。自动生成碰撞建议取消勾选。RoadRunner模型通常非常复杂自动生成的碰撞盒效率极低且可能出错。我们后续会使用更优化的碰撞体。生成光照贴图UV必须勾选。这是为静态模型生成第二套UV用于烘焙光照贴图对最终场景光照效果影响巨大。变换检查缩放是否为1.0旋转和轴向是否正确。 点击导入后你会在内容浏览器中得到一个或多个静态网格体Static Mesh资产。处理平滑组丢失问题如果导入后发现模型全是硬边证实了FBX平滑组丢失。在UE4中补救在内容浏览器中双击打开导入的静态网格体资产。在网格体编辑器Mesh Editor中找到“细节”Details面板下的“法线”Normals部分。尝试将“法线计算方法”Normal Computation Method从“区域加权”Area Weighted改为“角度阈值”Angle Threshold并适当调整“阈值角度”Threshold Angle例如45度。这会让UE4根据面的夹角自动重新计算平滑的法线。如果效果不佳最根本的解决办法是回到RoadRunner或使用三维软件重新导出带有正确平滑组的FBX。4.2 材质创建与场景搭建创建基础材质RoadRunner烘焙时生成了纹理贴图通常是一张或多张漫反射贴图。你需要基于这些贴图在UE4中创建材质。在内容浏览器中创建新的材质Material命名为M_Road。打开材质编辑器将纹理采样器节点Texture Sample连接到基础颜色Base Color。如果需要还可以连接法线贴图Normal、粗糙度贴图Roughness等。一个简单的PBR物理基础渲染材质就完成了。将其拖拽应用到场景中的道路网格体上。构建场景关卡将导入的静态网格体从内容浏览器拖入关卡视口。调整位置使其位于世界原点0,0,0附近。此时你的地图还只是一个“白模”没有光照和氛围。添加光照与大气从模式面板Modes Panel拖入一个“定向光源”Directional Light模拟太阳一个“天空大气”Sky Atmosphere组件和一个“指数级高度雾”Exponential Height Fog组件。调整光源的角度和强度营造出所需的时间如正午、黄昏氛围。优化碰撞体如前所述我们需要为复杂的地形和建筑创建简化的碰撞体。选中道路网格体在细节面板的“碰撞”Collision部分点击“碰撞复杂性”Collision Complexity并选择“使用简单盒体作为复杂”Use Simple Collision As Complex。但这通常不够。更好的方法是在三维软件中为地图创建一个极度简化的低多边形版本仅包含地面和主要障碍物轮廓导出为FBX。在UE4中导入这个简化模型并勾选“导入为碰撞体”Import as Collision。将这个碰撞网格体指定给原始精美地图网格体的“自定义碰撞”Custom Collision属性。这样物理计算使用简单的碰撞体而渲染使用精美的模型兼顾了性能和效果。4.3 集成CARLA插件与导入OpenDRIVE这是将UE4关卡转化为CARLA可运行地图的关键一步。准备CARLA插件进入之前克隆的carla源码目录找到Unreal文件夹。将其中的Carla插件文件夹复制到你UE4项目的Plugins目录下如果没有就创建。编译项目由于是C项目且添加了插件需要重新编译。关闭UE4编辑器在项目根目录包含.uproject文件右键选择“生成Visual Studio项目文件”如果你在Windows上操作过在Linux下对应的是运行.sh脚本。实际上更直接的方法是# 在项目根目录下 /path/to/your/UnrealEngine/Engine/Binaries/Linux/UE4Editor /path/to/your/CarlaMapProject/CarlaMapProject.uproject -game这会启动编辑器并触发编译。或者你可以用终端进入项目目录执行make或打开生成的.sln文件进行编译如果生成了的话。启用插件启动项目后在编辑器菜单栏选择“编辑”Edit - “插件”Plugins在“项目”分类下找到“Carla”确保其已被启用。可能需要重启编辑器。导入OpenDRIVE在内容浏览器中你应该能看到一个“Carla”的文件夹。右键点击选择“导入OpenDRIVE”。选择你导出的MyCityMap.xodr文件。导入成功后关卡中会自动生成一些代表车道和路口的Actor如Road、Junction并且内容浏览器中会生成一个“地图”资产通常叫MyCityMap。关联地图与场景确保你的三维场景模型从FBX导入的网格体与OpenDRIVE生成的道路网络在空间上是精确对齐的。你可以通过移动场景模型或微调OpenDRIVE导入时的原点来实现。5. 地图打包与在CARLA中运行测试关卡在UE4编辑器中看起来完美后我们需要将其“烹饪”成CARLA服务器能够加载的格式。5.1 使用CARLA的自动化打包脚本CARLA提供了强大的Python工具链来简化这个过程。这是最推荐的方式因为它能处理所有繁琐的依赖和配置。环境准备确保你的系统已安装Python 3Ubuntu 18.04默认可能是Python 3.6CARLA 0.9.10支持。并安装必要的Python包pip install --user setuptools运行打包命令在CARLA源码根目录下使用make命令来打包你的地图。但首先你需要告诉make你的UE4编辑器和项目的路径。# 设置环境变量 export UE4_ROOT/path/to/your/UnrealEngine # 进入carla源码目录 cd /path/to/your/carla # 执行打包命令假设你的UE4项目名是CarlaMapProject make launch UE4Editor/path/to/your/UnrealEngine/Engine/Binaries/Linux/UE4Editor UPROJECT/path/to/your/CarlaMapProject/CarlaMapProject.uproject这个命令会编译CARLA本身如果还没编译过。启动UE4编辑器并打开你的项目。执行一系列操作将关卡、模型、材质、碰撞等所有资源打包成一个CARLA能识别的.umap文件和相关资产包。最终输出到carla/Dist目录下。避坑清单项2打包过程可能因内存不足而失败尤其是在处理大型地图时。如果UE4编辑器在打包过程中崩溃尝试在编辑器中手动减少地图的复杂度如先隐藏部分建筑或者增加系统的物理内存和交换空间。另外确保UE4_ROOT路径设置正确且该路径下的UE4是完整编译通过的版本。5.2 在CARLA中加载自定义地图打包成功后在carla/Dist目录下或carla/Unreal/CarlaUE4/Content下的对应目录会生成你的地图包。启动CARLA服务器cd /path/to/your/carla/Dist/CARLA_0.9.10-*.Linux ./CarlaUE4.sh -quality-levelLow -benchmark -fps20参数说明-quality-levelLow可以提升性能-benchmark -fps20用于稳定帧率。指定地图默认启动的是Town地图。要加载你的地图有两种方式方式一替换默认地图。将你打包生成的地图文件如MyCityMap.umap重命名为TownXX.umap例如Town05.umap并替换掉CarlaUE4/Content/Carla/Maps/目录下的同名文件。然后正常启动服务器它就会加载你的地图。方式二通过Python API加载。这是更灵活的方式。在另一个终端使用CARLA的Python客户端import carla client carla.Client(localhost, 2000) client.set_timeout(10.0) world client.get_world() # 假设你的地图资产在Content中的路径是 /Game/Carla/Maps/MyCityMap world.load_world(MyCityMap)测试与验证服务器启动并加载地图后你可以运行CARLA提供的示例Python脚本如manual_control.py来生成车辆并在你的新地图中自由驾驶。检查以下关键点视觉渲染道路纹理、建筑、光照是否正常显示有无模型缺失或闪烁物理碰撞车辆能否在道路上正常行驶是否会卡在莫名的地方用脚本生成车辆并设置自动巡航观察其行为。导航信息使用client.get_world().get_map()获取地图对象尝试生成从A点到B点的路径点waypoints验证OpenDRIVE数据是否被正确解析导航网格是否正常生成。交通设施交通标志和信号灯的位置是否与RoadRunner中设计的一致它们能否被CARLA的传感器如相机语义分割正确识别6. 完整避坑清单与疑难问题排查以下是我在整个流程中遇到的最具代表性的问题及其解决方案希望能帮你节省大量时间。问题阶段具体现象可能原因解决方案环境配置UE4编译失败报错fatal error: ‘stddef.h’ file not found或类似。缺少Clang相关库或版本不匹配。确保安装了clang-6.0和libc-dev等包。运行./Setup.sh和./GenerateProjectFiles.sh前可尝试sudo apt install clang-6.0 lld-6.0 libc-dev libcabi-dev。环境配置系统重启后卡在登录界面循环无法进入桌面。NVIDIA显卡驱动与内核或X服务器不兼容。进入恢复模式或TTY终端卸载当前驱动安装一个更旧的稳定版本。例如sudo apt purge nvidia-*然后sudo apt install nvidia-driver-450-server。更新内核也可能解决sudo apt install linux-generic-hwe-18.04。RoadRunner导出FBX模型在UE4中导入后所有面呈硬边“碎裂”状不光滑。FBX文件丢失了“平滑组”Smoothing Groups信息。首选在RoadRunner导出FBX时仔细检查高级选项启用“平滑组”导出。补救在UE4静态网格体编辑器中调整“法线计算方法”和“阈值角度”。根本解决使用Autodesk FBX Converter命令行工具对FBX进行后处理fbxconverter -c myfile.fbx myfile_smoothed.fbx具体参数需查手册通常与平滑组相关。RoadRunner导出导出的OpenDRIVE (.xodr) 文件在CARLA中导入后车道连接关系错误或丢失。RoadRunner中的车道连接逻辑设置不完整或有误或导出版本不兼容。在RoadRunner中仔细检查每个路口Junction的车道连接器Lane Connector确保每条进入和驶出的车道都被正确连接。尝试导出为OpenDRIVE 1.4格式。用文本编辑器打开.xodr文件搜索junction标签人工检查连接关系。UE4导入与处理导入复杂FBX时UE4编辑器卡死或崩溃。模型面数过高或内存不足。在RoadRunner中导出前尝试简化模型细节或分块导出如地形、道路、建筑分别导出为多个FBX文件。在UE4中分批导入。确保系统有足够的内存32GB以上更稳妥。UE4导入与处理光照贴图烘焙后场景出现难看的明暗条纹或漏光。自动生成的第二套UV光照贴图UV质量差存在重叠或拉伸。在静态网格体编辑器中手动调整或重新生成光照贴图UV。在“细节”面板的“网格设置”下找到“光照贴图坐标索引”将其设置为1使用第二套UV然后点击“构建”下的“生成光照贴图UV”按钮调整参数如“最小光照贴图分辨率”、“填充”等并预览效果。CARLA插件集成启用Carla插件后UE4编辑器编译失败报错找不到Carla模块。插件路径不正确或项目不是C项目。确保Carla插件被放置在项目的Plugins/文件夹内且目录结构为Plugins/Carla/。项目必须是C项目。如果是从空白C项目开始确保已成功编译过一次。尝试在终端中手动运行项目的.sh编译脚本。地图打包运行make launch打包时UE4编辑器启动后无反应或报错。环境变量UE4_ROOT设置错误或UE4编辑器路径不对。确认UE4_ROOT指向的是UnrealEngine的根目录而不是Engine子目录。确认UE4Editor的路径是绝对路径且该文件有可执行权限。可以尝试直接运行该UE4Editor二进制文件看是否能正常启动。CARLA运行测试服务器能启动但加载自定义地图时客户端报超时或地图不存在错误。地图资产未正确打包到CARLA的Content目录或Python API中地图名称拼写错误。检查打包输出目录确认.umap和相关的.uasset文件是否生成。确认在Python API中load_world(‘MapName’)的 ‘MapName’ 不包含文件后缀且路径与内容浏览器中的路径一致例如/Game/Carla/Maps/MyCityMap对应load_world(‘MyCityMap’)。CARLA运行测试车辆在地图上“漂浮”或陷入地下。场景模型FBX的坐标原点与OpenDRIVE数据的原点不匹配或模型底面Z0平面不是地面。在UE4中确保FBX导入的网格体其底面通常是道路面在世界Z轴为0或接近0的位置。使用OpenDRIVE导入生成的道路网络作为参考移动场景模型与之对齐。检查模型的碰撞体是否贴合地面。最后分享一点个人体会。这套流程的复杂性主要来自于三个不同领域的专业工具道路设计、游戏引擎、仿真平台的集成每个环节都有其特定的知识门槛和潜在的兼容性问题。我的建议是分阶段验证先在RoadRunner中做一个极简的十字路口地图导出后快速走通UE4导入和CARLA加载的流程。成功后再逐步增加地图的复杂度和细节。过程中保持耐心善用每个软件的官方文档和社区论坛如UE4 AnswerHub、CARLA Discord大部分你遇到的坑很可能已经有人踩过并分享了解决方案。当你第一次在CARLA中驾驶着车辆在自己亲手打造的城市街道上飞驰时那种成就感会让你觉得所有的折腾都是值得的。这张专属地图将成为你算法研发和测试中最得力的沙盘。