4. 双摄同步机制
双摄融合,说白了就是让两颗摄像头同时看同一个东西,然后把它们看到的信息合并起来。但这里有个核心问题——如果两颗摄像头拍的不是同一时刻的画面,那融合出来的结果就是“鬼影重重”。
我刚开始做双摄项目时,就吃过这个亏。当时画面总是有重影,排查了三天,最后发现是帧同步没做好。主摄和副摄差了半帧时间,运动物体就糊了。嗯,从那以后,我每次搭建双摄系统,第一件事就是检查同步机制。
4.1 帧同步的硬件原理
先说说硬件层面。双摄帧同步,核心就是让两颗 sensor 在同一时刻开始曝光、同一时刻结束曝光。高通平台通常用两种硬件方案:
- 硬件触发模式(HW Trigger):主摄输出 VSYNC 信号给副摄,副摄跟着主摄的节奏走。这种方案延迟最低,精度最高。
- 主从模式(Master-Slave):主摄作为 Master,副摄作为 Slave,共用同一个 MCLK 和 VSYNC。我习惯用这种,配置简单,稳定性好。
关键指标:帧同步精度通常要求在 ±1 行(Line)以内。超过这个范围,运动物体的边缘就会出现明显的颜色分离。
高通平台在硬件层面提供了 CAM_SYNC 模块,专门处理多摄同步。它支持两种模式:
| 模式 | 延迟 | 适用场景 | 我踩过的坑 |
|---|---|---|---|
| HW Trigger | < 1 行 | 高精度融合、HDR | 信号线走线过长会导致抖动 |
| Master-Slave | < 3 行 | 普通双摄、景深 | MCLK 分频不对会丢帧 |
4.2 软件同步策略
硬件搞定了,软件层面还得做一层保障。毕竟硬件信号也可能受干扰,或者 sensor 的启动时间有差异。我常用的软件同步策略有两种:
4.2.1 基于时间戳的同步
每个 frame 都打上硬件时间戳,然后在 ISP 或算法层做对齐。这种方案灵活,但依赖时间戳的精度。
- 优点:不依赖硬件连线,适合不同型号的 sensor 混搭。
- 缺点:时间戳精度不够的话,误差会累积。我曾经遇到过 sensor 驱动里时间戳取的是软件时间,结果两个 sensor 的时钟漂移不一样,越差越多。
我的习惯:时间戳一定要用硬件 SOF(Start of Frame)信号触发,别用软件打戳。软件打戳的误差通常在毫秒级,而硬件 SOF 可以做到微秒级。
4.2.2 基于 VSYNC 的同步
这是最直接的方式。主摄的 VSYNC 信号直接控制副摄的曝光开始时间。高通平台里,可以通过 CAM_SYNC 模块配置 VSYNC 的相位对齐。
// 伪代码:VSYNC 同步配置
cam_sync_config_t sync_cfg;
sync_cfg.master_sensor = CAM_SENSOR_ID_MAIN;
sync_cfg.slave_sensor = CAM_SENSOR_ID_AUX;
sync_cfg.sync_mode = CAM_SYNC_MODE_VSYNC;
sync_cfg.phase_offset = 0; // 相位偏移,单位:行
cam_sync_configure(&sync_cfg);
这里有个细节:phase_offset 可以微调。如果两颗 sensor 的曝光时间不一样,可以通过这个参数让副摄提前或延迟几行开始曝光。
4.3 高通双摄同步配置:SensorMode 选择
高通平台里,每个 sensor 都有多个 SensorMode。不同 mode 的帧率、分辨率、HDR 模式都不一样。双摄同步时,必须保证两颗 sensor 的 SensorMode 兼容。
我一般遵循这几个原则:
- 帧率必须一致:主摄 30fps,副摄也得 30fps。否则同步逻辑会乱。
- 曝光时间要匹配:如果主摄曝光 20ms,副摄曝光 30ms,那副摄的 VSYNC 要提前触发。
- HDR 模式要统一:一个开 HDR,一个不开,融合出来的亮度就不对。
| 参数 | 主摄(IMX586) | 副摄(IMX350) | 说明 |
|---|---|---|---|
| SensorMode | MODE_4K_30FPS | MODE_1080P_30FPS | 帧率一致,分辨率可以不同 |
| 曝光时间 | 16.67ms | 16.67ms | 必须相同,否则运动模糊 |
| HDR 模式 | OFF | OFF | 统一关闭,避免融合异常 |
注意:不同 SensorMode 的 PCLK 可能不同。如果 PCLK 不一致,VSYNC 的相位对齐会失效。我曾经在项目里遇到过,主摄用 4K mode,副摄用 1080P mode,结果 PCLK 差了一倍,同步信号完全对不上。
4.4 同步抖动问题排查
同步抖动,说白了就是两颗 sensor 的帧边界在来回晃动。表现就是画面一会儿对齐,一会儿错位。我总结了一套排查流程:
- 抓 VSYNC 波形:用示波器同时抓主摄和副摄的 VSYNC 信号。看上升沿是否对齐。如果抖动超过 1 行,说明硬件同步有问题。
- 检查 MCLK:两颗 sensor 的 MCLK 必须来自同一个时钟源。如果用了不同的 PLL,频率漂移会导致同步抖动。
- 看驱动日志:高通驱动会打印
cam_sync的状态。搜索sync_jitter关键字,看有没有报错。 - 软件补偿:如果硬件抖动无法完全消除,可以在算法层做动态对齐。我习惯用互相关算法,计算两帧图像的行偏移,然后做裁剪对齐。
我曾经遇到过一个奇葩问题:副摄的 VSYNC 信号被 PCB 上的其他信号干扰了,导致每隔几帧就跳变一次。最后在 VSYNC 线上加了一个 100pF 的电容滤波,问题就解决了。嗯,硬件问题有时候就是这么简单粗暴。
4.5 双摄同步知识体系
下面这张图是我自己整理的,涵盖了双摄同步的核心模块和流程。你可以把它当作排查问题的地图:
这张图把双摄同步分成了三个层次:硬件层、软件层、排查层。每个层次都有对应的技术点和工具。你想想看,如果硬件同步没做好,软件再怎么补偿也是治标不治本。所以我的建议是:先搞定硬件同步,再用软件做兜底。