4. 多摄像头同步与触发机制

在 Jacinto 多摄像头系统中,“同步”并不是一个单一动作,而是贯穿传感器曝光、串行器/解串器链路、CSI-2 接收、ISP 处理到时间戳落盘的全链路约束。若只把多路视频接进系统而不做同步,常见现象是:四路画面在静态场景下看似一致,一旦拍摄旋转风扇、车轮或 LED 频闪,各路之间就会出现固定或漂移的相位差;录制文件回放时,同一时刻的多路画面无法对齐,拼接、环视或目标融合算法随之失效。因此,本节围绕硬件同步、软件同步、PPS 触发和时间戳对齐四条主线展开,并给出可实测的调试方法。

一、同步的层次与误差来源

先明确参照约定:本文所有“同步误差”均指各路摄像头曝光起始时刻相对同一参考时刻的偏差,单位为微秒或毫秒,正值表示该路晚于参考。误差主要来自四层:

  • 传感器内部时序:不同型号 sensor 的帧起始、行曝光、内部 PLL 分频不同,自由运行时帧率存在 ppm 级差异。
  • 触发链路延迟:外部触发信号经电平转换、串行器 GPIO、解串器转发到 sensor 的路径延迟不一致。
  • CSI-2 与接收端:多路虚拟通道复用、帧起始包到达顺序、DMA 写入时刻存在抖动。
  • 软件时间戳:驱动在中断或工作队列中打时间戳,受调度延迟影响,抖动可达数百微秒到数毫秒。

因此,同步设计的目标不是“零误差”,而是把误差压到应用可接受范围,并让残余误差可测量、可补偿、可复现。

二、硬件同步:主从触发与外部 PPS

硬件同步的核心是让所有 sensor 的曝光起点由同一个物理信号决定。Jacinto 平台常见两种接法:

主从模式:选一路 sensor 作为主,输出其帧同步信号(FSYNC/VSYNC),经解串器或板级走线分发到其余 sensor 的触发输入。优点是无需额外时钟源,缺点是主 sensor 的帧率抖动会直接传递到所有从 sensor。

外部 PPS 触发:由 SoC 的定时器或外部 GPS/时钟模块产生 1 Hz 或更高频率的 PPS(Pulse Per Second),同时送入所有 sensor 的触发引脚。PPS 的上升沿定义“曝光起点”,各路 sensor 在收到边沿后按各自配置的曝光时间开始积分。这种方式把同步基准从某一路 sensor 转移到独立时钟源,长期稳定性更好,也便于与整车其他传感器(雷达、激光雷达)对齐。

配置时需注意:sensor 必须工作在外部触发从模式(如 TI DS90UB 系列解串器配合的 sensor 常通过寄存器设置 trigger mode),否则内部自由运行会忽略外部脉冲。同时要确认触发极性、脉宽满足 sensor 数据手册要求,例如脉宽过窄会导致部分帧丢失。

多摄像头硬件同步与时间戳对齐链路 PPS / 外部时钟源 1 Hz 上升沿基准 触发分发 电平转换 / 缓冲 Sensor 0 从模式触发 Sensor 1 从模式触发 Sensor 2 从模式触发 Sensor 3 从模式触发 Jacinto SoC CSI-2 接收 ISP / DMA 时间戳打标 统一时间戳 帧号 + 曝光起点 触发时序关系(示意) PPS↑ Sensor0 曝光 Sensor1 曝光 Sensor2 曝光 Sensor3 曝光 Δt 为各路触发路径延迟差

三、软件同步:适用边界与实现方式

软件同步不依赖外部触发线,而是通过驱动或应用层让各路 sensor 在时间上“尽量靠近”地启动。常见做法是:在同一个线程中依次调用各路的流开启接口,或使用 V4L2 的 VIDIOC_STREAMON 批量提交。其同步精度取决于调用间隔和 sensor 内部自由运行相位,通常只能做到毫秒级,且会随温度、帧率漂移而缓慢变化。

