2、仿真环境搭建基础:硬件在环(HIL)与软件在环(SIL)概念、主流仿真工具介绍(如CARLA, VTD, Prescan)、环境配置实战
好,咱们正式开始搭建仿真环境。这一节内容,说白了就是整个AD系统测试的“地基”。地基打不牢,后面跑什么场景都容易翻车。我见过不少团队,上来就追求高保真度,结果环境配置卡了两周,最后发现连个基本的SIL都跑不通。嗯,咱们一步步来。
2.1 硬件在环(HIL)与软件在环(SIL)——到底有什么区别?
先搞清楚这两个概念。很多新人容易混淆,其实没那么复杂。
SIL(Software-in-the-Loop),就是软件在环。说白了,你的算法代码跑在一个虚拟环境里,没有真实硬件参与。我刚开始做ADAS那会儿,公司连个像样的ECU都没有,全在PC上跑SIL。好处是快,迭代快,调试方便。坏处是——你永远不知道真实硬件上会不会出幺蛾子。
HIL(Hardware-in-the-Loop),硬件在环。这时候你的算法已经烧录到真实的控制器里了,比如一个域控制器或者MCU。但车还是虚拟的,通过I/O接口和实时系统连接。我曾经在HIL测试中遇到过一个问题:算法在SIL里跑得好好的,一上HIL就报时序错误。查了两天,发现是CAN总线延迟导致的。你看,这就是HIL的价值——暴露真实硬件的问题。
| 对比项 | SIL | HIL |
|---|---|---|
| 硬件参与度 | 无真实硬件 | 真实控制器/ECU |
| 实时性要求 | 低,可非实时 | 高,必须实时 |
| 调试便利性 | 极高,可打断点 | 较低,依赖日志 |
| 测试成本 | 低 | 高(硬件+实时系统) |
| 典型应用阶段 | 算法开发初期 | 集成测试、验证 |
2.2 主流仿真工具——CARLA、VTD、Prescan怎么选?
市面上工具很多,但真正在工业界用得多的,就这三家。我分别说说我的使用感受。
2.2.1 CARLA——开源党的最爱
CARLA是个开源仿真器,基于Unreal Engine。我个人很喜欢它,因为社区活跃,文档齐全。你想想看,一个开源项目能做到这个程度,确实不容易。
- 优点: 免费、可定制性强、支持Python API、传感器模型丰富(相机、激光雷达、毫米波雷达都有)
- 缺点: 渲染开销大、实时性一般、官方场景库偏少
- 适合场景: 算法原型验证、学术研究、小团队快速迭代
我记得有一次,我们需要测试一个极端场景——夜间暴雨下的行人横穿。CARLA里改个天气参数就搞定了,几分钟的事。要是用商业工具,光申请场景包就得等一周。
2.2.2 VTD(VIRES Virtual Test Drive)——工业级选手
VTD是德国VIRES公司的产品,在主机厂和Tier 1里用得非常多。它最大的特点是——支持完整的ADAS/VAD开发流程,从场景编辑到传感器仿真再到数据回放,一条龙。
- 优点: 实时性好、支持ASAM OpenDRIVE/OpenSCENARIO标准、与dSPACE/NI等HIL平台深度集成
- 缺点: 贵(一套license几十万)、学习曲线陡峭
- 适合场景: 量产项目、HIL测试、法规验证
2.2.3 Prescan——西门子的“瑞士军刀”
Prescan现在属于Siemens,主打易用性。它的图形化界面做得很好,拖拽式场景编辑,对新手非常友好。
- 优点: 上手快、与Simulink无缝集成、传感器模型精度高(尤其是雷达)
- 缺点: 场景复杂度有限、大型场景性能下降明显
- 适合场景: 快速原型、功能验证、与Simulink联合仿真
我个人习惯是:原型阶段用CARLA,集成测试用Prescan,量产验证用VTD。当然,这取决于你们公司的预算和技术栈。
2.3 环境配置实战——从零搭建一个SIL测试环境
光说不练假把式。咱们来搭一个最简单的SIL环境。假设你用的是CARLA + Python。
2.3.1 安装CARLA
首先,去CARLA官网下载对应版本的包。我建议用0.9.14或更新的版本,API更稳定。
# 下载CARLA包(以0.9.14为例)
wget https://carla-releases.s3.eu-west-3.amazonaws.com/Linux/CARLA_0.9.14.tar.gz
tar -xzf CARLA_0.9.14.tar.gz
cd CARLA_0.9.14
# 安装Python依赖
pip install -r PythonAPI/examples/requirements.txt
2.3.2 启动CARLA服务器
CARLA采用客户端-服务器架构。先启动服务器,再运行你的算法脚本。
# 启动CARLA服务器(默认端口2000)
./CarlaUE4.sh -quality-level=Low -fps=10
这里我用了低画质和10帧,因为只是做SIL测试,不需要高保真渲染。你想想看,跑个算法验证,没必要把GPU烧到100%。
2.3.3 编写第一个测试脚本
下面是一个最简单的脚本:生成一辆车,让它直线行驶。
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()
print("测试完成!")
这段代码很简单,但它是你整个SIL测试的起点。你可以在此基础上加传感器、加场景、加碰撞检测。我刚开始做的时候,就是从这个脚本一步步扩展起来的。
2.3.4 验证环境是否正常
跑完脚本后,你应该能看到CARLA窗口里有一辆特斯拉Model 3在直行。如果报错,多半是端口被占用或者版本不匹配。
- 连接超时:检查防火墙是否放行2000端口
- 蓝图找不到:确认CARLA版本和Python API版本一致
- 渲染卡顿:降低画质或关闭渲染(用no-rendering模式)
2.4 小结
这一节我们讲了SIL和HIL的区别,介绍了三个主流工具,还亲手搭了一个SIL环境。说实话,环境搭建是最枯燥的部分,但也是最重要的。我见过太多人,工具装了一半就放弃了,或者装好了不知道怎么用。
记住一句话:仿真环境不是目的,是手段。你的目标是测试算法,不是玩转工具。所以,选一个你最顺手的工具,把它用透,比什么都强。
下一节,我们会讲场景设计——怎么构造那些让算法“崩溃”的极端场景。嗯,那才是真正有意思的部分。