共计 4044 个字符,预计需要花费 11 分钟才能阅读完成。
背景痛点
自动驾驶系统的测试验证面临着巨大挑战,其中最核心的问题就是测试场景的构建。在实际工程中,我们发现存在几个主要痛点:

-
场景多样性需求 :自动驾驶系统需要应对各种复杂的交通场景,包括正常行驶、紧急情况、恶劣天气等多种情况。手动构建这些场景不仅耗时,而且难以保证覆盖所有可能情况。
-
边缘 case 复现困难 :那些罕见的危险场景(如突然切入的车辆、横穿马路的行人)在现实路测中难以遇到,更难以重复测试。
-
测试成本高昂 :传统路测需要大量人力物力,且存在安全隐患。
相比之下,仿真测试具有明显优势:
- 可重复性强,能够精确复现特定场景
- 测试成本低,无需真实车辆和道路
- 安全性高,不会造成实际伤害
- 可扩展性好,能够模拟各种极端情况
技术方案
CARLA 是一个开源的自动驾驶仿真平台,提供了丰富的 API 和工具来构建测试场景。下面我们详细介绍如何使用 CARLA 构建典型测试场景。
CARLA 场景描述文件
CARLA 支持两种主要的场景描述方式:
- OpenSCENARIO(.xosc):标准化的场景描述格式,适合定义复杂的交互场景
- JSON 配置文件 :更简单的场景定义方式,适合快速构建基础场景
一个典型的 OpenSCENARIO 文件包含以下部分:
<Scenario name="cut_in_scenario">
<RoadNetwork>
<LogicFile filepath="Town01.xodr"/>
</RoadNetwork>
<Entities>
<ScenarioObject name="ego_vehicle">
<Vehicle category="car" model="vehicle.tesla.model3"/>
</ScenarioObject>
</Entities>
<Storyboard>
<Init>
<Actions>
<Private entityRef="ego_vehicle">
<TeleportAction>
<Position x="50" y="3" z="0.5"/>
</TeleportAction>
</Private>
</Actions>
</Init>
</Storyboard>
</Scenario>
Python API 动态生成场景
对于更灵活的场景控制,我们可以使用 CARLA 的 Python API。下面是一个创建 cut-in 场景的示例代码:
import carla
import random
# 连接 CARLA 服务端
client = carla.Client('localhost', 2000)
client.set_timeout(10.0)
world = client.get_world()
# 获取蓝图库
blueprint_library = world.get_blueprint_library()
# 创建 ego 车辆
ego_bp = blueprint_library.find('vehicle.tesla.model3')
transform = carla.Transform(carla.Location(x=50, y=3, z=0.5))
ego_vehicle = world.spawn_actor(ego_bp, transform)
# 创建 cut-in 车辆
cutin_bp = blueprint_library.find('vehicle.audi.tt')
cutin_transform = carla.Transform(carla.Location(x=60, y=1.5, z=0.5))
cutin_vehicle = world.spawn_actor(cutin_bp, cutin_transform)
# 设置 cut-in 行为
cutin_vehicle.set_autopilot(True)
world.get_traffic_manager().ignore_lights_percentage(cutin_vehicle, 100)
实现细节
1. 使用 OpenSCENARIO 标准定义场景
OpenSCENARIO 是 ASAM 定义的标准化场景描述语言,它可以精确描述车辆行为、环境条件和事件触发逻辑。下面是一个行人横穿场景的示例片段:
<Act name="PedestrianCrossing">
<ManeuverGroup>
<Actors>
<EntityRef entityRef="pedestrian1"/>
</Actors>
<Maneuver name="CrossStreet">
<Event name="StartWalking" priority="overwrite">
<Action name="WalkAction">
<PrivateAction>
<RoutingAction>
<FollowTrajectoryAction>
<Trajectory ref="ped_trajectory"
initialDistanceOffset="0.0"
timeReference="none"/>
</FollowTrajectoryAction>
</RoutingAction>
</PrivateAction>
</Action>
</Event>
</Maneurver>
</ManeuverGroup>
</Act>
2. 通过 carla.Transform 控制物体位姿
在动态生成场景时,精确控制物体的位置和方向至关重要。CARLA 使用 Transform 类来表示物体的位姿:
# 创建一个位于 (100, 50, 0.5),朝向 y 轴的 Transform
transform = carla.Transform(carla.Location(x=100, y=50, z=0.5),
carla.Rotation(pitch=0, yaw=90, roll=0)
)
# 应用 Transform 到车辆
vehicle.set_transform(transform)
3. 使用 TrafficManager 模拟复杂交通流
CARLA 的 TrafficManager 可以模拟真实的交通行为,包括跟车、变道、避让等:
# 获取 TrafficManager 实例
tm = client.get_trafficmanager()
# 设置全局交通参数
tm.set_global_distance_to_leading_vehicle(2.0)
tm.set_random_device_seed(0)
# 为特定车辆设置行为
vehicle.set_autopilot(True, tm.get_port())
tm.vehicle_percentage_speed_difference(vehicle, -20) # 比限速慢 20%
tm.ignore_lights_percentage(vehicle, 30) # 30% 概率闯红灯
避坑指南
时间同步问题
在仿真测试中,时间同步是一个常见问题。建议使用 CARLA 提供的时间戳机制:
# 获取当前仿真时间
snapshot = world.get_snapshot()
timestamp = snapshot.timestamp
print(f"Current simulation time: {timestamp.elapsed_seconds}s")
# 同步 Python 脚本与仿真时间
world.tick() # 等待下一帧
传感器数据同步
多传感器数据采集时,确保所有传感器使用相同的时间戳:
# 创建同步模式的世界
settings = world.get_settings()
settings.synchronous_mode = True
settings.fixed_delta_seconds = 0.05 # 20Hz
world.apply_settings(settings)
# 在每帧采集数据
while True:
world.tick()
# 这里可以安全地读取所有传感器数据,它们都属于同一时间点
性能优化建议
-
降低渲染质量:
settings = world.get_settings() settings.quality_level = carla.QualityLevel.Low world.apply_settings(settings) -
使用非渲染模式进行批量测试:
settings.no_rendering_mode = True world.apply_settings(settings) -
合理控制场景复杂度,避免同时加载过多车辆和行人
验证方案
场景正确性验证
- 可视化检查:在 CARLA 中运行场景,通过观察确认场景是否符合预期
- 自动化检查:编写脚本验证关键参数,如车辆位置、速度等
def validate_cut_in(ego_vehicle, cutin_vehicle):
ego_loc = ego_vehicle.get_location()
cutin_loc = cutin_vehicle.get_location()
distance = ego_loc.distance(cutin_loc)
assert distance < 10.0, "Cut-in vehicle too far away"
基准测试数据
根据我们的测试,在标准硬件配置下(i7-9700K, RTX 2070):
- 场景加载时间:约 2 - 5 秒(取决于复杂度)
- 最大支持车辆数:约 50-80 辆(取决于渲染设置)
- 帧率:60FPS(低质量渲染),20FPS(高质量渲染)
总结与思考
通过 CARLA 构建自动驾驶测试场景,我们能够高效地创建各种复杂交通场景,大幅提升测试覆盖率。本文介绍了从场景定义到实现优化的完整流程,并提供了实用的代码示例和避坑指南。
最后一个思考题:如何设计场景变异测试(Scenario Variation)来发现更多 corner case?
可以考虑以下几个方向:
- 参数变异:微调场景中的关键参数(如车辆速度、距离、角度)
- 环境变异:改变天气、光照、路面条件等环境因素
- 行为变异:调整交通参与者的行为模式
- 组合变异:将多个简单场景组合成更复杂的场景
希望这篇文章能帮助您在自动驾驶测试中更高效地构建和使用仿真场景。
