4、仿真环境搭建:安装配置主流仿真器、场景创建、天气与光照条件设置、动态物体与交通流模拟

仿真环境是数据流水线的“数据源头工厂”。在真实世界中采集数据成本高、场景覆盖难、极端天气不可控,而仿真器能够以可重复、可编排、低成本的方式生成海量带标注的传感器数据。本章聚焦于仿真环境搭建的四个核心环节:仿真器选型与安装、场景构建、天气与光照系统、动态物体与交通流模拟。我们将以CARLA和SUMO为例,讲解从零搭建一套可用于数据采集的仿真流水线,并深入讨论参数配置、脚本化控制与数据导出的工程实践。

仿真数据采集与标注流水线——环境搭建核心链路 仿真器核心 CARLA / SUMO / AirSim 场景创建 地图/道路/建筑/车道 天气与光照 雨/雾/雪/昼夜/阴影 动态物体与交通流 车辆/行人/信号灯/流量 数据输出流 RGB图像 / 深度图 / 语义分割 / LiDAR点云 / 毫米波雷达 / 3D Bounding Box 下游应用 模型训练 / 感知算法验证 / 仿真测试 / 标注数据集生成 关键配置参数 • 渲染分辨率/帧率 • 传感器内参/外参 • 天气参数(雨量/雾浓度) • 交通流密度/速度分布 • 随机种子/场景变体 标注同步机制 仿真器内部状态 → 传感器数据 → 自动标注(Bounding Box / 语义标签 / 轨迹ID)→ 数据存储(HDF5/JSON)

上图展示了仿真环境搭建的整体链路。仿真器作为核心,向下驱动场景、天气、动态物体三个子模块,向上输出多模态传感器数据,并同步生成标注信息。在实际工程中,我们需要通过Python API或ROS接口将这四个模块串联起来,形成可配置、可复现的数据生成流水线。

4.1 仿真器选型与安装配置

核心原理:主流开源仿真器各有侧重。CARLA(Car Learning to Act)基于Unreal Engine 4,提供高保真度的传感器渲染和丰富的场景编辑能力,适合视觉感知数据采集;SUMO(Simulation of Urban MObility)专注于微观交通流仿真,擅长大规模路网和车辆行为建模,但不提供传感器渲染;AirSim基于Unreal Engine,支持无人机和汽车,但生态相对封闭。在数据流水线中,通常采用CARLA+SUMO协同方案:CARLA负责传感器数据生成,SUMO负责交通流逻辑,通过Co-Simulation桥接。

安装配置流程:

  1. 环境准备:Ubuntu 20.04/22.04,NVIDIA GPU(建议RTX 3060以上),CUDA 11.6+,Python 3.8+。
  2. CARLA安装:下载CARLA 0.9.15压缩包(约20GB),解压后运行./CarlaUE4.sh启动服务端。客户端通过pip安装carla库。
  3. SUMO安装:sudo apt install sumo sumo-tools,或从源码编译以获取最新功能。
  4. 协同配置:安装carla-sumo桥接包,配置路网文件映射和端口通信(默认端口2000)。
关键配置示例(CARLA启动参数):
# 启动CARLA服务端(带地图和渲染)
./CarlaUE4.sh -quality-level=Epic -carla-rpc-port=2000 -carla-streaming-port=3000

# 启动SUMO协同仿真
python3 run_synchronization.py -c carla_sumo_config.json

案例拆解:某自动驾驶公司需要生成夜间雨天场景下的行人横穿马路数据。初始方案仅使用CARLA内置交通流,但发现车辆行为过于随机,无法模拟真实交通流中的跟车和变道逻辑。引入SUMO后,通过定义路网文件(.net.xml)和交通需求(.rou.xml),精确控制车辆出发时间、速度和路径,再通过桥接同步到CARLA中渲染。最终数据集的场景覆盖率提升了40%,且每个场景可精确复现。

常见误区:不要盲目追求高画质。Epic画质虽然渲染效果好,但会显著降低帧率,影响数据采集效率。建议根据传感器需求平衡画质与性能,例如仅使用语义分割时,Low画质即可满足需求。

4.2 场景创建:从地图到车道级细节

核心原理:场景创建是仿真数据质量的基础。CARLA提供多种内置地图(Town01-Town10),涵盖城市、乡村、高速等典型路况。但内置地图无法覆盖所有业务场景,需要自定义场景。场景创建包含三个层次:路网拓扑(Road Network)、静态物体(Static Objects)、语义标注(Semantic Annotation)。路网拓扑决定车辆可行驶区域,静态物体包括建筑、树木、交通标志,语义标注为每个物体赋予类别标签,用于后续数据标注。

场景创建操作流程:

  • 地图选择与修改:使用RoadRunner(MATLAB工具)编辑路网,导出为OpenDRIVE格式(.xodr),再导入CARLA生成可加载地图。
  • 静态物体放置:通过CARLA Python API的world.object_actor批量放置建筑、路灯、植被等,支持从Unreal Engine资产库导入自定义模型。
  • 车道线/交通标志配置:在OpenDRIVE中定义车道数量、宽度、限速,CARLA会自动生成对应的车道线和标志。
  • 场景变体生成:编写脚本随机扰动物体位置、数量、类型,生成多个场景变体,增加数据多样性。
场景元素配置方式数据影响推荐参数
道路类型OpenDRIVE路网影响车辆动力学和传感器视野城市双向4车道+非机动车道
建筑密度API批量放置影响GPS信号遮挡和视觉特征高密度区50栋/km²
交通标志API+OpenDRIVE影响目标检测难度每路口3-5个标志
植被覆盖资产库导入影响LiDAR点云反射行道树间距8-12m

