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 兼容。

我一般遵循这几个原则:

  1. 帧率必须一致:主摄 30fps,副摄也得 30fps。否则同步逻辑会乱。
  2. 曝光时间要匹配:如果主摄曝光 20ms,副摄曝光 30ms,那副摄的 VSYNC 要提前触发。
  3. 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 的帧边界在来回晃动。表现就是画面一会儿对齐,一会儿错位。我总结了一套排查流程:

  1. 抓 VSYNC 波形:用示波器同时抓主摄和副摄的 VSYNC 信号。看上升沿是否对齐。如果抖动超过 1 行,说明硬件同步有问题。
  2. 检查 MCLK:两颗 sensor 的 MCLK 必须来自同一个时钟源。如果用了不同的 PLL,频率漂移会导致同步抖动。
  3. 看驱动日志:高通驱动会打印 cam_sync 的状态。搜索 sync_jitter 关键字,看有没有报错。
  4. 软件补偿:如果硬件抖动无法完全消除,可以在算法层做动态对齐。我习惯用互相关算法,计算两帧图像的行偏移,然后做裁剪对齐。

我曾经遇到过一个奇葩问题:副摄的 VSYNC 信号被 PCB 上的其他信号干扰了,导致每隔几帧就跳变一次。最后在 VSYNC 线上加了一个 100pF 的电容滤波,问题就解决了。嗯,硬件问题有时候就是这么简单粗暴。

4.5 双摄同步知识体系

下面这张图是我自己整理的,涵盖了双摄同步的核心模块和流程。你可以把它当作排查问题的地图:

双摄同步知识体系 双摄同步知识体系 硬件同步 HW Trigger Master-Slave CAM_SYNC 模块 软件同步 时间戳对齐 VSYNC 相位对齐 SensorMode 匹配 抖动排查 VSYNC 波形抓取 MCLK 时钟检查 驱动日志分析 核心原则:硬件同步保证精度,软件同步保证鲁棒性 排查时从硬件到软件,逐层定位 硬件配置 软件对齐 验证测试 上线部署

这张图把双摄同步分成了三个层次:硬件层、软件层、排查层。每个层次都有对应的技术点和工具。你想想看,如果硬件同步没做好,软件再怎么补偿也是治标不治本。所以我的建议是:先搞定硬件同步,再用软件做兜底。