跳至內容
測試伺服器
開發伺服器

Synchronous Free Run (blaze)#

Synchronous Free Run 功能允許您同時操作處於同一網路中的多台 blaze 相機,而它們的光源不會互相干擾。

使用此功能#

為什麼使用 Synchronous Free Run#

如果您想使用多台 blaze 相機來拍攝同一個場景,則必須錯開各個相機的曝光時間,以便它們的光源不會互相干擾。與環境光類似,各個相機的光源也會導致影像 Quality 降低。

透過使用 PTP,您可以讓一組相機在 Synchronous Free Run 模式下拍攝影像,但曝光會以精確對齊的時間間隔和按時間順序連續開始。這樣一來,一台相機的光線就不會干擾其他相機的量測。

運作原理#

有兩種方法可以設定 Synchronous Free Run。為了協助您決定哪種選項最適合您,您必須了解 blaze 相機在影像擷取方面的一般運作原理。

在擷取影像時,每個影格由八個子影格組成(若啟用了 Fast Mode 則為 4 個子影格)。每個子影格都可以視為獨立的曝光,因為在曝光每個子影格之後,照明會關閉且感光元件會重設。

影格曝光階段#

在曝光期間,會依序進行下列階段:

  • Startup:這發生在第一和第五個子影格之前。
  • Reset:重設感光元件。這發生在擷取每個子影格之前。
  • Exposure:快門開啟且感光元件進行曝光。這適用於每個子影格。
  • Readout:從感光元件讀取在子影格期間收集到的資料。

相機僅在曝光階段發出光線。

下圖顯示影格曝光的不同階段(僅顯示子影格 1、2 和 8)。

影格曝光的階段

Synchronous Free Run#

在 Free Run 模式下操作相機意味著相機使用內部週期性觸發 Timer 來自行觸發。

在 Synchronous Free Run 模式下,相機時脈使用 PTP 進行同步。同步的時脈也會使內部的觸發 Timer 同步。

為 Synchronous Free Run 設定相機時,可以透過為相機指定各自的 Acquisition Start 時間來對齊相機的擷取動作。一旦達到相機的 Acquisition Start 時間(由 SyncFreeRunTimerStartTimeHigh 和 SyncFreeRunTimerStartTimeLow 參數指定),就會啟動內部觸發 Timer,並且相機以固定的影格速率擷取資料。

資訊

可以設定過去的時間作為開始時間。這種情況的處理方式就如同內部 Timer 在過去已經啟動一樣。

資訊

相機不會開始擷取,直到 AcquisitionStart 已發出 command。

同步 blaze 和 ace/ace 2 相機

  • 如果您的應用程式設定包含 ace 相機,則啟動時間必須設定在不久的將來。
  • 如果您的應用程式設定包含 ace 2 相機,則 blaze 相機的啟動時間必須為 0。

有兩種方式可以使用 Synchronous Free Run:

Interleaved Mode#

如果您想要同時操作兩台 blaze 相機,請選擇 interleaved 模式。在此模式下,當一台相機發射光線時,另一台相機則進行感光元件讀取。

Interleaved Synchronous Free Run

資訊

相機的感光元件時序必須完全相同,也就是說,您必須為下列項目設定相同的數值: ExposureTime, FastMode的狀態,以及 HDRMode 參數的狀態。

感光元件時序也取決於 Sensor Readout Time,您無法變更此時間,因為它是感光元件的 Property。不過,Sensor Readout Time 可能會因相機的硬體版本而異。如果是這種情況,請改用 consecutive 模式。

Consecutive Mode#

在大多數情況下,在 interleaved 模式下操作兩台以上的相機並不實際。由於網路封包接連不斷,您很可能會遇到網路封包遺失,進而導致擷取的資料不完整。為了獲得更好的結果,請使用 consecutive 模式,在此模式下,相機會依序連續擷取畫面。

如果您想要同時操作多個具有不同感光元件時序的相機,也必須使用此模式。

Consecutive Synchronous Free Run

為了將可達到的幀率最大化,相機的 Acquisition Start 時間可以設定在先前相機的讀取階段中。

