本文档概述了 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 中的控制流遵循从传感到执行的结构化路径
来源: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)
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 的系统架构以模块化和可测试性为核心原则。分布式流程模型允许组件的独立开发和测试,同时保持子系统之间清晰的接口。消息传递架构实现了松耦合并增强了系统鲁棒性,而全面的抽象层则以最少的代码重复适应各种车辆平台。