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是交通流专家。组合使用,才是工程正道。