第2章 仿真测试环境搭建:主流仿真平台对比与硬件/软件在环
说实话,搭建仿真环境这件事,我踩过的坑比写过的代码还多。刚开始做自动驾驶测试那会儿,总觉得选个平台跑起来就行,结果呢?平台之间数据格式不兼容、传感器模型对不上、时间同步乱成一锅粥……嗯,今天咱们就把这事彻底捋清楚。
2.1 主流仿真平台对比
市面上仿真平台不少,但真正能打的不多。我个人习惯把平台分成两类:一类是高保真视觉仿真,另一类是大规模交通流仿真。前者看的是传感器和场景细节,后者看的是交通参与者行为。
2.1.1 CARLA
CARLA 是我用得最多的开源平台。它基于 Unreal Engine 4,渲染效果相当能打。我记得第一次用它生成夜间场景时,车灯光晕和路面反光真实得让我愣了几秒。
- 优点:开源免费、Python API 完善、支持多传感器(相机、激光雷达、毫米波雷达)
- 缺点:大规模交通流模拟吃力、物理引擎精度一般
- 适用场景:感知算法验证、规控算法初步测试
我的经验:用 CARLA 做感知测试时,记得调整天气参数。默认的晴天场景太理想化,我曾在项目中只测了晴天,结果雨天直接翻车。
2.1.2 SUMO
SUMO 是交通流仿真的老大哥。它不关心你的摄像头长什么样,只关心车怎么走、路怎么堵。说白了,它是微观交通仿真的标准工具。
- 优点:交通模型丰富、支持路网编辑、与 CARLA 有联合仿真接口
- 缺点:没有传感器仿真、可视化效果简陋
- 适用场景:交通流分析、V2X 场景测试、大规模路网验证
你想想看,如果只测单车的感知和规控,SUMO 确实用不上。但一旦涉及多车交互、交通灯协调,SUMO 就是刚需。
2.1.3 VTD(Virtual Test Drive)
VTD 是商业平台里的老牌选手。我最早接触它是在某主机厂的 HIL 实验室里,那套设备花了上千万。VTD 的优势在于场景编辑器和传感器模型的精度。
| 特性 | VTD | CARLA | SUMO |
|---|---|---|---|
| 渲染引擎 | 自有引擎 | Unreal Engine 4 | 无 |
| 传感器仿真 | 高精度 | 中等 | 无 |
| 场景编辑 | 图形化 | Python脚本 | XML配置 |
| 价格 | 昂贵 | 免费 | 免费 |
注意:VTD 的学习曲线比较陡。我曾经带过一个新人,花了两周才学会搭建一个简单的十字路口场景。如果团队预算有限,建议先从 CARLA 入手。
2.1.4 Prescan
Prescan 现在属于 Siemens 旗下,主打基于场景的测试。它的物理模型精度很高,尤其是轮胎和悬架模型。我在做 AEB 测试时,Prescan 的制动距离仿真结果和实车测试误差在 3% 以内。
- 优点:物理模型精准、与 Simulink 无缝集成、支持 ASAM OpenSCENARIO
- 缺点:价格高、场景库相对封闭
- 适用场景:功能安全验证、法规测试、HIL 集成
2.2 硬件在环(HIL)与软件在环(SIL)的区别
这个问题我面试时经常问候选人。很多人答不上来,或者把两者混为一谈。其实区别很简单:SIL 测的是算法逻辑,HIL 测的是硬件接口和实时性。
2.2.1 软件在环(SIL)
SIL 就是把算法跑在 PC 或服务器上,用仿真环境代替真实硬件。说白了,你的代码在电脑上跑,传感器数据是仿真生成的。
- 优点:成本低、迭代快、可以并行跑大量场景
- 缺点:无法验证硬件延迟、接口时序、信号质量
- 典型流程:算法开发 → 单元测试 → SIL 回归测试 → 场景覆盖分析
我建议团队在项目早期尽量多用 SIL。为什么?因为一次 HIL 测试的准备时间可能够你跑 1000 个 SIL 场景了。
2.2.2 硬件在环(HIL)
HIL 是把真实的控制器(ECU/ADCU)接入仿真环境。你想想看,控制器里跑的是真实代码,传感器信号是仿真器模拟的。这样就能测到硬件层面的问题。
- 优点:验证硬件接口、时序、故障注入、电源管理
- 缺点:设备昂贵、搭建周期长、场景数量受限
- 典型流程:SIL 通过 → HIL 环境搭建 → 接口测试 → 实时性测试 → 故障注入测试
关键区别:SIL 测的是「算法对不对」,HIL 测的是「硬件能不能跑对」。我曾经在 HIL 测试中发现过一个 CAN 总线超时问题,SIL 阶段完全没暴露出来。因为 SIL 里没有真实的 CAN 通信延迟。
2.3 环境配置实战
好了,理论说完了,咱们动手。下面是我个人习惯的一套 SIL 环境搭建流程,以 CARLA + Python 为例。
2.3.1 安装 CARLA
CARLA 的安装其实不复杂,但有几个坑要注意。
# 推荐使用 pip 安装 CARLA 客户端
pip install carla
# 或者下载预编译包
# 从 https://github.com/carla-simulator/carla/releases 下载
# 解压后运行 ./CarlaUE4.sh
我曾经踩过的坑:CARLA 对显卡驱动有要求。如果你用的是 NVIDIA 显卡,记得更新驱动到 470 以上。否则启动时会黑屏,我当时排查了整整一天。
2.3.2 编写第一个测试脚本
下面是一个最简单的场景:让一辆车在直道上匀速行驶。
import carla
import time
# 连接 CARLA 服务器
client = carla.Client('localhost', 2000)
client.set_timeout(10.0)
# 加载地图
world = client.get_world()
# 生成车辆
blueprint_library = world.get_blueprint_library()
vehicle_bp = blueprint_library.filter('model3')[0]
spawn_point = world.get_map().get_spawn_points()[0]
vehicle = world.spawn_actor(vehicle_bp, spawn_point)
# 控制车辆
vehicle.apply_control(carla.VehicleControl(
throttle=0.5,
steer=0.0
))
# 运行 10 秒
time.sleep(10)
# 清理
vehicle.destroy()
这段代码很简单,但包含了 SIL 测试的核心要素:环境连接、对象生成、控制输入、运行与清理。
2.3.3 配置传感器
实际测试中,我们需要传感器数据。下面是一个添加激光雷达的例子:
# 添加激光雷达
lidar_bp = blueprint_library.find('sensor.lidar.ray_cast')
lidar_bp.set_attribute('range', '50')
lidar_bp.set_attribute('rotation_frequency', '10')
lidar_bp.set_attribute('channels', '32')
lidar_transform = carla.Transform(carla.Location(x=1.5, z=2.4))
lidar = world.spawn_actor(lidar_bp, lidar_transform, attach_to=vehicle)
# 定义回调函数
def lidar_callback(data):
print(f"接收到 {len(data)} 个激光点")
lidar.listen(lidar_callback)
我的建议:传感器配置参数一定要和实车一致。我见过有人把激光雷达的线束设成 128 线,但实车只有 32 线,结果算法在仿真里跑得飞起,上车就废。
2.3.4 运行与调试
启动 CARLA 服务器后,运行脚本:
python test_scenario.py
如果一切正常,你会看到 CARLA 窗口里出现一辆车在行驶,控制台输出激光雷达数据。
嗯,到这里,一个最基本的 SIL 环境就搭好了。你可以在此基础上添加更多场景:行人横穿、车辆切入、交通灯变化……
记住,环境搭建只是第一步。真正有价值的是场景库的设计和测试用例的覆盖度。下一章我们会深入讲这个。