2. 硬件同步机制:硬件触发、帧同步信号与时钟同步

多摄像头同步,说白了就是让多个摄像头在同一个时间点开始曝光,并且以相同的节奏输出每一帧。软件同步精度通常在毫秒级,对于高速运动场景根本不够用。所以,真正的工业级方案,必须依赖硬件同步。

我个人习惯把硬件同步分成三个层次:触发同步、帧同步、时钟同步。下面一个一个说。

2.1 硬件触发:GPIO 与 PWM

硬件触发是最直接的同步方式。主控通过一根信号线,告诉所有摄像头:「现在,开始曝光!」

2.1.1 GPIO 触发

GPIO 触发就是拉高或拉低一个电平。我常用的接法是:主控的 GPIO 输出连接到所有摄像头的 TRIGGER 引脚。当 GPIO 从低变高(上升沿),摄像头开始曝光。

关键参数:

  • 触发脉宽:一般需要 5~50 μs,具体看 sensor 手册
  • 触发延迟:从 GPIO 电平变化到 sensor 实际开始曝光,通常有 1~2 个像素时钟的延迟
  • 抖动(Jitter):GPIO 中断响应时间一般在 1~10 μs,软件触发会更大

我在项目中遇到过一个问题:用 GPIO 同时触发 6 个摄像头,结果发现第 3 个摄像头总是晚 2 行才开始曝光。查了半天,原来是 PCB 走线长度不一样,信号传播时间差导致的。后来我强制要求所有触发信号走等长布线,问题就解决了。

2.1.2 PWM 触发

PWM 触发适合需要连续周期性采集的场景。比如你要以 30 FPS 采集,就用一个 30 Hz 的 PWM 信号,占空比 50%,上升沿触发曝光。

为什么用 PWM 而不是 GPIO 定时翻转?因为 PWM 是硬件产生的,不占用 CPU 资源,而且抖动极小(纳秒级)。

触发方式 精度 CPU 占用 适用场景
GPIO 软件翻转 毫秒级 高 调试、单次采集
GPIO 硬件定时器 微秒级 低 多摄像头同步触发
PWM 硬件输出 纳秒级 无 高速连续采集

我的经验:如果摄像头数量超过 4 个,建议用专用的触发信号分配器(比如 TI 的 TCA9548A),而不是直接并联。直接并联会导致信号反射,触发波形变差。

2.2 帧同步信号:VSYNC / FSYNC

触发信号让摄像头同时开始曝光,但曝光结束后,每个摄像头输出帧的时间可能不一样。为什么?因为 sensor 内部的行扫描时间、PLL 锁定时间有差异。

这时候就需要帧同步信号来对齐输出。

2.2.1 VSYNC(垂直同步)

VSYNC 是摄像头输出的帧起始信号。每个摄像头在开始输出一帧图像数据时,会拉高 VSYNC 引脚。主控通过检测所有摄像头的 VSYNC 上升沿,来判断它们是否同步。

我见过一个典型的坑:两个型号相同的摄像头,VSYNC 的相位差竟然有 3 行。原因是 sensor 内部的帧计数器复位时间不一致。解决办法是:在触发信号之后,等待所有摄像头的 VSYNC 都出现,然后以第一个出现的 VSYNC 为基准,丢弃后续的帧,直到所有摄像头对齐。

注意:VSYNC 只是「输出同步」的信号,不代表「曝光同步」。曝光结束到 VSYNC 产生之间,还有读出时间。如果你需要精确的曝光同步,必须用触发信号 + 曝光时间控制,不能只看 VSYNC。

2.2.2 FSYNC(帧同步)

FSYNC 是输入信号,用来强制摄像头在特定时刻开始输出帧。有些高端 sensor(比如 Sony IMX 系列)支持 FSYNC 模式:主控给所有摄像头发送同一个 FSYNC 脉冲,摄像头会在下一个帧周期开始时,统一输出帧数据。

