Synchronous Free Run (blaze)#
该功能的使用#
为什么使用 Synchronous Free Run#
如果要使用多台 blaze 相机拍摄同一场景,您必须错开各台相机的曝光,以免它们的光源相互干扰。与环境光一样,各台相机的光源也会导致图像质量下降。
使用 PTP,您可以让一组相机以 Synchronous Free Run 的方式拍摄图像,但要以精确的时间间隔和时间顺序连续进行曝光。这样,一台相机的光不会干扰另一台相机的测量。
运作原理#
有两种配置 Synchronous Free Run 的方法。为了帮助您确定最适合您的选择,在涉及图像采集时,您必须了解 blaze 相机的一般工作原理。
采集图像时,每个帧由八个子帧组成(如果 Fast Mode 已启用,则为 4 个子帧)。可以将每个子帧视为单独的曝光,因为在暴露每个子帧后,照明将关闭并且传感器将重置。
帧曝光阶段#
曝光期间分为以下几个阶段:
- 启动:触发帧时发生一次。
- 重置:传感器重置。这发生在每个子帧被获取之前。
- 曝光:快门打开,传感器曝光。每个子帧都会发生这种情况。
- 读出:从传感器读取子帧期间所收集的数据。
下图显示了帧曝光的不同阶段(仅显示了子帧 1、2 和 8)。
配置 Synchronous Free Run#
设置相机的 Synchronous Free Run 时,通过为相机指定不同的采集开始时间来对齐相机的采集。
有两种使用 Synchronous Free Run 的方法:
交错模式#
如果要同时操作两台 blaze 相机,请选择交错模式。在此模式下,第二台相机发光,而第一台相机执行传感器读取。
连续模式#
如果要同时操作两台以上的相机,则不能选择交错模式,因为第一台相机的读取时间不足以使两台或多台相机在传感器读取时间内执行其曝光周期。作为代替,您必须使用连续模式,在这种模式下,相机一台接一台地连续获取帧。
配置相机#
信息
blaze SDK 包含 SynchronousFreeRun C++ 示例,该示例演示了如何设置多台相机的 Synchronous Free Run,以及如何捕获图像数据并识别按时间顺序排在一起的帧。在该示例中,包含一些您可以将其集成到应用程序中的辅助函数和类(方法是通过将 PtpHelper.h 和 PtpHelper.cpp 文件添加到项目)。
本节介绍了使用伪代码将相机配置为 Synchronous Free Run 的示例方法。该过程可用于配置交错模式和连续模式。
使用的变量
t_start,n
:第 n 台相机的帧启动时长。t_reset,n
:第 n 台相机的重置时长(重置发生在每个子帧的开头)。t_exp,n
:针对单个子帧,第 n 台相机的 Exposure Time 时长。t_read,n
:针对单个子帧,第 n 台相机的读取时长。t_frame,n
:第 n 台相机获取一帧的所有子帧所需的总时间。
可以从相机中检索出实际值。下表列出了必须读出的参数名称:
变量 | 相机参数 |
---|---|
t_start,n | StartupTime |
t_reset,n | ResetTime |
t_exp,n | ExposureTime |
t_read,n | ReadoutTime |
t_frame,n | FrameDuration |
以下变量也会使用:
t_0
:当前 PTP Timestamp [ns]。f_max
:可能达到的最大帧速率 [Hz]。t_acq,n
:第 n 台相机的采集开始时间 [ns]。t_safety
:为了补偿抖动,应延迟采集的额外时间 [us]。推荐值:400 µs。n
:相机数量。
上面列出的所有相机参数返回的值均以微秒 (µs) 为单位。
各个采集的开始时间必须错开的时间长短取决于 Exposure Time 以及是否使用了交错式或连续式 Synchronous Free Run。在连续模式下,采集开始时间之间的偏移量还取决于是否启用 Fast Mode 参数。
采集开始时间应设置为将来的某个时间,以确保在您的应用程序配置完所有相机并设置采集循环之前,没有相机开始采集。您应该考虑花费大约 400 毫秒来配置一台相机。这种方法可确保按时间顺序排列在一起的所有帧都具有相同的帧号。
要配置相机(示例方法):
- 在每台相机上,通过将
EnablePtp
参数设置为true
来启用 PTP。 - 等到完成了主时钟选择并且时钟充分同步。
有关详细信息,请参见 Precision Time Protocol (blaze)。 -
在每台相机上,配置所需的
ExposureTime
和OperatingMode
。信息
将相机设置为交错式 Synchronous Free Run 模式时,必须在两台相机上设置相同的 Exposure Time 和工作模式。
-
计算可能达到的最大帧速率
f_max
,如下面所述。 -
在每台相机上,通过将
AcquisitionFrameRateEnable
参数设置为true
来指定固定的帧速率。通过将AcquisitionFrameRate
参数设置为等于或小于f_max
的值来指定所需的帧速率。信息
您必须在所有相机上指定相同的帧速率。
-
首先执行
TimestampLatch
命令,然后读出TimestampLatchValue
参数,从其中一台相机中检索当前 Timestampt_0
。 t_acq,1 = t_0 + n * 400 * 1e6
-
For i = 1 to n
- 将相机
i
的SyncFreeRunTimerStartTimeLow
参数设置为t_acq,i & 0xffffffff
。 - 将相机
i
的SyncFreeRunTimerStartTimeHigh
参数设置为t_acq,i >> 32
。 - 执行相机 i 的
SyncFreeRunTimerUpdate
命令。 - 通过将
SyncFreeRunEnable
参数设置为true
来启用相机 i 上的 Synchronous Free Run。 -
如果
i
小于n
:-
n == 2
,即交错模式:t_acq,i+1 = t_acq,i + 1000 * (t_safety + t_exp,i)
-
n > 2
,即连续模式:t_acq,i+1 = t_acq,i + 1000 * (t_safety + t_frame,i - t_read,i - t_start,i+1 - t_reset,i+1)
-
- 将相机
-
准备应用程序的采集循环。
- 在每台相机上,发出
StartAcquisition
命令。 - 采集每台相机的图像。
确定最大帧速率#
当使用连续式 Synchronous Free Run 时,每台相机的最大帧速率受相机数量和每台相机的帧时长限制。
当使用交错式 Synchronous Free Run 时,两台相机都能以可能达到的最大帧速率运行。
以下内容中,f_max,n
表示第 n 台相机的 AcquisitionFrameRate
参数的最大允许值。要使用 blaze SDK 的 API 为相机 i
读取 f_max,i
,可以使用以下代码片段:
C++
auto max = camera.GetParameter<GenApi::CFloatPtr>("AcquisitionFrameRate")->GetMax();
C#
var max = (double) camera.GetParameterMaximum("AcquisitionFrameRate");
交错模式#
交错模式下的最大帧速率 f_max
由 f_max,1
和 f_max,2
的较低值确定。
连续模式#
连续模式下的最大帧速率 f_max
可以通过以下步骤计算出:
f_minmax = min(f_max,1 , ... ,f_max,n)
t_total = 0
for i = 1 to n
t_total = t_total + t_frame,i - t_start,i - t_reset,i - t_read,i
t_total = t_total + t_start,1 + t_reset,1
f = 1e6 / t_total
f_max = min(f, f_minmax)