菜单

车辆通信

相关源文件

本页面详细介绍了 openpilot 如何通过 Panda 设备与车辆进行通信。内容涵盖 CAN 总线通信架构、消息时序要求以及负责处理车辆通信的进程。有关汽车接口系统的更多信息,请参阅 汽车接口系统

车辆通信概述

OpenPilot 使用 Panda 设备作为计算设备和车辆内部通信网络之间的桥梁。这种设置使系统能够从车辆读取数据(例如速度、加速度、转向角)并发送控制命令(油门、制动、转向)。

通信遵循双向模式

  1. 车辆到 OpenPilot:传感器读数、状态信息和诊断数据
  2. OpenPilot 到车辆:控制命令、系统状态和覆盖请求

来源:selfdrive/test/test_onroad.py85-90

通信架构

高层架构

来源:selfdrive/test/test_onroad.py39-50 selfdrive/test/test_onroad.py83-90

进程通信

OpenPilot 服务使用发布-订阅消息系统进行通信,其中有几个关键服务专门用于车辆通信。

服务目的频率要求
can来自车辆的原始 CAN 消息高频,严格的时序
sendcan发送到车辆的 CAN 消息高频,严格的时序
pandaStatesPanda 设备的状态定期更新
peripheralState外围设备的状态定期更新
carState解析后的车辆状态信息定期更新
carControl车辆的控制命令高频,严格的时序

来源:selfdrive/test/test_onroad.py83-90

CAN通信

控制器局域网(CAN)总线是 openpilot 与车辆之间的主要通信媒介。Panda 设备充当 CAN 接口,允许软件读取和写入 CAN 消息。

CAN 消息流

来源:selfdrive/test/test_onroad.py83-90

时序要求

精确的时序对于车辆通信至关重要。OpenPilot 对 CAN 相关服务强制执行严格的时序要求。

系统会监控时序统计数据以确保通信的可靠性。

  • 最大时序方差:标称值的 2.5 倍
  • 最大相对标准差(RSD):0.35

来源:selfdrive/test/test_onroad.py83-90 selfdrive/debug/check_timings.py1-37

关键进程和 服务

Pandad

pandad 进程管理与 Panda 设备的通信。它负责:

  • 从 Panda 读取原始 CAN 消息
  • 向 Panda 写入控制命令
  • 监控 Panda 设备状态
  • 向其他进程提供 pandaStates 更新

Card (Car Daemon)

card 进程负责:

  • 将原始 CAN 消息解释为结构化的 carState 数据
  • 将高级控制命令转换为适当的 CAN 消息
  • 实现汽车特定的接口逻辑
  • 在通信过程中强制执行安全协议

Selfdrived

selfdrived 进程协调规划/控制系统和车辆接口之间的工作。

  • 接收 carState 信息用于规划
  • 根据规划决策生成 carControl 消息
  • 协调控制循环和安全系统

来源:selfdrive/test/test_onroad.py39-50

测试与验证

为了确保可靠性和安全性,车辆通信受到了广泛的测试。

时序测试

系统包含用于监控通信时序的工具。

  • check_timings.py:监控消息频率和时序方差。
  • check_freq.py:跟踪消息频率统计数据。
  • check_lag.py:检测通信延迟和异常。

CAN 相关服务的示例时序要求

服务最大/最小比率最大 RSD
can2.50.35
pandaStates2.50.35
peripheralState2.50.35
sendcan2.50.35
carState2.50.35
carControl2.50.35

来源:selfdrive/test/test_onroad.py83-101 selfdrive/debug/check_timings.py1-37 selfdrive/debug/check_freq.py1-51 selfdrive/debug/check_lag.py1-28

路测

test_onroad.py 脚本对车辆通信系统进行了全面测试。

  • 验证通信进程的 CPU 使用率。
  • 测试消息时序和频率。
  • 检查不同通信组件之间的同步。
  • 验证关键消息的可靠传递。

路测可确保车辆通信系统的所有组件在各种条件下都能正确协同工作。

来源:selfdrive/test/test_onroad.py115-463

失败处理

当车辆通信失败时,系统必须做出适当的响应。

  1. 立即停车:如果关键通信丢失,系统将停车以确保安全。
  2. 错误报告:通信错误将被记录并报告给用户。
  3. 恢复尝试:在某些情况下,系统可能会尝试重新初始化通信。
  4. 优雅降级:部分通信故障可能导致功能降低,而不是完全停止系统。

来源:selfdrive/test/test_onroad.py452-462

I2C 通信(硬件通信)

虽然 CAN 是主要的车辆通信协议,但系统也使用 I2C 与某些车载硬件组件进行通信。

I2C 通信功能实现在 I2CBus 类中,该类提供了读写 I2C 设备的方法。

来源:common/i2c.h1-20 common/i2c.cc1-93