菜单

核心架构

相关源文件

本文档概述了 openpilot 系统的核心架构,详细介绍了其组件如何交互以实现自动驾驶功能。它解释了高层系统设计、进程通信模型、控制流和车辆抽象层。有关特定子系统的详细信息,请参阅其专用页面:车辆接口系统规划与控制定位系统

系统概览

Openpilot 的架构遵循模块化、分布式设计模式,其中专用进程处理自动驾驶的特定方面。该系统使用消息传递进行进程间通信,并在负责传感、规划、控制和执行的组件之间保持清晰的界限。

来源:selfdrive/controls/controlsd.py1-229), selfdrive/selfdrived/selfdrived.py1-570), selfdrive/car/card.py1-292), selfdrive/test/process_replay/process_replay.py1-848), selfdrive/locationd/paramsd.py1-325), cereal/services.py1-124)

进程架构

Openpilot 的功能分布在多个专门的进程中,这些进程通过消息传递系统进行通信。每个进程负责自动驾驶堆栈的一个特定方面。

关键流程

来源:selfdrive/test/process_replay/process_replay.py460-604), system/manager/process_config.py63-158), selfdrive/test/test_onroad.py37-68)

进程通信

Openpilot 中的进程通过使用 cereal 实现的发布-订阅消息系统进行通信。每个进程都可以向其他进程订阅的特定主题发布消息。这实现了松耦合和模块化开发。

来源:cereal/services.py12-95), selfdrive/controls/controlsd.py38-41), selfdrive/car/card.py69-70), selfdrive/selfdrived/selfdrived.py61-83), selfdrive/locationd/paramsd.py55-193)

控制流架构

Openpilot 中的控制流遵循从传感到执行的结构化路径

  1. 传感:从摄像头、IMU、GPS 和车辆 CAN 总线采集数据
  2. 感知:处理传感器数据以理解环境
  3. 规划:确定期望的轨迹
  4. 控制:计算控制指令以跟踪规划的轨迹
  5. 执行:向车辆发送指令

来源:selfdrive/controls/controlsd.py60-138), selfdrive/selfdrived/selfdrived.py139-452), selfdrive/car/card.py168-203)

控制软件组件

主控制循环实现在 controlsd.py 中,它协调控制系统的各个组件

来源:selfdrive/controls/controlsd.py29-219), selfdrive/test/process_replay/process_replay.py478-488)

车辆抽象层

车辆抽象层负责在 openpilot 和不同的车辆平台之间提供一致的接口。它处理特定于平台的细节,并向系统的其余部分呈现统一的 API。

来源:selfdrive/car/card.py62-292), selfdrive/car/tests/test_car_interfaces.py29-101), selfdrive/car/car_specific.py33-424)

车辆接口状态流程

来源:selfdrive/car/card.py168-282), selfdrive/car/tests/test_models.py166-177)

流程测试与验证

Openpilot 采用全面的测试框架,包括流程回放、汽车模型测试和持续集成,以确保可靠运行。

来源:selfdrive/test/process_replay/process_replay.py129-316), selfdrive/test/test_onroad.py117-234), selfdrive/car/tests/test_models.py63-148)

进程管理

Openpilot 使用一个管理器来协调所有进程的启动、监控和关闭。流程配置定义了依赖关系、启动流程的条件以及它们在不同场景下的行为。

来源:system/manager/process_config.py11-158), selfdrive/test/process_replay/process_replay.py11-32)

RPC 和消息系统

Openpilot 使用一个基于 capnp 的自定义消息系统进行 RPC 和进程间通信。该系统允许进程以发布-订阅模式交换消息。

来源:cereal/services.py5-95), selfdrive/controls/controlsd.py38-41), selfdrive/selfdrived/selfdrived.py61-83)

事件处理系统

Openpilot 包含一个复杂的事件处理系统,用于管理警报、状态转换和用户反馈。事件按类型和优先级进行分类,以确保适当的响应。

来源:selfdrive/selfdrived/events.py20-51), selfdrive/selfdrived/selfdrived.py139-164)

关键接口和参数

Openpilot 中的参数系统提供了一种存储和检索配置值和运行时数据的方法。它是一个简单的键值存储,可在重启后持久化。

来源:common/params_keys.h6-130), selfdrive/car/card.py80-157), selfdrive/selfdrived/selfdrived.py44-45)

总结

openpilot 的系统架构以模块化和可测试性为核心原则。分布式流程模型允许组件的独立开发和测试,同时保持子系统之间清晰的接口。消息传递架构实现了松耦合并增强了系统鲁棒性,而全面的抽象层则以最少的代码重复适应各种车辆平台。