菜单

开发与测试

相关源文件

本页面提供了 openpilot 开发和测试流程的全面指南。内容涵盖了环境设置、构建流程、测试框架以及项目中使用的持续集成系统。有关开发所用特定工具的信息,请参阅开发工具

开发环境设置

设置 openpilot 开发环境需要根据您的操作系统安装特定的依赖项。

平台特定设置

openpilot 支持在 Ubuntu 和 macOS 平台上进行开发,并提供相应的设置脚本。

Ubuntu 设置

适用于 Ubuntu (推荐 24.04 LTS)

此脚本安装了必需的软件包,包括

  • 开发工具(clang, gcc-arm-none-eabi)
  • 库(capnp, ffmpeg, OpenCL, Qt)
  • 硬件接口工具

该脚本还配置了用于与 Panda 设备交互的 udev 规则。

来源:tools/install_ubuntu_dependencies.sh1-125

macOS 设置

对于 macOS

此脚本通过 Homebrew 安装必要的依赖项并配置环境。

来源:tools/mac_setup.sh1-100

Python 环境

Python 依赖项使用 pyproject.toml 进行管理,并通过 uv 包管理器安装。

这将创建一个 Python 虚拟环境(.venv)并安装所有必需的包。

关键依赖项组包括

  • 核心依赖项(pycapnp, numpy, zeromq)
  • 测试工具(pytest, coverage, mypy)
  • 开发工具(ruff, codespell)

来源:pyproject.toml1-267 tools/install_python_dependencies.sh1-32

基于 Docker 的开发

为了获得一致的开发环境,可以使用 Docker。

Docker 环境预装了所有必需的依赖项。

来源:Dockerfile.openpilot_base1-82 selfdrive/test/docker_build.sh1-27

构建系统

构建 openpilot

openpilot 使用 SCons 作为其构建系统。要构建项目,请

构建系统会编译 C/C++ 组件并准备 Python 模块。

来源:.github/workflows/compile-openpilot/action.yaml1-22

开发构建图

测试框架

openpilot 拥有一个涵盖单元测试、集成测试和系统测试的全面测试框架。

测试类型

该项目采用了多种测试方法

  1. 单元测试:针对单个组件的集中测试
  2. 进程回放测试:使用录制的输入验证进程行为
  3. 车辆模型测试:针对特定车辆接口的测试
  4. 硬件测试:针对摄像头、传感器和设备硬件的测试
  5. UI 测试:针对用户界面组件的测试

在本地运行测试

测试主要使用 pytest 运行。

来源:pyproject.toml137-166

测试基础设施图

持续集成系统

openpilot 利用 GitHub Actions 和 Jenkins 维护一个强大的 CI/CD 管道。

GitHub Actions

GitHub Actions 工作流在每次拉取请求和推送到 master 时运行,执行各种测试。

  1. 静态分析:代码质量检查
  2. 单元测试:基本功能验证
  3. 进程回放:确保进程产生一致的输出
  4. 车辆模型测试:验证车辆接口实现
  5. 构建验证:确保构建干净

来源:.github/workflows/selfdrive_tests.yaml1-359

Jenkins 管道

Jenkins 负责在真实硬件上进行特定于设备的测试。

  1. 路测:需要实际车辆硬件的测试
  2. 硬件测试:针对特定硬件组件(摄像头、传感器)的测试
  3. 摄像头测试:针对不同型号摄像头的测试(AR0231, OX03C10, OS04C10)
  4. 环回测试:使用硬件进行环回配置的测试

来源:Jenkinsfile1-282

CI/CD 管道图

来源:.github/workflows/selfdrive_tests.yaml32-307 Jenkinsfile154-276

专用测试工具

进程回放测试

进程回放是一种关键的测试方法,它通过回放录制的输入并将其输出与参考数据进行比较,来验证 openpilot 进程的行为。

流程

  1. 加载测试路线的录制数据
  2. 向特定进程馈送输入
  3. 捕获输出并与参考进行比较
  4. 报告差异和性能指标

这种方法可确保不同版本之间的行为一致性,并有助于捕获回归。

模型回放测试

模型回放是一种专门的进程回放类型,侧重于神经网络模型。

模型回放测试的关键方面

  • 验证模型执行时间是否在限制范围内
  • 确保关键驾驶功能的输出一致
  • 检测不同版本之间模型行为的变化
  • 生成已检测差异的视觉报告

来源:selfdrive/test/process_replay/model_replay.py1-312

车辆模型测试

车辆模型测试验证了每个支持车辆的接口。

  1. 加载特定车辆模型的路线段
  2. 测试 CAN 消息的解析和解释
  3. 验证控制命令的生成
  4. 确保不同车辆模型之间行为的一致性

这些测试有助于与不断增长的支持车辆列表保持兼容性。

来源:.github/workflows/selfdrive_tests.yaml215-250

发布流程

构建发布版本

openpilot 使用专用脚本来构建发布版本。

发布构建过程

  1. 创建干净的构建目录
  2. 仅复制部署所需的必要文件
  3. 构建所有组件
  4. 签署 Panda 固件
  5. 运行验证测试
  6. 推送到发布分支

来源:release/build_release.sh1-103

发布工作流

发布通过自动化的 GitHub Actions 工作流进行管理。

  1. master-ci:一个定期测试的开发分支
  2. release branches:稳定的发布版本
  3. nightly builds:每日开发构建

GitHub Actions 工作流负责

  • 触发时构建发布版本
  • 运行验证测试
  • 发布构建产物
  • 创建预构建的 Docker 镜像

来源:.github/workflows/release.yaml1-55 .github/workflows/prebuilt.yaml1-40

发布流程图

来源:.github/workflows/release.yaml8-54 release/build_release.sh14-100

开发工具集成

openpilot 的开发和测试基础设施与多个专用工具集成。

调试与分析

  1. 进程/日志转储:用于查看实时或录制数据的工具

    • selfdrive/debug/dump.py:用于转储通信数据的实用程序
  2. 模型检查:

    • selfdrive/modeld/get_model_metadata.py:从 ONNX 模型提取元数据
    • selfdrive/modeld/models/README.md:关于神经网络架构的文档

来源:selfdrive/debug/dump.py1-75 selfdrive/modeld/get_model_metadata.py1-38 selfdrive/modeld/models/README.md1-68

GitHub 集成

openpilot 利用 GitHub 的功能来管理开发工作流程。

  1. Issue Templates:用于 bug 报告的结构化模板
  2. Automated Actions:用于陈旧 PR 管理的工作流
  3. CI Reporting:作为 PR 评论发布的详细测试结果

该项目还维护专门的 GitHub 工具函数,用于报告测试结果和上传构建产物。

来源: .github/ISSUE_TEMPLATE/pc_bug_report.yml1-43 .github/workflows/stale.yaml1-30 tools/lib/github_utils.py1-115

模型开发工作流

模型更改需要使用模型回放系统进行仔细验证

关键验证方面包括

  • 确保模型执行时间在严格限制内
  • 验证关键驾驶功能的输出一致性
  • 检查模型行为是否存在非预期更改
  • 生成可视化以理解模型更改

来源: selfdrive/test/process_replay/model_replay.py62-110 selfdrive/modeld/fill_model_msg.py1-201 selfdrive/modeld/parse_model_outputs.py1-116

测试仓库组织

来源: pyproject.toml137-166 .github/workflows/selfdrive_tests.yaml32-164 Jenkinsfile76-119