Synchronous Free Run (blaze)#
使用功能#
為什麼要使用 Synchronous Free Run#
如果您想使用多部 blaze 相機來擷取相同的場景,則必須錯開各部相機的曝光時間,以免其光源互相干擾。與環境光類似,各部相機的光源也會導致影像 Quality 下降。
透過使用 PTP,您可以讓一組相機以 synchronous free run 擷取影像,但其曝光會以精確的時間對齊間隔依序且按時間順序開始。如此一來,一部相機的光線就不會干擾其他相機的量測。
運作原理#
配置 synchronous free run 有兩種方式。為了協助您決定哪種選項最適合您,您必須了解 blaze 相機在影像擷取方面的一般運作原理。
在擷取影像時,每個影格由八個子影格組成(若啟用了 Fast Mode 則為 4 個子影格)。每個子影格都可以視為獨立的曝光,因為在曝光每個子影格之後,照明會關閉且感光元件會重設。
張影格曝光階段#
在曝光期間,會依序進行下列階段:
- 啟動:這發生在第一和第五個子影格之前。
- 重設:感光元件會重設。這發生在擷取每個子影格之前。
- 曝光:快門開啟且感光元件受光。這發生在每個子影格。
- 讀出:在子影格期間收集的資料會從感光元件讀出。
相機僅在曝光階段發出光線。
下圖顯示影格曝光的不同階段(僅顯示子影格 1、2 和 8)。
Synchronous Free Run#
以 free run 模式操作相機,表示相機使用內部週期性觸發 Timer 來自行觸發。
在 synchronous free run 模式中,相機時脈會使用 PTP 進行同步。同步的時脈也會使內部觸發 Timer 同步。
為 synchronous free run 設定相機時,可以透過為相機指定各自的擷取開始時間來對齊相機的擷取作業。一旦達到相機的擷取開始時間(由 SyncFreeRunTimerStartTimeHigh 進行明確的生命週期管理即呼叫 SyncFreeRunTimerStartTimeLow 參數指定),就會啟動內部觸發 Timer,且相機將以固定的張影格速率擷取資料。
資訊
您可以設定過去的時間作為開始時間。這種情況的處理方式就如同內部 Timer 在過去已啟動一樣。
資訊
相機不會開始擷取,直到 AcquisitionStart 已發出 command。
同步 blaze 和 ace/ace 2 相機
- 如果您的應用程式設定包含 ace 相機,則啟動時間必須是不久後的將來。
- 如果您的應用程式設定包含 ace 2 相機,則 blaze 相機的啟動時間必須為 0。
使用 Synchronous Free Run 有兩種方式:
交錯模式#
如果您想同時操作兩台 blaze 相機,請選擇 interleaved 模式。在此模式下,一台相機發射光線,同時另一台相機執行 sensor readout。
資訊
相機的 sensor timing 必須完全相同,也就是說,您必須為以下項目設定相同的數值: ExposureTime, FastMode以及 HDRMode 參數。
Sensor timing 也取決於 Sensor Readout Time,您無法變更此時間,因為它是感光元件的 Property。不過,Sensor Readout Time 可能會因相機的硬體修訂版而異。如果是這種情況,請改用 consecutive 模式。
連續模式#
在大多數情況下,在 interleaved 模式下操作兩台以上的相機並不實際。由於網路封包相繼發送的時間非常接近,您很可能會遇到網路封包遺失,進而導致擷取的資料不完整。為了獲得更好的結果,請使用 consecutive 模式,讓相機依序連續擷取畫面。
如果您想同時操作具有不同 sensor timing 的多台相機,也必須使用此模式。
為了將可達到的 frame rate 最大化,可以將相機的 Acquisition Start 時間設定在前一台相機的 readout 階段內。
設定相機#
資訊
pylon Supplementary Package for blaze 包含 MultiCamHelper C++ 程式庫。此程式庫是 C++ 範例集合的一部分,位於 MultiCam/MultiCamHelper 資料夾中。
此程式庫提供 BlazeSynchronousFreeRunHelper 類別,Basler 建議使用此類別來設定多台 blaze 相機進行 Synchronous Free Run、擷取資料以及配對在時間上屬於同一時間點的畫面。如何使用此類別顯示於 SynchronousFreeRun C++ 範例中。
MultiCamHelper 程式庫也提供 GenericSynchronousFreeRunHelper 類別,如果您想同步 blaze 和 2D GigE 相機,這會非常有用。Multicam/ColorAndDepth 資料夾中的範例展示了如何使用此類別。
如果您使用的是 C++ 以外的程式語言,或者您不想使用 MultiCamHelper 程式庫提供的類別,本節將說明為 Synchronous Free Run 設定相機的程序。此程序可用於設定 interleaved 和 consecutive 模式。
使用的變數#
t_startup[i]:第 i 台相機的 frame startup 時間持續時間。t_reset[i]:第 i 台相機的 reset 時間持續時間(reset 發生在每個子畫面的開頭)。t_exp[i]:單一子畫面之第 i 台相機的 Exposure Time持續時間。t_read[i]:單一子畫面之第 i 台相機的 Sensor Readout Time持續時間。t_frame[i]:第 i 台相機擷取畫面所有子畫面所需的總時間。
實際數值可以從相機中讀取。下表列出了您必須讀取的參數名稱:
| Variable | 相機參數 |
|---|---|
t_startup | StartupTime |
t_reset | ResetTime |
t_exp | ExposureTime |
t_read | ReadoutTime |
t_frame | FrameDuration |
上述所有相機參數傳回的數值單位均為微秒 (µs)。
若要設定相機並啟動 Synchronous Free Run:
-
在每台相機上,啟用 PTP,並等待主時脈選擇完成且時脈已充分同步。
如需詳細資訊,請參閱 Precision Time Protocol (blaze)。 -
在每台相機上,設定所需的
ExposureTime,FastMode以及HDRMode.資訊
為交錯式 Synchronous Free Run 模式設定相機時,您必須為以下項目設定相同的數值:
ExposureTime,FastMode以及HDRMode. -
計算最大可能的畫面播放速率
fps_max如所述 下方. -
在每台相機上,設定
AcquisitionFrameRateEnable參數設為true透過設定以下項目來指定所需的畫面播放速率:AcquisitionFrameRate參數設為小於或等於的數值fps_max.資訊
您必須在所有相機上指定相同的畫面播放速率。
-
針對每台相機,計算所需的觸發偏移量,並如下方所述設定產生的 Acquisition Start 時間。
-
準備應用程式的擷取迴圈。
-
在每台相機上,發出
StartAcquisition指令。 -
從每台相機擷取影像。
決定最大張影格速率#
當使用連續式 Synchronous Free Run 時,每台相機的最大畫面播放速率會受到相機數量和每台相機畫面持續時間的限制。
當使用交錯式 Synchronous Free Run 時,相機可以最高可能的畫面播放速率運行。
在下文中, fps_max[i] 表示第 i 台相機的允許最大值 AcquisitionFrameRate 參數。若要讀取 fps_max[i] 以了解 相機 i 使用 pylon SDK 的 API,您可以使用以下程式碼片段:
C++
C#
交錯模式#
由於在交錯模式 (interleaved mode) 下,所有相機的感光元件時序必須完全相同,因此請將 fps_max 設定為任一相機的最大影格率值。
連續模式#
您可以計算最大影格率 fps_max 在連續模式 (consecutive mode) 下的數值,如以下虛擬碼片段所示:
fmax_min = min(fps_max[0], ... ,fps_max[n-1])
t_total = 0
for i = 0 to n-1
t_total = t_total + t_frame[i] - t_startup[i] - t_reset[i] - t_read[i]
endif
t_total = t_total + t_startup[0] + t_reset[0]
fps = 1e6 / t_total
fps_max = min(fps, fmax_min)
計算觸發偏移量並設定 Acquisition Start 時間#
各別 Acquisition Start 時間需要錯開的時間量取決於感光元件時序,以及使用的是交錯式還是連續式 Synchronous Free Run 模式。
Acquisition Start 時間 t_acq_start[i] 應設定為未來某個時間點,以確保在您的應用程式設定好所有相機並建立擷取迴圈 (grab loop) 之前,沒有相機開始進行擷取。設定單一相機大約需要預留 400 毫秒。
以下虛擬碼片段說明瞭如何計算相機的觸發偏移量 (trigger offsets) 以及如何設定 Acquisition Start 時間。
所使用變數的含義:
n:相機數量。camera[]:相機陣列。t_0:目前的 PTP Timestamp [ns]。如果僅連接相機,則該 Timestamp 會計算自主設備開機以來的時脈週期數。這意味著時間刻度是任意的、相對的,且僅在此網路中有效。若要取得絕對時間刻度,請連接與協調世界時 (例如 TAI 或 UTC) 同步的設備。fps_max:最大可能影格率 [Hz]。trigger_offset:相較於前一台相機,相機觸發被延遲的時間量。t_acq_start[]:Acquisition Start 時間 [ns]。t_safety:為補償時基抖動 (jitter) 而需額外延遲擷取的時間量 [µs]。建議值:250 µs。
camera[0].TimestampLatch.Execute()
t_0 = camera[0].TimestampLatchValue.GetValue()
t_acq_start[0] = t_0 + n * 400 * 1000000
for i = 0 to n-1
camera[i].SyncFreeRunTimerStartTimeLow.SetValue(t_acq_start[i] & 0xffffffff)
camera[i].SyncFreeRunTimerStartTimeHigh.SetValue(t_acq_start[i] >> 32)
camera[i].SyncFreeRunTimerUpdate.Execute()
camera[i].SyncFreeRunEnable.SetValue(true)
if i < n-1
if interleaved_mode
trigger_offset = 1000 * (t_safety + t_exp[i])
else
trigger_offset =
1000 * (t_safety + t_frame[i] - t_read[i] - t_startup[i+1] - t_reset[i+1]
endif
t_acq_start[i+1] = t_acq_start[i] + trigger_offset
endif
endfor