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),否则会导致多视图之间的像素级错位。
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的曝光起始时间和曝光时长。
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)映射到统一的系统时钟域。
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层设计者需要根据成本、功耗、延迟和灵活性做出权衡。
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噪声。软件时间戳补偿算法建议使用卡尔曼滤波或滑动窗口平均,避免单帧漂移导致的时间戳跳变。