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 三种同步机制的协同关系
这三种同步机制不是互斥的,而是互补的。我通常这样组合使用:
- 触发同步:用 PWM 或 GPIO 让所有摄像头同时开始曝光
- 帧同步:用 FSYNC 或 VSYNC 对齐输出时序
- 时钟同步:用 PTP 给每一帧打上统一的时间戳
下面这张图展示了三者的关系:
2.5 避坑指南
最后,分享几个我在项目中踩过的坑:
- 触发信号不要共用同一个 GPIO 引脚直接并联——信号反射会导致触发抖动。用缓冲器或分配器。
- VSYNC 不能代替曝光同步——曝光结束到 VSYNC 产生之间有读出延迟,不同 sensor 的读出时间可能不同。
- PTP 的精度受网络拓扑影响——交换机必须支持 1588 透明时钟,否则精度会下降一个数量级。
- 晶振老化会导致时钟漂移——即使做了 PTP 同步,长期运行后还是会有偏差。建议定期重新同步。
我曾经犯过一个低级错误:用同一个 PWM 信号触发 8 个摄像头,结果发现第 5 个摄像头总是丢帧。查了三天,最后发现是 PWM 信号的驱动能力不够——8 个摄像头的输入电容加起来太大,导致上升沿变缓,触发阈值没达到。后来加了一个缓冲器,问题解决。
嗯,硬件同步这块,说白了就是「信号完整性 + 时序对齐 + 时钟统一」。这三件事做好了,多摄像头同步采集就成功了一大半。