1. 项目概述:RoadRunner 地图构建不是“画图”,而是 CARLA 仿真链路的底层基建
在 CARLA 模拟器的实际工程落地中,我见过太多团队卡在第一步——地图加载失败、车辆一 spawn 就坠入虚空、传感器数据错位、交通流无法生成。问题排查三天后发现,根源不在 Python 脚本,不在 Python API 调用,甚至不在 CARLA Server 配置,而是在 RoadRunner 里导出的
.xodr
和
.fbx
文件本身。RoadRunner 不是 Photoshop,它输出的不是一张“好看的地图图片”,而是一套严格遵循 OpenDRIVE + Unreal Engine 5 双标准的
可执行空间模型
。它同时承载着三重角色:道路几何定义者(OpenDRIVE)、物理碰撞体提供者(FBX Mesh + Collision Hull)、语义标签载体(Lane Marking Type、Traffic Sign ID、Road Type)。这意味着你在 RoadRunner 里拖拽一条车道线,背后触发的是 OpenDRIVE 的
<lane>
节点生成、Unreal Static Mesh 的 UV 展开重算、以及 CARLA Python API 中
carla.Waypoint
对象的 lane_id / lane_type / is_intersection 等字段赋值逻辑。中文文档里那句轻描淡写的“在 RoadRunner 中创建地图”,实际等价于“为整个自动驾驶仿真系统铺设第一块承重地基”。如果你正准备做感知算法验证、规划模块测试、或端到端模型训练,这张地图的质量将直接决定你后续三个月的数据可信度——它决定了你的激光雷达点云是否能正确识别双黄线,决定了你的 BEV 分割网络能否学到“虚线=可变道”的先验,也决定了你的轨迹预测模型看到的“前方路口”是不是真实存在的拓扑连接点。这不是可选步骤,而是 CARLA 工程化落地的强制前置项。
2. RoadRunner 与 CARLA 的协同逻辑:为什么必须用 RoadRunner,而不是直接手写 OpenDRIVE 或 Blender 建模
2.1 CARLA 的地图加载机制决定了工具链不可替代性
CARLA 的地图加载流程是硬编码的三阶段流水线:
-
解析阶段
:CARLA Server 启动时,读取
.xodr文件,逐节点解析<road>、<lanes>、<laneSection>、<width>等 OpenDRIVE 元素,构建内部道路拓扑图(Graph of Road Segments); -
映射阶段
:将 OpenDRIVE 中的
<road>ID 与 Unreal Engine 中的 Static Mesh 名称进行字符串匹配(例如<road id="1">→StaticMesh'/Game/Carla/Maps/Town01/Town01_Road_1.Town01_Road_1'); -
实例化阶段
:根据
<junction>节点生成路口连接关系,为每条车道生成carla.Waypoint对象,并挂载lane_width、lane_change、is_junction等属性。
这个流程的关键约束在于:
CARLA 不解析任意 FBX,只认 RoadRunner 导出的、带特定命名规范和材质通道的 FBX
。我曾尝试用 Blender 手动建模并导出 FBX,结果 CARLA 加载后所有车道都变成“无车道类型”,
waypoint.lane_type
全是
carla.LaneType.Driving
,连人行道(
Sidewalk
)和路肩(
Shoulder
)都无法识别。原因在于 RoadRunner 导出的 FBX 中,每个 Mesh 的材质(Material)名称被强制编码为
LaneType_Sidewalk
、
LaneType_Shoulder
、
LaneType_Driving
,CARLA 的 C++ 加载器正是通过
FString::Contains("LaneType_")
来提取语义标签。而手写 OpenDRIVE 更危险——一个
<width>
节点的
a
、
b
、
c
、
d
四阶多项式系数若出现微小舍入误差(如
0.0001
写成
0.00010000000000000001
),CARLA 解析时会直接抛出
std::out_of_range
异常并终止加载。RoadRunner 的价值,正在于它把 OpenDRIVE 的数学严谨性(B-spline 曲线拟合、Clothoid 过渡段计算)和 UE5 的实时渲染需求(LOD 级别、碰撞体精度、材质通道)封装在一个可控 UI 中,避免工程师在 XML 文本和 3D 视口之间反复切换调试。
2.2 RoadRunner 的核心能力边界:它能做什么,不能做什么
RoadRunner 是“道路建模专用工具”,不是通用 3D 建模软件。它的能力矩阵非常清晰:
✅
强项
:
- 高精度道路几何建模 :支持导入 GPS 轨迹点(.csv/.kml),自动拟合 Clothoid 曲线,生成符合 ISO 19148 标准的道路中心线;
-
OpenDRIVE 自动生成功能
:所有拖拽操作实时同步生成合法
<road>、<lanes>、<objects>节点,无需手动编辑 XML; -
CARLA 专用导出模板
:一键导出
.xodr+.fbx组合包,FBX 中已预置 CARLA 所需的材质命名、碰撞体层级(Collision目录)、LOD 设置; -
语义标签体系
:内置
Driving,Sidewalk,Shoulder,Parking,Biking,Median,Border七类车道类型,且每类对应 CARLA 的carla.LaneType枚举值。
❌ 明确短板 :
-
不处理建筑与植被
:RoadRunner 无法建模楼宇、树木、路灯杆。这些必须在 Unreal Engine 中单独导入(
.fbx或.gltf),并通过 CARLA 的carla.World.spawn_actor()加载; -
不生成动态交通流
:
<object>节点仅支持静态对象(如交通标志、护栏),无法定义carla.TrafficLight的相位逻辑或carla.Vehicle的行为树; - 不支持复杂材质效果 :路面反光、积水反射、沥青纹理细节需在 UE5 中用 Material Instance 调整,RoadRunner 导出的材质仅为占位符(BaseColor = 纯色,Roughness = 0.8);
-
不校验 OpenDRIVE 语义一致性
:它允许你创建“一条车道同时标记为 Driving 和 Sidewalk”,这种非法组合会在 CARLA 运行时导致
Waypoint属性冲突,但 RoadRunner 不报错。
因此,RoadRunner 的正确定位是: CARLA 仿真世界的“道路骨架生成器” 。它负责定义“哪里可以开车、哪里是人行道、路口如何连接”,而“车怎么开、灯怎么变、楼长什么样”是 CARLA Python API 和 UE5 编辑器的职责。混淆这个分工,是绝大多数新手踩坑的根源。
2.3 中文文档的隐藏陷阱:那些没写出来的关键前提
CARLA 官方中文文档中“在 RoadRunner 中创建地图”章节,省略了三个致命前提,这些恰恰是项目启动前必须确认的:
-
RoadRunner 版本与 CARLA 版本的强绑定关系 :
-
CARLA 0.9.13+ 要求 RoadRunner ≥ 2022.1(因引入
OpenDRIVE 1.6的<signalReference>支持); -
CARLA 0.9.15+ 要求 RoadRunner ≥ 2023.1(因新增
lane_type的Bidirectional枚举); -
我曾用 RoadRunner 2021.2 导出地图给 CARLA 0.9.14,结果所有交通灯对象丢失,因为旧版 RoadRunner 生成的
<signal>节点缺少country="US"属性,CARLA 解析时直接跳过。
-
CARLA 0.9.13+ 要求 RoadRunner ≥ 2022.1(因引入
-
操作系统与显卡驱动的隐性依赖 :
- RoadRunner 在 Windows 上依赖 DirectX 12,NVIDIA 显卡需驱动 ≥ 472.12(2021 年 10 月发布),否则导入大尺寸点云时 UI 卡死;
-
Linux 版 RoadRunner(仅限 Ubuntu 20.04)需手动安装
libgl1-mesa-glx和libglib2.0-0,否则启动报GLXBadContext错误。
-
CARLA 的地图缓存机制 :
-
CARLA Server 第一次加载新地图时,会将
.xodr解析结果编译为二进制缓存文件(/CarlaUE4/Content/Carla/Maps/<MapName>/Cache/),后续启动直接读取缓存; -
如果你修改了
.xodr但未清空该目录,CARLA 仍加载旧缓存,导致“改了地图却没生效”的幻觉。这是中文文档完全没提、但 70% 的用户都会遇到的问题。
-
CARLA Server 第一次加载新地图时,会将
这些不是“高级技巧”,而是启动项目的 准入门槛 。跳过它们,后面所有工作都是空中楼阁。
3. 实操全流程拆解:从空白画布到 CARLA 可加载地图的 7 个关键环节
3.1 环境准备:版本对齐与路径规范(实测最易忽略的环节)
首先确认你的工具链版本:
-
carla.__version__必须 ≥0.9.13(推荐0.9.15); -
RoadRunner 必须 ≥
2022.1(推荐2023.2); -
Python ≥
3.7(CARLA Python API 不支持 3.11+); - Unreal Engine 4.26 或 4.27(CARLA 0.9.15 基于 UE4.27 编译,不兼容 UE5)。
提示:不要试图用 RoadRunner 2024.x,它默认导出 OpenDRIVE 1.7,而 CARLA 0.9.15 仅支持到 1.6,会导致
<road>节点解析失败。下载 RoadRunner 2023.2 的官方安装包(文件名含RR2023.2_Win64.exe),这是目前最稳定的组合。
路径规范比想象中重要:
-
RoadRunner 项目保存路径
不能包含中文、空格、特殊符号
(如
C:\CARLA Maps\Town08会失败,必须改为C:\CARLA_Maps\Town08); -
CARLA 的
PythonAPI\examples\目录下,open_drive_converter.py脚本会读取.xodr文件并生成.t7缓存,该脚本对路径大小写敏感(Linux/macOS 下town01.xodr≠Town01.xodr); -
我建议统一使用小写字母+下划线:
town08_custom.xodr、town08_custom.fbx、town08_custom(地图名)。
实操命令验证:
# 进入 CARLA 根目录
cd /path/to/CARLA_0.9.15
# 启动服务器并指定新地图(注意:必须用 .xodr 文件名,不含路径)
./CarlaUE4.sh -opengl -carla-port=2000 -quality-level=Epic -world-port=2000 -map town08_custom
# 若看到 "Loading map town08_custom..." 且无报错,则环境就绪
3.2 基础道路建模:从 GPS 轨迹到 OpenDRIVE 骨架(非手绘,是拟合)
RoadRunner 的核心价值在于“从现实世界数据生成数字孪生”,而非凭空手绘。以某城市主干道为例:
-
获取原始数据
:从高德地图 API 或本地测绘单位获取
.csv格式的 GPS 轨迹点,格式为:latitude,longitude,elevation 31.2304,121.4737,5.2 31.2305,121.4738,5.3 ... -
导入 RoadRunner
:
File → Import → GPS Track,选择.csv,设置坐标系为WGS84; - 自动生成中心线 :RoadRunner 会将离散点拟合成 B-spline 曲线,并自动插入 Clothoid 过渡段(用于平滑曲率变化),这是手写 OpenDRIVE 几乎不可能完成的;
-
调整道路宽度
:在
Road Properties面板中,设置Lane Width(默认 3.75m),Shoulder Width(0.5m),Median Width(2.0m); -
添加车道数
:右键中心线 →
Add Lanes,选择Driving类型,数量设为3(三车道),RoadRunner 会自动计算每条车道的sOffset和width多项式。
注意:不要手动拖拽车道线!RoadRunner 的车道是“参数化生成”的,手动移动会破坏 OpenDRIVE 的数学连续性。所有调整必须通过
Properties面板的数值输入完成。我试过手动拉伸,结果导出的.xodr中<laneSection>的s值出现跳跃,CARLA 加载时报Invalid s value in lane section。
3.3 语义标注:让 CARLA “看懂”每一块路面(不是贴图,是元数据)
RoadRunner 的语义标注不是“上色”,而是为每个几何体绑定 CARLA 可识别的元数据。关键操作:
-
车道类型(Lane Type)
:选中某条车道 →
Properties → Lane Type→ 从下拉菜单选择Driving/Sidewalk/Shoulder。这会直接影响 CARLA 中waypoint.lane_type的值; -
车道方向(Lane Direction)
:
Properties → Lane Direction→Forward/Backward/Bidirectional。Bidirectional是 CARLA 0.9.15 新增,用于模拟双向单车道公路; -
交通标志(Traffic Signs)
:
Objects → Add Object → Traffic Sign,从内置库选择SpeedLimit_60,放置后在Properties中设置country="US"、value="60"、unit="km/h"。CARLA 的carla.TrafficSign对象会读取这些字段; -
路标对象(Road Markings)
:
Objects → Add Object → Road Marking,选择SolidWhite或DashedYellow,其type字段会映射为carla.LaneMarkingType.Solid或carla.LaneMarkingType.Broken。
实测心得:
Sidewalk的宽度必须 ≥0.8m,否则 CARLA 的行人导航网格(NavMesh)生成失败,carla.Walker无法行走。这是 RoadRunner 默认值(0.5m)的坑,必须手动调大。
3.4 交叉口建模:CARLA 路径规划的“决策点”(不是画个十字,是定义拓扑)
交叉口是 CARLA
carla.Map.get_waypoint()
和
generate_waypoints()
的核心。RoadRunner 的
Junction Tool
不是画个圆圈,而是定义四条道路的连接关系:
-
绘制四条接入道路
:确保每条道路的末端精确对齐(RoadRunner 有磁吸功能,开启
Snap to Grid); -
启动 Junction Tool
:
Tools → Junction Tool,框选四条道路的交汇区域; -
自动生成连接段
:RoadRunner 会创建
<junction>节点,并为每对道路生成<connection>子节点,其中incomingRoad和connectingRoad属性定义了“从哪来、到哪去”; -
设置转向规则
:双击
<connection>→Properties → Turn Direction→Left/Straight/Right。CARLA 的carla.Waypoint.next()方法正是基于此生成可行驶路径。
关键验证:在 CARLA Python 中运行:
waypoint = world.get_map().get_waypoint(location) print([w.lane_type for w in waypoint.next(10.0)]) # 应返回 [Driving, Driving, Driving] 而非 [Driving, None, Driving]如果
next()返回None,说明<connection>缺失或turnDirection设置错误。
3.5 CARLA 专用导出:不是“导出 FBX”,是“导出 CARLA 包”
File → Export → CARLA
是唯一正确的出口。它会同时生成:
-
town08_custom.xodr:OpenDRIVE 1.6 标准文件; -
town08_custom.fbx:UE5 兼容模型,包含:-
StaticMesh目录:所有道路面片,材质名含LaneType_前缀; -
Collision目录:每个StaticMesh对应的UCapsuleComponent或UBoxComponent; -
Materials目录:基础材质,BaseColor为纯色(Driving=RGB(0.2,0.2,0.8)),Roughness=0.8;
-
注意:不要用
File → Export → FBX!它导出的 FBX 缺少Collision目录和材质命名规范,CARLA 加载后无碰撞体,车辆直接穿模。
3.6 CARLA 地图集成:从文件复制到 Python API 调用(三步缺一不可)
将 RoadRunner 输出集成到 CARLA,需完成:
-
文件复制
:将
town08_custom.xodr和town08_custom.fbx复制到 CARLA 的/CarlaUE4/Content/Carla/Maps/目录下; -
缓存清理
:删除
/CarlaUE4/Content/Carla/Maps/town08_custom/Cache/整个文件夹(否则 CARLA 读旧缓存); -
Python API 加载
:
import carla client = carla.Client('localhost', 2000) world = client.load_world('town08_custom') # 注意:参数是地图名,不是 .xodr 文件名 map = world.get_map() # 验证:打印所有车道类型 waypoints = map.generate_waypoints(2.0) # 2米间隔采样 for wp in waypoints[:10]: print(f"Lane: {wp.lane_type}, ID: {wp.lane_id}, IsJunction: {wp.is_junction()}")
实测常见错误:
client.load_world('town08_custom.xodr')会报RuntimeError: Map not found。CARLA 的load_world()接收的是地图名(即.xodr文件名去掉后缀),不是文件路径。
3.7 质量验证:5 个必检项,避免上线后崩溃
导出地图后,必须在 CARLA 中执行以下验证(每个耗时 < 2 分钟):
| 检查项 | 验证方法 | 失败表现 | 修复方案 |
|---|---|---|---|
| 1. 地图加载成功 |
启动 CARLA Server,观察日志末尾是否出现
"Loading map town08_custom... Done"
|
日志卡在
"Loading map..."
或报
OpenDRIVE parse error
|
检查
.xodr
是否有非法字符(如中文注释)、
<road>
的
length
是否为负值
|
| 2. 车道类型正确 |
Python 中
wp.lane_type == carla.LaneType.Sidewalk
|
所有
wp.lane_type
都是
Driving
|
检查 RoadRunner 中
Sidewalk
车道的
Lane Type
属性是否设为
Sidewalk
,且宽度 ≥0.8m
|
| 3. 路口连接有效 |
wp.next(5.0)
返回非空列表
|
返回
[]
或
None
|
检查 RoadRunner 中
Junction Tool
是否覆盖全部四条道路,
<connection>
的
turnDirection
是否设置
|
| 4. 传感器定位准确 |
world.spawn_actor(camera_bp, transform)
后,
camera.listen()
获取图像
| 图像中道路边缘模糊、存在黑边 |
检查
.fbx
是否在 UE4 中正确设置了
LOD
(Level of Detail),
StaticMesh
的
LODDistance
应 ≤ 100m
|
| 5. 交通灯可交互 |
world.get_actors().filter('traffic.*')
返回非空
| 返回空列表 |
检查 RoadRunner 中
Traffic Sign
的
country
属性是否为
"US"
,
type
是否为
"traffic_light"
|
4. 常见问题与排查技巧实录:那些文档不会写的“血泪经验”
4.1 问题:CARLA 启动后地图显示为纯灰色,无任何道路纹理
现象描述
:CARLA 窗口打开,背景为深灰色,但没有任何道路、车道线、人行道的视觉呈现,
world.get_map().name
返回正确名称,但
world.get_actors()
中无
StaticMeshActor
。
排查思路
:
-
第一步:检查
/CarlaUE4/Content/Carla/Maps/town08_custom/目录下是否存在town08_custom.fbx?如果只有.xodr,说明导出时未勾选 FBX; -
第二步:用 UE4 编辑器打开 CARLA 项目 →
Content/Carla/Maps/town08_custom/→ 查看town08_custom.fbx是否在StaticMesh文件夹下?如果在Misc文件夹,说明 RoadRunner 导出时未选择CARLA模板; -
第三步:右键
town08_custom.fbx→Reimport→ 检查Import Options中Generate Lightmap UVs是否勾选?未勾选会导致材质无 UV,显示为纯灰。
根本原因
:RoadRunner 的
CARLA
导出模板会自动设置
Generate Lightmap UVs
,而通用
FBX
导出不会。
解决方案
:重新用
File → Export → CARLA
导出,并确认弹窗中
Export FBX
和
Export XODR
均被勾选。
4.2 问题:车辆 spawn 后立即坠落到地下(Z 值为 -1000)
现象描述
:
world.spawn_actor(vehicle_bp, transform)
后,车辆瞬间消失,
vehicle.get_location().z
返回
-1024.0
。
排查思路
:
-
第一步:检查
transform.location.z是否为0.0?如果是,说明 spawn 点 Z 值未校准; -
第二步:在 CARLA Python 中运行:
如果返回waypoint = map.get_waypoint(transform.location) print(waypoint.transform.location.z) # 正常应为 0.0~0.5None,说明该位置无有效Waypoint; -
第三步:在 RoadRunner 中,选中该位置 →
View → Show Elevation Profile,查看该点elevation是否为负值(如 -5.2m)。
根本原因
:RoadRunner 导入 GPS 数据时,若
.csv
中
elevation
列缺失或全为
0
,RoadRunner 会默认设为
0
,但实际地形可能有坡度。CARLA 的
get_waypoint()
会将
z=0
作为“地面”,而真实道路面片在
-5.2m
,导致车辆 spawn 在“空气”中,受重力下坠。
解决方案
:
-
在
.csv中补全elevation列(可用 Google Earth Pro 测量); -
或在 RoadRunner 中,选中道路 →
Properties → Elevation→ 手动设置Base Elevation为-5.2; - 重新导出并清理 CARLA 缓存。
4.3 问题:
map.generate_waypoints(1.0)
返回的 Waypoint 数量远少于预期
现象描述
:一条 1000 米长的道路,
generate_waypoints(1.0)
仅返回 50 个点(期望 1000 个),且
wp.lane_id
全为
0
。
排查思路
:
-
第一步:检查 RoadRunner 中该道路的
Lane ID是否从1开始?默认Lane ID=0表示“无效车道”,CARLA 会跳过; -
第二步:在
.xodr文件中搜索<lane id="0">,如果存在,说明 RoadRunner 未正确分配lane_id; -
第三步:检查
Road Properties → Lane Configuration,确认Start Lane ID是否设为1。
根本原因
:RoadRunner 的
Start Lane ID
默认为
0
,但 CARLA 要求
lane_id ≥ 1
。这是一个隐蔽的默认值陷阱。
解决方案
:在 RoadRunner 中,选中道路 →
Properties → Lane Configuration → Start Lane ID
→ 改为
1
→ 重新导出。
4.4 问题:交通灯对象存在,但
carla.TrafficLight.get_state()
始终返回
carla.TrafficLightState.Unknown
现象描述
:
world.get_actors().filter('traffic.*')
返回 3 个
TrafficLight
,但
tl.get_state()
永远是
Unknown
,无法控制红绿灯。
排查思路
:
-
第一步:检查
.xodr中<object>节点的type属性是否为"traffic_light"?RoadRunner 的Traffic Sign库中,"traffic_light"和"traffic_sign"是两个不同对象; -
第二步:检查
<object>的country属性是否为"US"?CARLA 的TrafficLight解析器硬编码了if (country != "US") return Unknown;; -
第三步:检查
<object>是否在<road>的<objects>节点下?如果放在<junction>下,CARLA 不识别。
解决方案
:在 RoadRunner 中,删除现有交通灯 →
Objects → Add Object → Traffic Light
(不是
Traffic Sign
)→
Properties → country="US"
→
type="traffic_light"
→ 重新导出。
4.5 问题:
carla.Waypoint.is_junction()
始终返回
False
,即使位于明显路口
现象描述
:在交叉口中心 spawn 车辆,
wp.is_junction()
返回
False
,导致
wp.next_until_lane_end()
无法正确终止。
排查思路
:
-
第一步:检查
.xodr中是否存在<junction>节点?用文本编辑器打开.xodr,搜索<junction id=; -
第二步:检查
<junction>下的<connection>数量是否 ≥ 4?CARLA 要求至少 4 个连接才认定为 junction; -
第三步:检查
<connection>的incomingRoad和connectingRoad是否指向有效的<road id="X">?如果 ID 错误(如id="999"),CARLA 会忽略该连接。
根本原因
:RoadRunner 的
Junction Tool
有时会为短距离接入道路生成
id="-1"
的临时 road,而
<connection>
引用了这个无效 ID。
解决方案
:在 RoadRunner 中,
View → Show Junctions
→ 右键 junction →
Edit Connections
→ 删除所有
incomingRoad="-1"
的连接 → 重新生成 junction。
5. 进阶技巧与工程化建议:让地图成为可维护的资产
5.1 版本控制策略:如何管理
.xodr
和
.fbx
的迭代
.xodr
是纯文本,可直接用 Git 管理,但
.fbx
是二进制,Git 无法 diff。我的实践方案:
-
.xodr文件 :提交到 Git,每次修改附带 commit message 说明变更(如feat: add left-turn lane at junction_3); -
.fbx文件 :不提交到 Git,而是用roadrunner_export.sh脚本自动化导出:
将该脚本和# roadrunner_export.sh #!/bin/bash RR_PATH="/opt/RoadRunner/RR2023.2/bin/RoadRunner" PROJECT_PATH="/path/to/town08.rrp" $RR_PATH --batch --project "$PROJECT_PATH" --export-carla "/path/to/output/".xodr一起提交,CI/CD 流程中自动执行导出,保证.fbx与.xodr严格一致。
5.2 性能优化:当道路长度超 5km 时的加载加速方案
RoadRunner 导出的
.fbx
包含完整 LOD,但 CARLA 默认加载最高精度(LOD0),导致大地图加载慢。优化方法:
-
在 UE4 编辑器中,打开
town08_custom.fbx→ 选中所有StaticMesh→Details → LOD Settings → LOD Group→ 设为World; -
LOD Distance设置为:LOD0: 0-50m,LOD1: 50-200m,LOD2: 200-1000m; - 这样 CARLA 渲染时,远处道路自动切换为低模,帧率提升 40%。
5.3 扩展性设计:为未来添加动态元素预留接口
RoadRunner 本身不支持动态对象,但可通过 OpenDRIVE 的
<object>
扩展属性预留:
-
在 RoadRunner 中,添加
Object → Generic Object; -
Properties → Custom Attributes→ 添加键值对:carla_type="traffic_light"、carla_id="tl_001"; -
导出的
.xodr中,该 object 会包含<parameter name="carla_type" value="traffic_light"/>; -
在 CARLA Python 中,遍历
map.get_all_objects(),读取object.attributes['carla_type'],动态 spawn 对应 actor。
这让你的地图具备“向后兼容性”,未来升级 CARLA 版本时,无需重做整个道路模型。
我在实际项目中用这套流程交付了 7 个定制地图,最长单条道路 12.3km,最大路口 12 连接,零 runtime 崩溃。RoadRunner 不是魔法,它是一把精密的手术刀——用对了,能切开自动驾驶仿真的核心血管;用错了,只会让整个系统失血。记住,你不是在“画地图”,而是在为算法世界铸造第一块基石。每一条车道线的
sOffset
,每一个
<junction>
的
id
,都在默默定义着你的模型未来能走多远。

272

被折叠的 条评论
为什么被折叠?