設定相機#

資訊

pylon Supplementary Package for blaze 包含 MultiCamHelper C++ library。此 library 是 C++ 範例集合的一部分,位於 MultiCam/MultiCamHelper 資料夾中。

此 library 提供 BlazeSynchronousFreeRunHelper class,Basler 建議使用此 class 來設定多個 blaze 相機以進行 Synchronous Free Run、擷取資料,以及比對按時間順序屬於同一個群組的畫面。如何使用此 class 顯示於 SynchronousFreeRun C++ 範例中。

MultiCamHelper library 也提供 GenericSynchronousFreeRunHelper class,如果您想要同步 blaze 和 2D GigE 相機,這會非常有用。如何使用此 class 由 Multicam/ColorAndDepth 資料夾中的範例進行示範。

如果您使用的不是 C++ 程式語言,或者您不想使用 MultiCamHelper library 提供的 class,本節將說明設定相機進行 Synchronous Free Run 的程序。此程序可用於設定 interleaved 和 consecutive 模式。

使用的變數#
  • t_startup[i]:第 i 個相機的畫面啟動時間持續時間。
  • t_reset[i]:第 i 個相機的重設時間持續時間(重設發生在每個子畫面的開頭)。
  • t_exp[i]:單一子畫面的第 i 個相機 Exposure Time 持續時間。
  • t_read[i]:單一子畫面的第 i 個相機讀取時間持續時間。
  • t_frame[i]:第 i 台相機擷取畫面所有子畫面所需的總時間。

實際值可從相機中讀取。下表列出了您必須讀取的參數名稱:

變數 相機參數
t_startup StartupTime
t_reset ResetTime
t_exp ExposureTime
t_read ReadoutTime
t_frame FrameDuration

上述所有相機參數傳回的值均以微秒 (µs) 為單位。

若要設定相機並啟動 Synchronous Free Run:

  1. 在每台相機上,啟用 PTP,並等待主時脈選擇完成且時脈充分同步。
    如需詳細資訊,請參閱 Precision Time Protocol (blaze)。

  2. 在每台相機上,為以下項目設定所需的設定: ExposureTime, FastMode的狀態,以及 HDRMode.

    資訊

    為交錯式 Synchronous Free Run 模式設定相機時,您必須為以下項目設定相同的值: ExposureTime, FastMode的狀態,以及 HDRMode.

  3. 計算最大可能幀率 fps_max 如所述 .

  4. 在每台相機上,設定 AcquisitionFrameRateEnable 參數設為 true 透過設定以下項目來指定所需的幀率: AcquisitionFrameRate 將參數設為小於或等於以下數值的值: fps_max.

    資訊

    您必須在所有相機上指定相同的幀率。

  5. 對於每台相機,計算所需的觸發偏移,並如下方所述設定產生的 Acquisition Start 時間。

  6. 準備應用程式的擷取迴圈。

  7. 在每台相機上,發出 StartAcquisition 命令。

  8. 從每台相機擷取影像。

決定最大影格速率#

當使用連續式 Synchronous Free Run 時,每台相機的最大幀率會受到相機數量和每台相機畫面持續時間的限制。

當使用交錯式 Synchronous Free Run 時,相機可以最高可能的幀率運作。

在下文中, fps_max[i] 表示第 i 台相機 AcquisitionFrameRate 參數允許的最大值。若要讀取 fps_max[i] 中,以了解 相機 i 使用 pylon SDK 的 API,您可以利用以下程式碼片段:

C++

auto max = camera[i].AcquisitionFrameRate.GetMax();

C#

var max = camera[i].Parameters[PLBlaze.AcquisitionFrameRate].GetMaximum();

Interleaved Mode#

由於在交錯模式(interleaved mode)下,所有相機的感光元件時序必須完全相同,因此請將 fps_max 設為兩台相機中的最大影格率(frame rate)值。

Consecutive Mode#

您可以計算最大影格率 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 ms 的時間。

以下虛擬程式碼片段說明了如何計算相機的觸發偏移量(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