汽车接口系统 (Car Interface System) 是一个抽象层,它使得 openpilot 能够支持广泛的汽车品牌和型号。它位于规划和控制系统与汽车硬件之间,将 openpilot 的通用控制指令翻译成特定于车辆的 CAN 消息,并将特定于车辆的传感器数据转换为 openpilot 规划系统可以使用的标准化格式。
有关 openpilot 如何规划和控制车辆运动的信息,请参阅 规划与控制。有关 openpilot 如何通过 Panda 设备与车辆通信的详细信息,请参阅 车辆通信。
汽车接口系统由几个关键组件组成,它们协同工作,为不同的车辆平台提供一致的 API。
汽车接口架构概览
来源:selfdrive/test/test_onroad.py40-42
汽车接口架构展示了 openpilot 的规划和控制系统与汽车硬件之间的数据流。 card 守护进程是管理汽车接口类与系统其余部分之间通信的核心组件。
汽车抽象层为 openpilot 的其余部分与不同汽车品牌和型号交互提供了一个一致的接口。这是通过继承自通用接口的特定于汽车的类来实现的。
汽车抽象层
来源:selfdrive/test/test_onroad.py89-90
每个支持的车辆都有其 CarInterface 类的特定实现,该实现处理与该车辆通信的具体细节。这使得 openpilot 的其余部分能够以标准化的接口工作,而无需考虑使用的具体车辆。
每个车辆品牌和型号的汽车接口的实际实现组织在 selfdrive/car 目录下的一个分层结构中。
汽车接口实现结构
每个汽车品牌(例如本田、丰田、现代等)在 selfdrive/car 目录中都有自己的子目录。在每个品牌的目录中,通常有四个主要的 Python 文件:
carstate.py - 负责解析 CAN 消息以确定车辆的当前状态。carcontroller.py - 负责向车辆发送控制指令。interface.py - 实现特定品牌的 CarInterface 类。values.py - 包含特定于车辆的参数和指纹,用于识别特定型号。汽车接口系统在 openpilot 和车辆之间处理双向数据。以下是数据流的详细说明:
汽车接口数据流
来源:selfdrive/test/test_onroad.py85-92
系统有两个主要数据路径:
汽车接口系统包含全面的测试框架,以确保它能与不同的车辆型号正常工作。
汽车接口测试框架
来源:selfdrive/test/test_onroad.py115-177
测试方法包括:
汽车接口系统对性能有严格的要求,以确保安全且响应迅速的操作。
| 组件 | 预期 CPU 使用率 | 最大延迟 | 频率 |
|---|---|---|---|
| card 守护进程 | 26.0% | 不适用 | 不适用 |
| carState | 不适用 | 平均 2.5 倍 | 100Hz |
| carControl | 不适用 | 平均 2.5 倍 | 100Hz |
来源:selfdrive/test/test_onroad.py40-45 selfdrive/test/test_onroad.py85-92
card 守护进程是 openpilot 中 CPU 密集型组件之一,这反映了它在车辆控制中的关键作用。该系统旨在保持低且一致的延迟,以确保安全运行。
汽车接口系统包含多项安全机制,以确保仅在安全的情况下才将控制指令发送到车辆。
安全检查流程
来源:tools/plotjuggler/layouts/controls_mismatch_debug.xml11-13 tools/plotjuggler/layouts/controls_mismatch_debug.xml26-28 tools/plotjuggler/layouts/controls_mismatch_debug.xml34 tools/plotjuggler/layouts/controls_mismatch_debug.xml41-42
安全检查包括:
每个支持的车辆都有一组特定的参数,定义了 openpilot 如何与其交互。
来源:selfdrive/test/test_onroad.py88-91
这些参数包括:
汽车接口系统是 openpilot 的一个关键组成部分,它支持广泛的汽车品牌和型号。它为系统的其余部分与不同车辆交互提供了一个标准化的接口,负责将通用控制指令转换为特定于车辆的 CAN 消息,并确保安全检查得到正确执行。
该系统的模块化设计使得添加对新车型支持相对容易,而其全面的测试框架则确保了新添加的功能能够正确且安全地工作。