菜单

摄像头系统

相关源文件

本文档描述了 openpilot 中的摄像头系统,涵盖了硬件配置、软件架构和图像处理流水线。摄像头系统负责从多个摄像头捕获视频帧,处理图像数据,并将其提供给视觉神经网络、驾驶员监控系统和用户界面等其他组件。

摄像头硬件

openpilot 系统在 comma 3/3X 设备上使用了多摄像头设置,共有三个主要摄像头:

  1. 道路摄像头 - 前向高分辨率摄像头,具有窄视场。
  2. 宽道路摄像头 - 前向摄像头,具有宽视场。
  3. 驾驶员摄像头 - 面向驾驶员的摄像头,用于监控驾驶员注意力。

来源:system/camerad/cameras/hw.h10-69 system/camerad/sensors/ar0231.cc1-137 system/camerad/sensors/ox03c10.cc1-142 system/camerad/sensors/os04c10.cc1-135

该摄像头系统支持不同类型的传感器,其中 AR0231 是主要的受支持传感器。每种摄像头都有特定的配置,包括焦距、输出格式和处理流水线,这些都定义在 hw.h 中。

摄像头配置

摄像头流类型焦距输出类型畸变校正
宽道路VISION_STREAM_WIDE_ROAD1.71毫米ISP_IFE_PROCESSED已禁用
道路VISION_STREAM_ROAD8.0毫米ISP_IFE_PROCESSED已启用
驱动程序VISION_STREAM_DRIVER1.71毫米ISP_BPS_PROCESSED已禁用

来源:system/camerad/cameras/hw.h32-66

软件架构

摄像头系统的软件架构包括几个关键组件,它们协同工作以捕获、处理和分发摄像头数据。

来源:system/camerad/cameras/spectra.h60-219 system/camerad/cameras/camera_qcom2.cc37-87 system/camerad/cameras/camera_common.h1-47 system/camerad/sensors/sensor.h19-116

关键组件

  1. SpectraMaster

    • 处理低级摄像头硬件初始化
    • 打开并管理图像信号处理器 (ISP) 的设备文件描述符
    • 管理摄像头缓冲区的内存分配
  2. SpectraCamera

    • 代表系统中单个摄像头
    • 处理摄像头配置、初始化和帧处理
    • 管理从原始传感器数据到处理后帧的数据流水线
  3. CameraBuf

    • 管理摄像头帧缓冲区和元数据
    • 负责将帧发送到 Vision IPC 服务器,以便分发给其他进程
  4. CameraState

    • 控制摄像头设置,如曝光、增益和自动曝光
    • 处理摄像头事件并发送摄像头状态更新
  5. SensorInfo 和派生类

    • 提供特定于传感器的配置和功能
    • 处理用于曝光控制的特定传感器寄存器和参数
    • 由 AR0231、OX03C10 和 OS04C10 实现,支持不同传感器类型

初始化过程

摄像头系统的初始化遵循以下步骤:

来源:system/camerad/cameras/camera_qcom2.cc257-323 system/camerad/cameras/spectra.cc176-231

图像处理管道

摄像头系统通过几个阶段处理原始图像数据,以生成最终的输出帧。

来源:system/camerad/cameras/ife.h1-235 system/camerad/cameras/spectra.cc669-895

处理类型

openpilot 摄像头系统支持三种图像处理输出类型:

  1. ISP_RAW_OUTPUT:来自传感器的原始帧。
  2. ISP_IFE_PROCESSED:通过 IFE (Image Front End) 处理的帧。
  3. ISP_BPS_PROCESSED:通过 BPS (Bayer Processing Segment) 处理的帧。

道路摄像头和宽道路摄像头使用 ISP_IFE_PROCESSED,而驾驶员摄像头使用 ISP_BPS_PROCESSED。

自动曝光控制

摄像头系统包含一个自动曝光控制机制,该机制根据场景亮度调整曝光时间和增益。

来源:system/camerad/cameras/camera_qcom2.cc126-254 system/camerad/cameras/camera_common.cc79-104

自动曝光算法

  1. 根据场景亮度计算目标曝光值。
  2. 调整曝光时间、模拟增益和直流增益以达到目标。
  3. 优化参数以最小化噪声并保持正确的曝光。
  4. 将新参数应用于摄像头传感器寄存器。

摄像头数据分发

摄像头帧通过 Vision IPC 机制分发给其他系统组件。

来源:system/camerad/cameras/camera_common.cc47-64 selfdrive/ui/qt/widgets/cameraview.cc65-312 selfdrive/ui/ui.cc1-197

UI 集成

摄像头系统通过以下几个组件与 UI 集成:

  1. CameraWidget

    • 用于在 UI 中显示摄像头馈送的 OpenGL 小部件。
    • 处理帧渲染和显示转换。
    • 支持多个摄像头流(道路、宽道路、驾驶员)。
  2. DriverViewWindow

    • 用于显示驾驶员摄像头的专用视图。
    • 包含驾驶员监控的覆盖层。
  3. 光传感器集成

    • 摄像头曝光值用于估算环境光。
    • 根据摄像头光线读数控制 UI 亮度。

来源:selfdrive/ui/qt/widgets/cameraview.cc1-312 selfdrive/ui/qt/offroad/driverview.cc1-82 selfdrive/ui/ui.cc55-61

摄像头 API 和接口

摄像头系统通过以下几个接口公开其数据:

  1. Vision IPC 接口

    • 向其他进程提供低延迟摄像头帧数据。
    • 支持原始帧和处理过的 YUV 帧。
  2. 消息系统

    • 发布摄像头状态消息,包含元数据,例如:
      • 帧时间戳 (SOF/EOF)
      • 曝光设置
      • 增益值
      • 处理指标
  3. UI 显示接口

    • 为 UI 中的显示提供摄像头流。
    • 允许在不同摄像头视图之间切换。

来源:selfdrive/ui/qt/widgets/cameraview.h1-90 system/camerad/cameras/camera_qcom2.cc224-254

测试与验证

摄像头系统包含测试基础设施来验证性能。

来源:system/camerad/test/test_camerad.py1-99

测试验证了

  1. 所有摄像头的正确帧率
  2. 摄像头之间的同步
  3. 摄像头消息中的正确元数据
  4. 摄像头在错误条件下的鲁棒性