FSYNC 的好处是:不需要主控去「等」每个摄像头的 VSYNC,而是让摄像头主动对齐到同一个外部时钟上。

FSYNC 与 VSYNC 的区别:

  • VSYNC:摄像头输出给主控的信号,表示「我开始输出了」
  • FSYNC:主控输出给摄像头的信号,表示「你现在开始输出」

2.3 时钟同步:PTP / IEEE 1588

触发和帧同步解决了「同时曝光」和「同时输出」的问题。但如果你需要给每一帧打上精确的时间戳(比如在自动驾驶中,需要知道每个摄像头看到某个物体的精确时间),那就需要时钟同步。

2.3.1 为什么需要时钟同步?

每个摄像头都有自己的晶振,晶振的频率误差一般在 ±50 ppm 左右。两个摄像头运行 1 小时后,时间差可能达到 180 毫秒。对于 30 FPS 的采集,这相当于 5 帧的偏差。

你想想看,如果两个摄像头的时间戳差了 5 帧,融合算法根本没法做。

2.3.2 PTP 的工作原理

PTP(Precision Time Protocol,IEEE 1588)通过网络在主时钟和从时钟之间交换同步报文,计算出网络延迟和时间偏移,然后调整从时钟。

PTP 的精度取决于硬件支持程度:

PTP 模式 精度 硬件要求
软件 PTP 100 μs ~ 1 ms 普通网卡
硬件 PTP() 亚微秒级 支持 1588 的 PHY

我在一个车载项目中用过 (IEEE 802.1AS),6 个摄像头通过交换机连接,最终时钟同步精度在 ±200 ns 以内。这个精度足够给每一帧打上纳秒级的时间戳。

我的建议:如果摄像头通过以太网传输,优先选择支持 的摄像头模组。如果用的是 MIPI 接口的摄像头,可以用 FPGA 实现一个简单的 PTP 从时钟,或者用专用的时钟同步芯片(如 ADI 的 AD9548)。

2.4 三种同步机制的协同关系

这三种同步机制不是互斥的,而是互补的。我通常这样组合使用:

  1. 触发同步:用 PWM 或 GPIO 让所有摄像头同时开始曝光
  2. 帧同步:用 FSYNC 或 VSYNC 对齐输出时序
  3. 时钟同步:用 PTP 给每一帧打上统一的时间戳

下面这张图展示了三者的关系:

硬件同步三层架构 第一层:触发同步 GPIO / PWM 信号 → 所有摄像头同时开始曝光 精度:纳秒级(PWM)~ 微秒级(GPIO) 第二层:帧同步 VSYNC / FSYNC 信号 → 对齐帧输出时序 精度:行级(微秒级) 第三层:时钟同步 PTP / IEEE 1588 → 统一时间基准,打时间戳 精度:亚微秒级(硬件 PTP) 三层叠加使用,才能实现真正的多摄像头帧级同步

2.5 避坑指南

最后,分享几个我在项目中踩过的坑:

  • 触发信号不要共用同一个 GPIO 引脚直接并联——信号反射会导致触发抖动。用缓冲器或分配器。
  • VSYNC 不能代替曝光同步——曝光结束到 VSYNC 产生之间有读出延迟,不同 sensor 的读出时间可能不同。
  • PTP 的精度受网络拓扑影响——交换机必须支持 1588 透明时钟,否则精度会下降一个数量级。
  • 晶振老化会导致时钟漂移——即使做了 PTP 同步,长期运行后还是会有偏差。建议定期重新同步。

我曾经犯过一个低级错误:用同一个 PWM 信号触发 8 个摄像头,结果发现第 5 个摄像头总是丢帧。查了三天,最后发现是 PWM 信号的驱动能力不够——8 个摄像头的输入电容加起来太大,导致上升沿变缓,触发阈值没达到。后来加了一个缓冲器,问题解决。

嗯,硬件同步这块,说白了就是「信号完整性 + 时序对齐 + 时钟统一」。这三件事做好了,多摄像头同步采集就成功了一大半。