4. 软件触发与时间戳同步
在多相机实验成像系统中,硬件触发(如共用外触发信号)能提供纳秒级的同步精度,但并非所有相机都支持硬件触发,或者实验场景要求相机以不同时刻、不同曝光参数独立采集。此时,软件触发与时间戳同步就成为必要的补充手段。本节讨论如何通过API触发相机采集,利用系统时钟、PTP/NTP协议为每帧图像打上时间戳,并完成时间戳对齐与误差评估。
一、软件触发的API实现方式
主流工业相机厂商(Basler、FLIR、海康机器人、大恒图像等)均提供SDK,允许通过API以软件命令方式触发一次曝光。以Basler pylon SDK为例,典型流程如下:
// 伪代码示例:Basler pylon 软件触发
CInstantCamera camera(CTlFactory::GetInstance().CreateFirstDevice());
camera.Open();
camera.TriggerMode.SetValue(TriggerMode_On);
camera.TriggerSource.SetValue(TriggerSource_Software);
camera.StartGrabbing(GrabStrategy_OneByOne);
// 发送软件触发命令
camera.ExecuteSoftwareTrigger();
// 获取图像及时间戳
CGrabResultPtr ptrGrabResult;
camera.RetrieveResult(5000, ptrGrabResult, TimeoutHandling_ThrowException);
uint64_t ts = ptrGrabResult->GetTimeStamp();
不同厂商API的触发函数名不同(如FLIR Spinnaker为TriggerSoftware,海康MVS为MV_CC_TriggerSoftwareExecute),但核心逻辑一致:设置触发模式为On、触发源为Software,然后调用执行函数。软件触发的延迟通常在毫秒到数十毫秒量级,且受操作系统调度、USB/网口传输、SDK内部队列影响,因此软件触发本身不适合作为高精度同步手段,它的价值在于配合时间戳实现“事后对齐”。
二、系统时钟与时间戳来源
每帧图像的时间戳可能来自三个层级:
- 相机内部时钟:相机传感器曝光时刻由内部晶振计数,精度高但各相机独立,长时间运行会漂移。
- 主机系统时钟:SDK在接收到图像时读取主机
QueryPerformanceCounter或clock_gettime,受传输延迟影响,时间戳滞后于真实曝光时刻。 - 外部统一时钟:通过PTP(IEEE 1588)或NTP将各设备时钟同步到同一时间基准,相机或主机时间戳均映射到该基准。
实际工程中,若相机支持PTP,应优先启用相机端PTP并让相机在曝光时刻打硬件时间戳;若相机不支持PTP,则退而求其次,在主机端接收图像时打时间戳,并通过NTP保证各主机时钟一致。
三、PTP与NTP的适用场景
NTP(Network Time Protocol)通常能达到毫秒级同步精度(局域网内1~10 ms),实现简单,适合对同步要求不苛刻的多主机场景。PTP(Precision Time Protocol)在支持硬件时间戳的网卡和交换机配合下,可达亚微秒甚至纳秒级精度,是机器视觉、运动控制领域的首选。
启用PTP的典型步骤(以Linux为例):
# 查看网卡是否支持硬件时间戳
ethtool -T eth0
# 安装并启动ptp4l与phc2sys
sudo ptp4l -i eth0 -m -s
sudo phc2sys -s eth0 -c CLOCK_REALTIME -w
相机端需在SDK中启用PTP并等待状态变为Slave或Master,确认PtpStatus为Ready后再开始采集。若PTP未锁定就采集,时间戳将不可信。
四、时间戳对齐方法
假设有两台相机A和B,各自输出带时间戳的帧序列。对齐的目标是找到同一物理时刻在两组序列中的对应帧。常用方法有两种:
- 最近邻匹配:对A的每一帧时间戳,在B中查找时间差最小的帧。适用于帧率较高、事件稀疏的场景。
- 插值对齐:若相机输出的是帧起始时间戳,而实际曝光中心时刻需要加上半曝光时间,则先修正为曝光中心时刻,再按时间轴线性插值。适用于需要连续轨迹分析的场景。
对齐前必须统一时间基准。若A用PTP时间、B用主机NTP时间,需先通过phc2sys或时间偏移量将两者归算到同一时钟域。
五、误差评估指标
同步误差评估通常关注以下指标:
| 指标 | 含义 | 典型目标 |
|---|---|---|
| 时间戳偏差 | 同一事件在两相机时间戳之差 | < 1 ms(NTP)/ < 100 μs(PTP) |
| 抖动(Jitter) | 偏差的标准差 | < 200 μs |
| 漂移(Drift) | 长时间运行后偏差的累积变化 | < 1 ms/h |
| 丢帧率 | 触发后未成功采集的帧比例 | < 0.1% |
评估方法:使用LED闪烁或运动靶标作为共同事件,记录两相机时间戳,计算偏差序列的均值、标准差和随时间的变化趋势。若偏差均值稳定但标准差大,说明触发抖动大;若均值随时间线性增长,说明时钟漂移未补偿。
六、典型配置示例
以下是一个双相机软件触发+时间戳同步的配置清单,供参考:
| 项目 | 配置 |
|---|---|
| 相机型号 | Basler acA1920-40gc × 2 |
| 触发方式 | 软件触发,由主机统一发送 |
| 时间同步 | PTP(主时钟为交换机) |
| 时间戳来源 | 相机端硬件时间戳(PTP时间) |
| 曝光时间 | 5000 μs |
| 帧率 | 10 fps |
| 对齐方法 | 曝光中心时刻最近邻匹配 |
| 误差目标 | 偏差 < 200 μs,抖动 < 100 μs |
在该配置下,主机通过API依次向两台相机发送软件触发命令,命令间隔约50 μs(受主机调度影响)。由于PTP已将两相机时钟同步到同一基准,每帧图像携带的硬件时间戳可直接比较。若发现偏差超过目标,应检查PTP锁定状态、网络交换机是否支持透明时钟、以及相机固件是否开启硬件时间戳功能。
总结来说,软件触发与时间戳同步的核心在于:用API触发解决“何时采集”的问题,用PTP/NTP解决“时钟一致”的问题,用时间戳对齐解决“帧对应”的问题,最后用偏差、抖动、漂移三个指标评估同步质量。四者缺一不可,共同构成软件同步的完整闭环。