4、仿真环境搭建:安装配置主流仿真器、场景创建、天气与光照条件设置、动态物体与交通流模拟
仿真环境是数据流水线的“数据源头工厂”。在真实世界中采集数据成本高、场景覆盖难、极端天气不可控,而仿真器能够以可重复、可编排、低成本的方式生成海量带标注的传感器数据。本章聚焦于仿真环境搭建的四个核心环节:仿真器选型与安装、场景构建、天气与光照系统、动态物体与交通流模拟。我们将以CARLA和SUMO为例,讲解从零搭建一套可用于数据采集的仿真流水线,并深入讨论参数配置、脚本化控制与数据导出的工程实践。
上图展示了仿真环境搭建的整体链路。仿真器作为核心,向下驱动场景、天气、动态物体三个子模块,向上输出多模态传感器数据,并同步生成标注信息。在实际工程中,我们需要通过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桥接。
安装配置流程:
- 环境准备:Ubuntu 20.04/22.04,NVIDIA GPU(建议RTX 3060以上),CUDA 11.6+,Python 3.8+。
- CARLA安装:下载CARLA 0.9.15压缩包(约20GB),解压后运行
./CarlaUE4.sh启动服务端。客户端通过pip安装carla库。 - SUMO安装:
sudo apt install sumo sumo-tools,或从源码编译以获取最新功能。 - 协同配置:安装
carla-sumo桥接包,配置路网文件映射和端口通信(默认端口2000)。
# 启动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%,且每个场景可精确复现。
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点云出现大量噪点,有效检验了算法的过滤能力。
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,对应轻雾、中雾、重雾、浓雾,评估不同可见距离下的检测精度。
sun_altitude_angle设为-10°(模拟月夜),同时增加cloudiness至90%以散射月光;②开启street_lights属性,在关键路口放置路灯;③调整相机曝光参数(ISO、快门速度),模拟真实摄像头的自动曝光。调整后,图像亮度分布接近真实夜间场景,模型检测率从52%提升至78%。
4.4 动态物体与交通流模拟
核心原理:动态物体包括车辆、行人、骑行者、动物等,其行为模型决定了数据的真实性和多样性。CARLA内置的Autopilot模式基于Waypoint导航,行为较为简单;SUMO则提供基于跟车模型(如IDM)和换道模型(如MOBIL)的精细化交通流仿真。通过Co-Simulation,可以将SUMO的车辆状态同步到CARLA中,实现“SUMO逻辑+CARLA渲染”的分离架构。
交通流配置流程:
- 定义路网:在SUMO中导入OpenDRIVE路网,转换为
.net.xml格式。 - 生成交通需求:编写
.rou.xml文件,定义车辆类型、出发时间、路径选择概率。 - 配置信号灯:在SUMO中设置交通信号灯配时方案,CARLA会同步显示。
- 行人模拟:CARLA内置行人AI,可设置行人密度和过街行为;SUMO也支持行人仿真,但需额外配置。
- 动态物体控制:通过Python API实时控制特定车辆(如测试车辆)的轨迹,实现“脚本化场景”。
| 动态物体类型 | 仿真器 | 行为模型 | 数据采集要点 |
|---|---|---|---|
| 乘用车 | SUMO | IDM跟车+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米后,车辆行为趋于平稳,数据质量显著提升。