软件同步适合对时间对齐要求不高的场景,例如低速环视预览、非实时记录。若用于目标融合或高速拼接,必须配合时间戳对齐做后处理补偿。一个实用技巧是:在开启流之前先读取各路 sensor 的当前帧计数或时间基准,记录启动瞬间的相位差,后续用该差值做固定偏移补偿,可把残余误差从毫秒级降到百微秒级。

四、多路视频流时间戳对齐方法

时间戳对齐的目标是:给定任意一路的某一帧,能知道它在统一时间轴上的曝光起点,从而找到其他路最接近的帧。实现分三步:

  1. 统一时间基准:所有时间戳必须来自同一个单调时钟,例如 Linux 的 CLOCK_MONOTONIC 或 Jacinto 的全局定时器。禁止混用不同时钟源,否则会出现无法解释的跳变。
  2. 帧级打标:在 CSI-2 接收中断或 DMA 完成回调中记录硬件时间戳,而不是在用户态读取。若硬件支持帧起始时间戳寄存器,优先读取该寄存器;否则用中断到达时刻近似,并记录中断延迟分布。
  3. 帧匹配:以某一路为参考,对其他路按时间戳做最近邻匹配。若帧率相同且同步良好,通常是一对一;若存在丢帧,则允许跳过或重复,并记录匹配质量。

下面给出一个可参考的时间戳对齐伪代码,用于说明帧匹配逻辑:

# 假设四路时间戳已按单调时钟排序
ref_ts = cam0_ts
for cam in [cam1, cam2, cam3]:
    idx = argmin(abs(cam_ts - ref_ts))
    matched[cam] = cam_frames[idx]
    offset[cam] = cam_ts[idx] - ref_ts
    if abs(offset[cam]) > MAX_TOLERANCE:
        log_warning("cam %d offset %d us exceeds tolerance" % (cam, offset[cam]))

其中 MAX_TOLERANCE 需根据应用设定。例如 30 fps 下帧间隔约 33.3 ms,若要求对齐误差小于半帧,可设 8 ms;若用于高精度融合,可收紧到 1 ms 并配合硬件触发。

五、实测调试:如何观察与判断同步质量

同步调试不能只看“画面是否同时出现”,而要用可量化的方法。推荐以下实测流程:

  • LED 频闪法:用已知频率的 LED 闪烁源同时照射所有摄像头,录制后逐帧查看亮暗切换时刻。若各路切换帧号一致,说明帧级同步良好;若存在固定帧差,记录该差值作为补偿量。
  • 时间戳统计:连续采集 1000 帧,统计各路时间戳差值的均值、标准差和最大值。均值反映固定偏移,标准差反映抖动,最大值用于判断是否偶发丢帧。
  • 触发信号示波器观测:用示波器同时抓取 PPS 上升沿和各 sensor 触发引脚波形,直接测量路径延迟差。这是定位硬件同步问题最直接的手段。
  • 回放对齐检查:将四路视频按时间戳对齐后合成,观察运动物体边缘是否重影。若重影随速度增加而增大,说明时间对齐仍有残余误差。
调试时建议先固定曝光时间和增益,避免自动曝光算法改变帧起始相位,干扰同步判断。待同步稳定后再开启自动曝光,并观察时间戳抖动是否仍在可接受范围。
若发现某一路时间戳周期性跳变,优先检查该路 CSI-2 虚拟通道是否与其他路冲突,以及解串器是否出现链路重训练。链路重训练会导致该路短暂丢帧,时间戳出现空洞,进而破坏帧匹配。

综合来看,硬件同步解决“曝光起点一致”,软件同步解决“启动时刻接近”,PPS 触发提供“长期稳定基准”,时间戳对齐则把残余误差变成可计算、可补偿的数据。四者配合,才能让 Jacinto 多摄像头系统在环视、融合和记录回放中保持可靠的时间一致性。