2、仿真平台选型:主流仿真平台(CARLA、LGSVL、AirSim、SUMO)对比与选型策略
做自动驾驶仿真,选平台是第一道坎。
我记得刚入行那会儿,团队里为了用哪个仿真器吵了整整两周。有人坚持CARLA开源生态好,有人觉得LGSVL跟Unity结合更顺手。最后项目deadline快到了,我们才匆忙定下来。结果呢?跑了三个月发现场景编辑器根本满足不了需求,又得换。
所以这一章,我想跟你聊聊四个主流平台——CARLA、LGSVL、AirSim、SUMO。我会从实际工程角度,告诉你每个平台的脾气秉性,以及什么场景下该选谁。
2.1 CARLA:传感器仿真的「万金油」
CARLA是目前社区最活跃的开源仿真器之一。我个人习惯把它当作传感器仿真的首选。
为什么?因为它对传感器的支持最全面。摄像头、激光雷达、毫米波雷达、GPS/IMU,基本你能想到的传感器类型,它都有现成的模型。
核心优势:
- 传感器模型参数可调(视场角、分辨率、噪声模型等)
- 支持自定义传感器蓝图,可以写Python脚本扩展
- 内置多种天气和光照条件,适合做鲁棒性测试
举个例子,你想模拟一个带噪声的激光雷达点云。在CARLA里,你可以这样配置:
# 配置一个64线激光雷达,带高斯噪声
blueprint = world.get_blueprint_library().find('sensor.lidar.ray_cast')
blueprint.set_attribute('channels', '64')
blueprint.set_attribute('range', '100')
blueprint.set_attribute('rotation_frequency', '10')
blueprint.set_attribute('points_per_second', '1300000')
# 添加噪声模型
blueprint.set_attribute('noise_stddev', '0.02') # 2cm标准差
嗯,这里要注意。CARLA的激光雷达噪声模型其实比较粗糙。我在项目中遇到过一个问题——真实激光雷达的噪声是距离相关的,远点噪声大,近点噪声小。但CARLA默认是均匀噪声。所以如果你做的是远距离感知算法验证,建议自己写个后处理脚本修正一下。
避坑指南:
我曾经在CARLA里跑了一周的感知算法,结果换到实车上一塌糊涂。后来发现是CARLA的相机曝光模型太理想化了。真实相机的自动曝光、卷帘快门效应,CARLA都没模拟。所以做相机仿真时,记得加上自己的后处理。
2.2 LGSVL:Unity加持下的高保真渲染
LGSVL是LG旗下的一款仿真器,后来被Aptiv收购了。它最大的特点是基于Unity引擎,渲染效果非常棒。
说实话,如果你主要做视觉感知,LGSVL的渲染质量比CARLA好一个档次。它的光照模型、材质反射、阴影细节都更接近真实。
| 对比项 | CARLA | LGSVL |
|---|---|---|
| 渲染引擎 | Unreal Engine 4 | Unity |
| 传感器保真度 | 中等(可扩展) | 较高(尤其视觉) |
| 场景编辑器 | Python API + RoadRunner | Unity Editor(上手难) |
| 社区活跃度 | 高 | 中等(更新较慢) |
但LGSVL有个致命问题——它跟Apollo绑定太深了。你想想看,如果你用的是其他自动驾驶栈,比如Autoware或者自己写的,那LGSVL的很多接口就得自己重新适配。
我个人的建议是:如果你团队用Apollo,LGSVL是首选。否则,别给自己找麻烦。
2.3 AirSim:微软出品,无人机出身
AirSim是微软开源的项目,最初是为无人机设计的。后来才扩展到自动驾驶。
它的传感器仿真有个特点——非常「学术派」。每个传感器模型都有详细的物理参数,比如相机的光圈、快门速度、ISO,激光雷达的波束发散角等等。
适合场景:
- 需要高精度传感器模型的学术研究
- 无人机或低空飞行器仿真
- 多传感器融合算法的底层验证
但说实话,AirSim在自动驾驶场景上有点「水土不服」。它的地图规模有限,交通流模拟基本靠手动。你想跑个复杂的城市交通场景?嗯,AirSim会让你很痛苦。
我记得有一次,我想在AirSim里模拟一个十字路口多车交互的场景。结果发现它连基本的交通灯控制都要自己写脚本。折腾了两天,最后还是换回了CARLA。
注意事项:
AirSim的维护状态不太乐观。微软在2022年后基本停止了主要更新。如果你现在开始一个新项目,我不建议选AirSim。除非你只是做短期学术实验。
2.4 SUMO:交通流仿真的「老大哥」
SUMO跟上面三个不一样。它不做传感器仿真,它只做交通流仿真。
说白了,SUMO就是模拟车怎么在路上跑、怎么变道、怎么等红灯。它不关心你的摄像头拍到了什么,只关心车辆的位置、速度、轨迹。
那为什么我要把它放在传感器仿真配置里?
因为在实际工程中,你往往需要把SUMO和CARLA或LGSVL结合起来用。SUMO负责生成交通流,CARLA负责渲染传感器数据。这叫「协同仿真」。
# 通过SUMO生成交通流,传给CARLA
import traci
import carla
# 启动SUMO仿真
sumo_cmd = ["sumo-gui", "-c", "my_scenario.sumocfg"]
traci.start(sumo_cmd)
# 在CARLA中同步车辆位置
while True:
traci.simulationStep()
for vehicle_id in traci.vehicle.getIDList():
x, y = traci.vehicle.getPosition(vehicle_id)
# 将SUMO坐标映射到CARLA坐标
carla_location = carla.Location(x=x, y=y, z=0.5)
# 更新CARLA中的车辆
carla_vehicle.set_transform(carla.Transform(carla_location))
这个模式我在多个量产项目中都用过。SUMO处理宏观交通流,CARLA处理微观传感器数据。各司其职,效率很高。
个人经验:
我曾经踩过一个坑——SUMO和CARLA的时间步长不一致。SUMO默认是1秒一步,CARLA是0.05秒。结果车辆位置更新不同步,点云都飘了。解决办法是让SUMO也跑0.05秒步长,或者用CARLA的同步模式。
2.5 选型策略:到底该选哪个?
好了,四个平台都聊完了。你可能会问:「那我到底该选哪个?」
我的建议是——别只选一个。实际工程中,往往是组合使用。
| 你的需求 | 推荐组合 | 理由 |
|---|---|---|
| 量产级感知算法验证 | CARLA + SUMO | 场景丰富,交通流真实,传感器可扩展 |
| 视觉感知为主 | LGSVL + SUMO | 渲染质量高,适合相机算法 |
| 学术研究/论文验证 | CARLA 或 AirSim | 开源可控,参数透明 |
| 多车协同/车路协同 | SUMO + CARLA | SUMO擅长大规模交通流,CARLA做局部细节 |
最后说一句。选平台不是一锤子买卖。我见过太多团队,花三个月搭好仿真环境,结果发现平台不支持某个传感器,又得重来。
所以我的习惯是——先想清楚你要验证什么算法,需要哪些传感器,再反推平台。别被平台的「酷炫功能」带偏了。
总结一句话:
传感器仿真平台没有「最好」,只有「最合适」。CARLA是万金油,LGSVL是视觉利器,AirSim是学术玩具,SUMO是交通流专家。组合使用,才是工程正道。