4. 同步核心概念:帧同步、曝光同步、时间戳同步与软硬件权衡

多Camera同步是AR系统实现空间一致性、低延迟与高鲁棒性的基石。在HAL(硬件抽象层)视角下,同步并非单一机制,而是由帧同步(Frame Sync)、曝光同步(Exposure Sync)和时间戳同步(Timestamp Sync)三个层次构成。每一层解决不同粒度的时序问题,且硬件与软件方案之间存在明确的权衡。

4.1 帧同步(Frame Sync)

帧同步确保多个Camera在同一时刻开始并结束一帧的传输。这是最粗粒度的同步,通常由硬件触发信号(如VSYNC、FSYNC)驱动。HAL层需要将多个Sensor的帧起始信号对齐到同一个硬件时钟域。

关键指标:帧对齐抖动(Frame Alignment Jitter)应小于1行扫描时间(通常 < 1 µs),否则会导致多视图之间的像素级错位。
帧同步信号拓扑(Frame Sync Topology) 主时钟 / MCLK FSYNC 分发器 Camera 0 (Master) Camera 1 (Slave) Camera 2 (Slave) 硬件FSYNC信号从主时钟分发,所有Camera在同一时钟沿触发帧起始,抖动仅受PCB走线延迟影响

4.1.1 帧同步实现方式对比

方式 延迟 抖动 硬件依赖 典型场景
硬件FSYNC线 < 1 µs < 100 ns 高(需专用GPIO) VR/AR头显、机器人
软件触发(ioctl) 100 µs – 1 ms 10 – 100 µs 低 原型验证、低帧率场景
MIPI CSI-2 内嵌同步 < 10 µs < 1 µs 中(需CSI-2支持) 移动设备、嵌入式平台
避坑提示:纯软件帧同步在Android HAL中容易受到Binder调度和CPU频率缩放的影响,导致帧对齐抖动超过100 µs,不适用于高精度AR追踪。

4.2 曝光同步(Exposure Sync)

曝光同步比帧同步更精细。它要求多个Camera的曝光窗口在时间上完全重叠,避免因运动物体在不同Camera的曝光中心时刻不同而产生视差伪影。HAL层需要控制每个Sensor的曝光起始时间和曝光时长。

曝光同步时序对比 未同步: Camera 0 曝光窗口 Camera 1 曝光窗口 ✗ 曝光窗口错位 → 运动物体出现边缘伪影 已同步: Camera 0 曝光窗口 Camera 1 曝光窗口 ✓ 曝光窗口完全重叠 → 运动物体空间一致性高 HAL通过配置Sensor的Coarse Integration Time (CIT) 和Fine Integration Time (FIT) 实现曝光窗口对齐 曝光时长差异需在帧空白期(VBlank)内补偿

4.2.1 曝光同步的HAL配置要点

  • 全局曝光(Global Shutter):所有像素同时曝光,同步最简单,但成本高、噪声大。
  • 卷帘曝光(Rolling Shutter):逐行曝光,同步需对齐每行的曝光起始点,HAL需配置VTS(Vertical Timing Signal)偏移。
  • 曝光时长匹配:不同Camera的曝光时间必须一致,否则会导致亮度差异和运动模糊不一致。
实践建议:在HAL层实现曝光同步时,优先使用硬件Trigger模式(如STROBE信号),避免通过I²C/SPI逐个寄存器写入,后者会引入不可控的延迟。

4.3 时间戳同步(Timestamp Sync)

时间戳同步解决的是“数据到达HAL层时,如何标记其采集时刻”的问题。AR系统依赖精确的时间戳来融合多Camera数据与IMU数据。HAL层需要将硬件事件(如SOF、EOF)映射到统一的系统时钟域。

时间戳同步架构(Timestamp Sync Architecture) 硬件层:Sensor + ISP + 硬件时间戳单元(HTU) HAL层:时间戳校正 + 时钟域转换 + 漂移补偿 框架层:CameraService / ARCore / ARKit 时间戳消费 HAL层负责将硬件时间戳(基于Sensor晶振)转换为系统CLOCK_MONOTONIC时间 并补偿晶振漂移(通常使用PTP或NTP同步算法)

