ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

Carla自定义地图教程:RoadRunner导出到UE4导入保姆级指南

Carla自定义地图教程:RoadRunner导出到UE4导入保姆级指南 1. 先说清楚为什么要折腾RoadRunner地图导入这件事先给一个直接结论你是想让Carla能跑你自己画的路网而Carla的仿真场景是基于UE4的所以RoadRunner画好的地图必须进UE4Editor走一遍导入流程Carla才能在运行时把地图加载出来。我见过不少刚接触CARLA的读者在RoadRunner画了两条路就急着跑Python脚本结果一加载地图跑出来一片空白甚至报错说找不到map原因基本都是卡在了“地图文件没进UE4”这一步。RoadRunner是MathWorks家的自动驾驶场景建模工具。它的核心价值是可以像开图软件一样拖拽道路设置车道数量、车道宽度、交叉口、路侧标志、信号灯甚至还支持把地图高程、纹理、路面标线做得很接近真实环境。它的优势不在“建模好看”而在于你画出来的每一条路、每一个车道都有语义——哪条车道能直行、哪条车道只能右转、信号灯挂在哪个位置、停止线离路口多远这些信息都可以在RoadRunner里直接编排好。这些语义数据如果没有转化成Carla认识的东西那就毫无价值。Carla认识什么Carla基于UE4所以三维网格、材质、碰撞体都得是UE4里的资源Carla还要跑自动驾驶算法所以车辆、行人、红绿灯的推理依赖OpenDRIVE这种结构化路网格式。RoadRunner导出时会把三维场景导出成FBX把路网语义导出成OpenDRIVE也就是.xodr文件UE4Editor这边的Carla插件再读取这些文件生成一个完整的UE4关卡。换句话说导入过程本质上是“把FBX的皮和XODR的骨头缝合到一起”。这篇文章就是保姆级流程我会把RoadRunner导出文件、UE4Editor里的Carla插件入口、导入过程中的关键参数、导入后怎么验证有没有成功以及我实测踩过的坑全部过一遍。无论你用Carla 0.9.x哪个小版本还是正在用最新版预览只要大流程看得懂细节可以顺着菜单名称微调。2. 动手之前把RoadRunner导出物和Carla版本一次性理顺很多人在导入报错之后才回来看文件这就晚了。导入这步卡住十次有八次是文件不齐或版本不对而不是操作点错了按钮。所以我先从准备工作讲起。2.1 你手头需要准备的文件清单RoadRunner导出的内容不止一个文件这可能是最容易出问题的地方。一次标准的RoadRunner导出会得到一个目录里面至少应该包含以下几类内容文件类型典型扩展名作用缺失后果OpenDRIVE路网文件.xodr描述道路几何、车道拓扑、路口、信号灯关联关系路网骨架直接没了导入器无法生成可驾驶车道三维网格文件.fbx路面、人行道、护栏、交通设施的三维模型场景只有逻辑道路和车道线看不到任何几何体材质贴图目录通常是一个与FBX同名的文件夹里面是纹理图片给FBX网格贴上柏油、标线、人行道材质模型变成纯色或紫色视觉上完全不能用信号灯及路侧标志资产.fbx或独立Object信号灯、停止线、让行牌等红绿灯不生成交规逻辑缺失工程辅助文件.rrdata.xml等记录RoadRunner工程信息不算关键但会影响二次迭代RoadRunner在不同版本里导出的按钮位置有差异。有的版本菜单是“File → Export → Export OpenDRIVE 1.6”有的版本在做FBX导出时会带出一个贴图收集目录。建议画完路以后新建一个空文件夹把xodr、场景主FBX、同名的_textures或_fbm贴图目录、信号灯资源都放到同一个目录层级下不要散得到处都是。千万别在网络共享盘上做这件事贴图路径里带中文或者网络映射盘符UE4导入时经常出幺蛾子。宁可拷到本地磁盘也别贪图方便在共享文件夹里直接导入。2.2 Carla与UE4Editor的版本对应关系Carla是一个基于UE4二次开发的工程所以对UE4Editor的版本要求非常严格。你用一个跟Carla篇程版本不匹配的UE4Editor去打开它的工程轻则插件无法加载重则直接编译报错。官方文档一直强调不同Carla版本对应着不同的UE4版本。Carla版本对应UE4版本Carla 0.9.9~0.9.13UE4 4.24Carla 0.9.14~0.9.15UE4 4.26Carla 0.9.16~较新版本多为UE4 4.26少数预览版可能更高最新发布版以对应GitHub Release说明为准我建议你在动手之前先确认两件事第一你下载的Carla包是预编译版还是源码版第二这个Carla版本对应的UE4版本你在本机装没装对应的UE4Editor。预编译版一般不需要自己编译UE4完整代码但打开UE4工程时版本必须匹配。源码版则还要处理编译期间的依赖问题情况更复杂新手就不要一开始就折腾源码版了。有一个非常典型的坑电脑上如果装了多个UE4Editor版本右键点击CarlaUE4.uproject时一定要确认选择了正确的那一个。UE4的关联图标很容易被后来安装的版本抢走结果你双击打开等了半天编辑器起来以后说版本不兼容然后又得重新选浪费时间不说Carla工程配置可能被系统错误地迁移过。2.3 目录整理避免中文路径和奇怪压缩包结构这一节是对新手格外重要的经验。Carla和UE4对路径里的中文支持并不算好当然也不是百分之百不能跑但一旦出了问题报错往往莫名其妙你会花许多时间在无关的方向上排查。所以最稳的办法就是从一开始就按下面的规范来整个RoadRunner导出目录放到比如D:\CarlaMap\MapA这种纯英文路径下U盘、桌面、网盘目录都别放。压缩包解压以后不要让所有文件直接裸露在根目录最好是有一个明确的工程文件夹层级。目录名也不要带空格用MapA而不是Map A虽然多数情况下空格问题不大但多一事不如少一事。用Preview版本跑起来没问题之后再把目录切到正式环境避免反复倒腾。我见过一个读者RoadRunner文件在桌面桌面用户名是中文的UE4导入的时候一直提示找不到texture source排查到最后才发现是路径中文导致贴图找不到。把它挪到盘符根目录问题直接消失。2.4 打开CarlaUE4工程并确认插件状态准备好文件之后先打开一次UE4Editor。用正确版本的UE4Editor打开Carla提供的CarlaUE4.uproject文件。首次打开会有较长等待时间因为要加载插件和编译一些编辑器模块这期间最好别去乱点或者强制关闭不然会导致项目文件损坏。打开后在UE4Editor顶部的菜单栏里应该能看到Carla相关菜单。如果你的版本没有显示就去Edit → Plugins里找到Carla Plugin确认已经勾选并启用。有些Carla版本里插件里面还包含若干子模块比如RoadRunner导入器、地图生成、传感器相关逐个核对一下是否激活。如果没有Carla菜单原因大概率是版本不匹配或者插件没有编译成功。这时候先别继续导入不然白折腾。3. UE4Editor导入RoadRunner地图的保姆级操作准备工作做完终于进入核心环节。这一节我按点击顺序来配着我和团队实测过的操作尽量写成一张可以直接照着走的“地图”。3.1 打开Carla的场景执行入口和RoadRunner导入面板在UE4Editor里Carla的导入入口通常藏在Window菜单下。不同Carla版本命名的细节略有差异但差别不大常见的是Window → Carla → Map Importers或者Window → Carla → RoadRunner。这个面板就是UE4Editor和RoadRunner导出的文件进行对接的中枢。打开面板以后你看到的不是一大堆需要手动填的艰深参数而是一个面向用户的图形界面。通常由几个块组成一个用来选择RoadRunner导出目录的输入框。地图名称用于生成新的UE4 Level比如MapA。一些可选项例如是否生成交通信号灯、是否导入模型的辅助碰撞体、是否把RoadRunner信号灯替换成Carla原生信号灯等。底部是一个大大的Import按钮。如果你是第一次打开这个面板不妨先好好观察一下当前Carla版本的选项不要一上来就点。先把各个下拉框点开看看默认值是什么心里有数。3.2 选择RoadRunner导出根目录并自动识别文件点击目录选择按钮选中你在第2节整理好的RoadRunner工程目录。选中之后导入器一般会自动识别目录下的.xodr文件和主FBX文件。如果两个文件不在同一目录有的Carla版本允许手动分别指定XODR路径和FBX路径有的版本则要求它们必须存在于同一目录下。平时我习惯这样组织目录在D盘建一个CarlaMap根目录里面按地图名建子目录每个子目录里统一放置xodr、FBX和贴图子文件夹。上图中如果有一个Scene文件夹要注意主FBX可能藏在里面这时候需要手动找准不然导入进来的模型可能只有路网语义却没有任何三维几何。这里要特别强调一个容易忽略的动作在导入前打开你的FBX所在文件夹确认贴图文件夹也一起移动过来了。有的RoadRunner版本导出的贴图目录不叫_textures而叫Assets甚至有个_fbm目录就是FBX提取的纹理缓存。不管叫什么名字只要它跟FBX文件同名并且同目录基本就是它了。如果贴图目录缺失导入能成功但材质会大面积变成紫色或者灰白色后面处理起来很痛苦。3.3 参数设置地图名称、存储路径和信号标志的相关选项参数设置这一步至关重要。地图名称建议用英文字母加下划线不要带中文和空格。比如TestRoadMap、Campus_A这类。地图名会直接影响生成出来的Level名称而Level名称又会影响后面Python客户端加载时要填的open_world参数所以一定要记下你在这里填的名称。还有两个选项我建议按照下面方式处理如果你这个地图要做自动驾驶算法测试信号灯务必勾选导入并且选择生成Carla原生信号灯Actor。这样灯光控制器可以直接管理红绿灯相位否则信号灯只是个装饰不参与交通控制逻辑。如果只是做渲染或者视觉仿真不关心交规逻辑那信号灯选项可以随意但也要把信号灯资产导入保证场景完整。有些Carla版本会提供“是否将道路网格转换成Static Mesh”之类的选项。这个选项我建议开启因为转换成Static Mesh之后后面可以给路网加碰撞体、做Lightmap烘焙性能也更稳定。3.4 执行导入并理解编辑器输出日志点击导入以后UE4Editor看起来会“卡”一会儿。别慌这通常是导入器正在执行几个密集操作解析XODR文件、重建道路骨架、创建道路网格组件、导入FBX场景、把信号灯资产拆解并挂载到对应的Anchor点上。整个过程从几分钟到十几分钟不等取决于道路规模和机器配置。此时你要看的是Window → Output Log。Carla的导入器会在日志里打印当前执行阶段比如正在解析OpenDRIVE、正在导入静态网格、正在生成交叉口、正在更新路网寻路数据等。如果每一步结束后只看到Warning但没看到Error通常都能顺利生成。比较常见的Error模式是Unable to find file .xodrFailed to open FBX fileNo mesh found in FBX这些都要回溯到目录选择是否正确、文件是否齐全上。如果你在日志里看到关于road sign或者signal的警告一般不需要太担心可以等地图生成以后在编辑器里手动纠正姿态。日志刷完导入器通常会把生成好的Level添加到当前世界此时你会发现场景视口里已经出现道路了。先别急着攥拳庆祝保存地图是关键一步点击CtrlS保存当前Level。地图名字要牢记后面Python脚本里load_world要用。如果是第一次保存这个LevelUE4会弹窗询问保存路径和名称。我建议保存在CarlaUE4/Content/Maps下名称保持和刚才填的地图名一致。这样做的好处是后面在Carla运行时能通过世界名直接定位到地图。3.5 关卡保存与基础网格检查保存以后检查一下Content Browser里生成出来的资产结构图。正常情况你会看到和Level同名的文件夹里面至少包含以下几类东西道路网格通常以StaticMesh形式存在。一批由XODR生成的路段Actor以及Spline途径点。信号灯的蓝图或者预制体也包括停止线和让行标志。路面材质实例。这时候在视口里可以转一下视角看道路是否从地面“飘”起来、是否断成很多截、有没有大面积缺面。还要检查比例如果RoadRunner里默认单位是米而UE4里世界单位是厘米导入器通常会乘以100倍但如果导出时单位配置不一致可能会出现比例明显不对的情况。遇到地面模型和路网位置对不上后面第5节会有排查思路。4. 导入后必做的检查与二次修正导入成功不等于万事大吉。我见过太多人导入出来就急着切回Carla跑Python结果车在场景里乱开或者视觉场景跟路网逻辑完全分家。所以导入之后先花几分钟把下面几项检查做了比后面返工有效率得多。4.1 打开地图确认路网和静态环境有没有“漂移”打开新生成的Level第一件事不是放车而是用上帝视角从正上方看一遍道路。重点观察几件事道路中线是否和FBX模型的路面中心线重合。路口是否交叉得干净有没有出现两条虚拟车道在同一路段内重叠。道路旁边的人行道、路缘石有没有和路面错位错位程度是否超过视觉可接受范围。正常情况下RoadRunner导出后会有一位偏差因为XODR是逻辑道路几何FBX是带高程和表皮细节的渲染网格。如果只是一个很小的偏移不影响Carla自动驾驶仿真因为车辆行驶时主要以RoadRunner导入器生成的逻辑车道和Spline为准。但如果偏移很大比如路网跑到了路外那就要检查在RoadRunner导出时坐标系是不是设置得不一样。我遇到过一种情况RoadRunner工程里原点选在了某条高速的终点而FBX导出时使用了局部坐标结果导入到UE4后路网逻辑在原点附近三维网格却跑到几千公里外。这种视觉上简直是“两条平行世界”只能回RoadRunner统一导出设置或者在导入面板里手动输入一个偏移值对齐。4.2 碰撞体、路面材质和贴图缺失检查没有碰撞体的路面车辆开上去直接掉到模型底下这个应该不算冷知识了。Carla的RoadRunner导入器一般会为路面自动生成碰撞体但并不是所有网格都自动加了。比如路缘石、护栏、信号灯柱有些版本不会自动生成碰撞体需要你手动在StaticMesh编辑器里添加。检查方法很简单在视口选中一个路面模型按一下键盘上的End键让Actor吸附到地面。然后点击某个Actor查看右侧Details面板里的Collision设置打开简单碰撞显示。如果看到的绿色碰撞线只是包围盒子笼统地框住整条路说明碰撞精度可能不够需要调整。贴图缺失是另一个高频现象。如果视口里出现了大面积紫色或者纯白材质说明FBX纹理路径失效了。常见原因是RoadRunner导出时的贴图目录没有跟着FBX一起拷过来或者贴图路径里面带有特殊符号。补救办法是重新贴材质或者在编辑器的StaticMesh编辑界面里把对应贴图重新指定到正确图集。但这个过程很繁琐最好的策略还是回到第2节的目录整理阶段在导入前就把资源全部备齐。4.3 交通信号灯的坐标与朝向修正RoadRunner里红绿灯的朝向、停止线位置和现实逻辑是可以设置清楚的但导入Carla之后经常会看到信号灯悬在半空、灯头朝向反了或者信号灯与停止线之间距离严重不对。原因一般出在三处。第一RoadRunner在导出信号灯时坐标参考系和UE4坐标参考系不一致有个90度甚至180度的旋转偏差。第二红绿灯Anchor点本身在RoadRunner里就放得不够精确偏向路边或漂在车道上方。第三在导入器选项里你选择了转换为Carla原生信号灯而转换器需要依赖XODR中定义的道路参考线如果参考线和信号灯挂接关系没对齐转换后姿态就可能歪。遇到信号灯位置不对如果是个别灯柱悬空直接在编辑器里手动移动旋转就行。但如果整批信号灯都有系统性偏移建议回到RoadRunner里把信号灯Anchor统一调整再重新导出。这样比在UE4里一个个挪更省时间也更接近真实路口的几何关系。5. 避坑实录RoadRunner导入最常见的6个问题踩坑几乎是不可避免的这里我把遇到次数最多、问朋友也问得最多的问题集中整理成一个速查表基本上能把新手最常卡住的点都覆盖掉。问题表现可能原因处理方式导入器面板里文件识别为灰色目录缺少.xodr或xodr版本不是1.6回到RoadRunner重新导出OpenDRIVE 1.6导入后视口全黑看不到路Level没有没有加载或者摄像机在路面以下视图里选择Lit模式双击Map Actor查看路网逻辑和FBX网格明显错位RoadRunner导出原点和FBX导出原点不一致以RoadRunner工程原点为基准统一两边导出设置车开起来不沿着车道走XODR车道连接或交叉口语义不完整回到RoadRunner检查车道连接重新导出红绿灯和停止线对应不上信号灯Anchor偏了或转换选项没勾好在UE4里调整信号灯位置必要时重置XODR信号关联路面模型没有碰撞体车辆穿模StaticMesh碰撞体未勾选在StaticMesh编辑器里自动生成简单碰撞体或复杂碰撞体5.1 导入后地图黑屏或周围空白黑屏通常不是因为导入失败而是因为你还没把新生成的Level设为当前世界。导入器有时只是生成了Level资产没有自动打开它。这时候在Content Browser里找到你保存的Map双击打开然后在World Settings里确认Carla相关的配置已经关联到当前Level。另一个可能就是摄像机初始位置在路面以下或者被墙挡住按一下F键让视口聚焦到选中的Actor上不然视角一片漆黑很容易吓到自己。5.2 路网漂移、车道连接断裂如果你在地图里看到道路逻辑线一会儿在地上湿的一会儿又跑到路边或者路外多半是XODR里车道连接和交叉口逻辑不完整。RoadRunner里画路时如果用默认的“道路连接”很多时候交叉口自动生成会留下一些小碎边。导出时这些碎边会变成一段段短小的路段在Carla导入后就会出现车道端点漂移。这种问题没有捷径回到RoadRunner把有问题的交叉口重新生成一遍拉宽一点转角范围让连接处更加平顺后再导出。通常重新导出后的xodr会覆盖旧解析不会有太多后遗症。5.3 信号灯位置错乱一个经常被忽略的根因除了坐标参考系问题还有可能是在RoadRunner导出时勾选了“Export Terrains”之类的选项地形网格和信号灯Anchor产生了一些位置偏移。这个根因不太容易发现因为看起来所有道路、地形都正常只有信号灯看起来很奇怪。解决方法就是在RoadRunner中把信号灯的Z坐标统一调整到路面以上一个固定高度比如6米再导出。不要依赖自动随机信号灯的Anchor必须做成“正好挂在车流上方”的位置Carla导入后才能保证朝向和空间位置都稳定。5.4 车辆不按路网行驶OpenDRIVE语义不完整的排查如果地面显示正常但车辆从客户端加载后不会沿着路走此时首先要去查打开的道路是不是Carla可识别的OpenDRIVE。Carla在运行时会对XODR做二次解析如果XODR里车道类型设置成了非Driveable或者车道连接缺少Successors和Predecessors车辆就不会在这条车道上行驶。排查时可以调用Carla的Python API读取当前世界的道路拓扑把所有车道类型和连接关系打出来看一遍。定位到问题路段后回到RoadRunner里检查车道规则尤其是路口内部的链接线确保每条车道都有完整的前驱和后继。5.5 贴图丢失材质全紫色前面已经略微提过贴图丢失几乎全是因为FBX纹理目录没和FBX文件同步或者贴图路径含中文。UE4加载FBX时会自动寻找同名的纹理文件夹并在内容浏览中生成同名的材质资源。如果这个文件夹没拷全材质就会变成默认的紫白格子。重新拷贝完整文件后你不需要重新导入整个地图可以直接在StaticMesh编辑器里重新指定材质但那样逐条道路改很累。更推荐的做法是把正确的贴图目录放回原路径然后重新在导入器里导入一次地图让RoadRunner导入器重新生成材质。5.6 版本冲突导致面板不出现在编辑器里如果你打开UE4Editor后死活找不到Carla菜单或者菜单是灰的不用怀疑多半是Carla插件因为UE4版本不匹配没有成功加载。这时候去Edit → Plugins搜索Carla看有没有红色报错或禁用。还有一个小概率情况Carla UE4工程没有运行在对应的编译模式下。如果你只用Debug运行有些Carla版本的插件模块只会在Development Editor配置下编译。把编译配置切成Development Editor再重新启动UE4Editor问题通常会消失。6. 让导入的地图真正可用的收尾工作导入完成、检查通过只代表你获得了一张“可以看的图”。要把地图真正用于仿真还需要做收尾工作否则车辆和传感器无法正常驱动。6.1 为地图更新车辆导航与运行时相关设置Carla在客户端运行时并不是直接读取UE4的Level里的Actor作为导航依据而是会通过Carla服务器端把OpenDRIVE解析成路网拓扑然后结合UE4世界里的对应Actor协同工作。因此导入了XODR并不代表服务器会自动识别新增地图。第一次加载你的新地图之前建议在CarlaPythonAPI的脚本里明确使用world client.load_world(MapA)再通过world_map world.get_map()验证地图是否能获取。如果get_map()拿到的是旧地图或者空数据说明当前Carla进程之前加载的服务器世界数据还没有刷新需要重启Carla服务进程重新加载一次。6.2 用Python脚本验证地图是否真正可用我每次导入新图后都会跑一段非常简单的Python脚本确认整个链路没有断掉。脚本的主要工作包括连接Carla客户端指定端口。调用load_world加载刚才保存的地图。获取地图对象打印地图名字和自车生成点数量。在地图上放一辆测试车切换自动驾驶模式看车辆能否在道路上行驶几秒钟。这一步能一次性验证四个环节地图名字是否有误、路网拓扑能否被Carla服务器解析、自车Actor能否在地图里生成、车辆能否作为可驾驶对象在道路上巡线行驶。如果车辆卡在生成点不动回头看第5节问题排查中的车道连接情况。6.3 地图迭代与重复导入的注意事项只要你还在调RoadRunner里的道路结构就免不了要反复导入。重复导入时最好把之前的旧Level先另存备份再重新导入避免覆盖掉你已经做好的二次微调。另外同一RoadRunner文件夹下如果有多个版本的xodr导入器容易读错文件所以每次迭代最好在RoadRunner里清理掉不再使用的临时文件。我自己常用的习惯是一个地图对应一个独立目录每出一个新版本就把目录拷贝一份加一个版本号后缀比如MapA_v2。导入时只选择当前要用的那一份绝对不图省事共用同一个目录。这样排查问题非常节省时间因为RoadRunner重新导出常常会覆盖文件你很难判断当前导入的是哪一版。最后再说一个小习惯在UE4Editor里做完碰撞、材质修正后别只保存Level建议每天定期做一次整个Content目录的备份。Carla开发过程中UE4工程资源损坏是常有的事备份才是最好的后悔药。
返回列表