实战场景:构建一个“城中村”场景用于测试感知算法在狭窄道路和密集建筑下的鲁棒性。使用RoadRunner绘制不规则路网,设置3米宽车道,两侧建筑间距仅6米。通过API在道路两侧放置密集的空调外机、晾衣架等干扰物。最终生成的场景中,LiDAR点云出现大量噪点,有效检验了算法的过滤能力。

经验提醒:场景创建时务必同步生成语义分割的Ground Truth。CARLA的semantic_segmentation传感器可以自动输出每个像素的类别ID,但需要确保自定义物体正确配置了语义标签,否则会出现“未知类别”像素。

4.3 天气与光照条件设置

核心原理:天气和光照直接影响传感器数据的物理特性。雨天会引入雨滴噪声和路面反光,雾天降低可见距离,夜间光照不足导致图像暗部细节丢失。CARLA的天气系统基于Unreal Engine的粒子系统和光照模型,可独立控制云量、降水、风速、太阳高度角等参数。光照条件由太阳方位角、高度角和色温决定,影响阴影方向和强度。

参数配置方法:

# 设置雨天+黄昏场景
weather = carla.WeatherParameters(
    cloudiness=80.0,      # 云量 0-100
    precipitation=60.0,   # 降雨量 0-100
    precipitation_deposits=50.0,  # 路面积水
    wind_intensity=30.0,  # 风速
    sun_azimuth_angle=240.0,  # 太阳方位角
    sun_altitude_angle=15.0,  # 太阳高度角(低角度=黄昏)
    fog_density=10.0,     # 雾浓度
    fog_distance=50.0,    # 雾可见距离
    wetness=60.0          # 路面湿润度
)
world.set_weather(weather)

光照与天气组合策略:

  • 昼夜循环:通过脚本在数据采集过程中动态改变太阳高度角,模拟从正午到黄昏的光照变化,增强模型对光照变化的鲁棒性。
  • 极端天气:暴雨(降雨量90+)配合强风(风速70+),测试传感器在恶劣条件下的性能衰减。
  • 雾天分级:设置雾浓度10/30/50/70,对应轻雾、中雾、重雾、浓雾,评估不同可见距离下的检测精度。
案例拆解:某项目需要生成夜间+雨天的多模态数据集。初始设置中,夜间图像整体偏暗,目标检测模型无法有效识别行人。分析发现,CARLA默认的夜间环境光过低,且雨滴粒子在低光照下几乎不可见。解决方案:①将sun_altitude_angle设为-10°(模拟月夜),同时增加cloudiness至90%以散射月光;②开启street_lights属性,在关键路口放置路灯;③调整相机曝光参数(ISO、快门速度),模拟真实摄像头的自动曝光。调整后,图像亮度分布接近真实夜间场景,模型检测率从52%提升至78%。
风险提示:天气参数并非线性影响数据质量。例如,降雨量从0增加到30时,路面反光显著增加,但超过60后,雨滴噪声会淹没视觉特征。建议通过网格搜索或贝叶斯优化确定最佳参数组合,而不是凭经验随意设置。

4.4 动态物体与交通流模拟

核心原理:动态物体包括车辆、行人、骑行者、动物等,其行为模型决定了数据的真实性和多样性。CARLA内置的Autopilot模式基于Waypoint导航,行为较为简单;SUMO则提供基于跟车模型(如IDM)和换道模型(如MOBIL)的精细化交通流仿真。通过Co-Simulation,可以将SUMO的车辆状态同步到CARLA中,实现“SUMO逻辑+CARLA渲染”的分离架构。

交通流配置流程:

  1. 定义路网:在SUMO中导入OpenDRIVE路网,转换为.net.xml格式。
  2. 生成交通需求:编写.rou.xml文件,定义车辆类型、出发时间、路径选择概率。
  3. 配置信号灯:在SUMO中设置交通信号灯配时方案,CARLA会同步显示。
  4. 行人模拟:CARLA内置行人AI,可设置行人密度和过街行为;SUMO也支持行人仿真,但需额外配置。
  5. 动态物体控制:通过Python API实时控制特定车辆(如测试车辆)的轨迹,实现“脚本化场景”。
动态物体类型仿真器行为模型数据采集要点
乘用车SUMOIDM跟车+MOBIL换道记录速度、加速度、航向角
行人CARLA随机游走+目标导向标注Bounding Box和关键点
骑行者CARLA基于道路的轨迹注意遮挡和速度突变
紧急车辆SUMO优先通行逻辑测试避让算法

实战案例:构建一个“高峰期十字路口”场景。在SUMO中设置每小时1200辆车的流量,其中10%为大型车辆(卡车/公交),行人密度为每5分钟20人。通过桥接同步到CARLA后,在十字路口部署一个测试车辆,采集其感知数据。初始运行时发现,车辆在路口频繁急刹,原因是SUMO的跟车模型参数与CARLA的物理引擎不匹配。调整SUMO的accel和decel参数(从2.6/4.5改为1.8/3.2),并增加min_gap至2.5米后,车辆行为趋于平稳,数据质量显著提升。

经验总结:交通流模拟的关键在于“可控性”。建议在数据采集脚本中设置随机种子,确保每次运行生成相同的交通流,便于问题复现和算法对比。同时,定期保存SUMO的车辆轨迹日志,用于事后分析数据分布。
常见误区:不要将所有动态物体都交给仿真器自动控制。对于特定测试场景(如“前车急刹”“行人突然横穿”),应使用脚本精确控制触发时机和轨迹,否则难以覆盖边缘案例。