4.3.1 时间戳同步的关键参数

参数 描述 AR系统要求
时间戳精度 时间戳与真实曝光中心的偏差 < 100 µs
时间戳抖动 连续帧时间戳间隔的方差 < 50 µs
跨Camera偏移 不同Camera同一帧的时间戳差异 < 1 µs
时钟漂移率 Sensor晶振与系统时钟的频率偏差 < 10 ppm
HAL实现要点:在camera3_stream_buffer的timestamp字段中,必须填写曝光中心时刻(Exposure Midpoint),而非帧结束时刻。AR算法依赖曝光中心时刻进行IMU插值。

4.4 硬件与软件同步的权衡

在实际AR产品中,纯硬件同步和纯软件同步是两个极端,大多数系统采用混合同步(Hybrid Sync)方案。HAL层设计者需要根据成本、功耗、延迟和灵活性做出权衡。

硬件 vs 软件同步权衡矩阵 硬件同步(Hardware Sync) ✓ 低延迟(< 1 µs) ✓ 低抖动(< 100 ns) ✓ 不占用CPU资源 ✗ 硬件成本高,灵活性差 软件同步(Software Sync) ✓ 无需额外硬件 ✓ 易于升级和调试 ✓ 支持异构Sensor组合 ✗ 延迟高(100 µs – 1 ms) 混合同步:硬件触发帧同步 + 软件补偿时间戳漂移 兼顾延迟、成本和灵活性 HAL层设计建议:帧同步和曝光同步走硬件路径,时间戳同步走软件路径(PTP/NTP校正)

4.4.1 权衡决策表

维度 硬件同步 软件同步 混合同步(推荐)
帧对齐精度 < 1 µs 10 – 100 µs < 5 µs
曝光对齐精度 < 1 µs 50 – 500 µs < 10 µs
时间戳精度 < 10 µs 100 µs – 1 ms < 50 µs
BOM成本增加 $2 – $5 $0 $0.5 – $1
开发复杂度 高 低 中
适用场景 高端AR头显、医疗 原型、低帧率AR 消费级AR眼镜、手机
关键权衡:在Android HAL3中,如果使用纯软件同步,必须注意process_capture_request的调用延迟。多个Camera的请求可能被Binder线程池随机调度,导致帧起始时间偏移。建议在HAL层内部维护一个同步请求队列(Sync Request Queue),确保所有Camera的请求在同一批次下发。

4.4.2 HAL层混合同步实现伪代码

// HAL层混合同步实现示意
void processSyncRequest(camera3_capture_request_t *requests[], int num_cameras) {
    // 1. 硬件同步:等待所有Camera的FSYNC信号
    waitForHardwareFSYNC(ALL_CAMERAS, timeout_ms=10);

    // 2. 软件同步:对齐曝光参数
    for (int i = 0; i < num_cameras; i++) {
        // 读取当前Camera的曝光配置
        uint32_t exposure_time = requests[i]->settings->exposure_time;
        // 强制所有Camera使用最长的曝光时间(保证同步窗口重叠)
        if (exposure_time < max_exposure) {
            requests[i]->settings->exposure_time = max_exposure;
        }
    }

    // 3. 下发硬件配置
    for (int i = 0; i < num_cameras; i++) {
        configureSensor(requests[i]->camera_id, requests[i]->settings);
    }

    // 4. 时间戳校正:在收到帧完成中断后,补偿时钟漂移
    for (int i = 0; i < num_cameras; i++) {
        uint64_t raw_timestamp = readHardwareTimestamp(camera_id);
        uint64_t corrected_timestamp = applyDriftCompensation(raw_timestamp, camera_id);
        // 写入buffer时间戳
        buffers[i]->timestamp = corrected_timestamp;
    }
}
工程经验:在混合同步方案中,硬件FSYNC信号应使用差分信号(如LVDS)传输,以抵抗PCB噪声。软件时间戳补偿算法建议使用卡尔曼滤波或滑动窗口平均,避免单帧漂移导致的时间戳跳变。