追尾事故是载货卡车和其他重型车辆最容易发生的一类事故。2015 年,为了降低追尾事故的风险,欧盟法规要求为所有新车辆使用先进的紧急制动系统 (Advanced Emergency Braking Systems, AEBS)。
与其他先进的驾驶辅助系统 (Advanced Driver Assistance Systems, ADAS) 一样,AEBS 使用传感器输入来感知周围环境。即将发生事故时,系统会通过声音警报警告驾驶员。如果驾驶员没有反应,系统将采取警告制动。如果驾驶员仍然没有反应,系统将采取完全制动以避免发生事故(图 1)。此外,AEBS 还提供“制动辅助系统”:当驾驶员已经刹车,但没有足够的制动力避免事故时,系统将通过计算提供所需的额外制动力。
图 1 上图:AEBS 概览。下图:这是一个典型的 AEBS 场景,一辆安装了 AEBS 的卡车正在驶向一辆慢速行驶的车辆。
AEBS 同时使用车辆前部安装的雷达和相机传感器来扫描前方区域的物体。系统利用每个传感器的独特优势获取更精确的环境模型。雷达传感器的优势在于确定物体的距离、相对速度和硬度,但在确定物体的形状或横向位置方面较弱。只安装雷达的系统会发现很难将停在路边的汽车同行驶车道中的汽车区分开。而在另一方面,相机可以精确获取物体的大小和横向位置,但不能很好地测定距离,并且无法估计密度(可能会将浓密的云层误认为是一个坚实的物体)。
我和我的同事们构建了一个传感器融合系统,可将两个传感器中的数据进行匹配并合并到一个物体中。该系统使用四个加权属性(纵向速度、纵向位置、横向速度和横向位置)来计算两个传感器检测到同一个物体的概率。传感器融合系统一旦在主车辆道路中发现物体,会将该物体的位置和车辆的预计路径传递给 AEBS,AEBS 将确定何时警告驾驶员或采取制动措施。
我们团队以前曾通过基于模型的设计方法开发过使用雷达技术的自适应巡航控制系统,但从未开发过传感器融合系统。由于这是一种全新的设计,我们需要使用可读且易懂的架构将信号流可视化。我们还预计使用大量设计迭代,因此希望通过一种简单的方法实现结果可视化和设计调试。此外,我们希望能通过生成代码来节省时间,但代码必须是高效率的,因为当启动传感器融合项目时,我们的电子控制单元 (Electronics Control Unit, ECU) 上的 CPU 负载已经达到 60% 左右。最后,我们需要对设计进行全面验证,因为我们计划基于超过 150 万公里的传感器数据运行仿真。基于模型的设计满足所有这些要求。
构建传感器融合系统
我们首先将系统设计划分为多个功能单元,如对象匹配和预计路径定位,并为每个单元构建一个单独的 Simulink® 模块。结果是一个清晰的软件架构,具有定义良好的接口(图 2)。我们为轨迹关联编写了 MATLAB® 代码,以便计算方差、计算加权概率以及执行使用脚本要比使用模块更容易实现的其他任务,之后我们通过 MATLAB Function block 将此代码合并到 Simulink 模型中。这些算法模块可以使团队成员更方便地合并算法,并将这些算法与控制系统集成。
图 2 传感器融合系统的 Simulink 模型,显示了独立的功能模块。
为了调试和改进初始设计,我们使用记录的雷达传感器数据、相应的相机图像和其他车辆传感器数据运行了仿真。在调试期间我们发现,将来自车辆前部的传感器数据和相机视图进行可视化是非常有用的。我们在 MATLAB 中构建了可视化工具,可显示与周围交通状况的 Web 相机视图同步的传感器融合数据(图 3)。利用 MATLAB 面向对象的编程功能,该工具使用 MATLAB 类表示任意传感器检测到的每个对象,以及传感器融合系统感知到的统一的对象。通过这些 MATLAB 对象,我们可以在执行数据可视化时快速及时地前进和后退。
图 3 在 MATLAB 中开发的传感器可视化工具。
我们在道路测试期间使用相同的工具,对来自车辆网络的实时数据进行可视化(图 4)。
图 4 AEBS 软件的受控道路测试。两辆车之间的梯形物体是模仿车辆的一个“软目标”,用于“欺骗”雷达和相机。
实现系统和优化性能
为了将传感器融合系统部署到 ECU,我们使用 Embedded Coder® 从 Simulink 模型生成 C 代码。借助代码生成,我们可以快速实现系统,并可避免编码错误。ECU 处理器的大部分资源都已分配给维护功能,包括监视仪表盘警报、数据网关和自适应巡航控制,等等。因此,我们需要优化初始设计来提高效率。
为了让生成的代码提供最佳性能,我们与 MathWorks Pilot 团队共同协作,他们可以帮助我们优化从 MATLAB Coder 生成的代码。为了进一步降低处理负载,我们将模型分为交替执行的单独部分。例如,我们不在每个周期都为静止对象和移动对象运行计算操作,而是按周期交替运行。我们发现,系统正在调用的三角函数严重影响了处理器的处理速度。为了解决这个问题,我们用 C 语言编写了三角近似函数,并从 MATLAB 函数模块调用这些函数。这些修改不但提高了传感器融合代码的效率,还使得 AEBS 软件的反应更快,这在以毫秒计的车辆高速行驶时尤为重要。
验证和改进设计
我们在一段封闭道路上对设计进行了车载测试,但是我们需要了解系统在实际驾驶场景中如何反应,如不同的天气条件、交通模式和驾驶员行为。在这些条件下直接测试 AEBS 既不现实也不安全。于是,我们使用了基于仿真的工作流。首先从一组卡车中收集数据。我们决定收集 ECU 上所有可用数据(而不仅仅是用于数据融合的雷达和相机中的数据),以及来自单独的参考相机中的图像。
我们使用这一组测试数据运行了仿真,以鉴别一些值得关注的驾驶场景。在有些场景中,AEBS 进行了干预,警告驾驶员或采取了制动措施;而在有些场景中,系统本该但没有进行干预,例如,当驾驶员同时按喇叭和踩刹车、突然转弯或紧急刹车时。之后,我们针对这些场景对 AEBS 的性能进行了分析,以确定可以在哪些方面改进设计。
我们需要在每次更新 AEBS 软件后重新进行仿真。但是,由于在超过 150 万公里的驾驶里程中所记录的实际交通数据超过了 80 TB,因此需要几天才能运行完一个仿真。
为了加快仿真运行速度,我们构建了模拟器,它使用通过 Embedded Coder 从 Simulink 模型中生成的代码。该模拟器与 Simulink 模型读取和写入相同的 MAT 文件,但运行仿真的速度提高了 150 倍。为了进一步提高仿真运行速度,我们编写了 MATLAB 脚本,这些脚本将在我们部门的多台计算机以及专用的多处理器服务器上运行仿真,这样我们并行运行的仿真多达 300 个。通过此设置,我们将仿真 150 万公里所有交通数据的时间减少到仅需 12 小时。在模拟器中发现值得关注的新场景时,我们会在 Simulink 中重新运行仿真以进行深度分析。
使用以 TB 为单位的数据对可能值得关注的场景进行识别和分类是一项乏味且耗时的任务,因此我们开发了情形分类辅助模块,这是一个基于 MATLAB 的工具,可自动处理这部分工作(图 5)。该工具从仿真中生成一个活动列表,如由系统发起的事故警报、警告制动和完全制动,以及由驾驶员引起的急刹车和急转弯。之后我们可以针对任意两个版本的软件对这些列表进行比较。
图 5 情形分类辅助模块是基于 MATLAB 的工具,用于处理记录的 ECU 数据,以及自动识别与紧急制动相关的情形。
执行大量仿真的能力增强了 AEBS 功能以及 ECU 中产品代码实现的鲁棒性和安全性。另外,还可以让我们更快地进行更改。我们对这些更改很有信心,因为我们使用仿真中的所有可用数据对上千种场景进行了测试。
在 ADAS 生产中部署生成的代码
大多数 Scania 卡车和公交车现在都配备了 AEBS(该系统运行从 Simulink 模型生成的产品代码,并通过大量仿真进行了验证)。我们在 Scania 的自适应巡航控制系统中重用了传感器融合系统设计,因此现在路上有 10 万多个电子控制单元在使用。
获取更多评论