Synchronous Free Run(blaze)#
機能を使用する#
Synchronous Free Runを使用する理由#
複数のblazeカメラを使用して同じシーンを撮影する場合は、個々のカメラの露光をずらして、光源が互いに干渉しないようにする必要があります。環境光と同様に、個々のカメラの光源も画質が低下する原因となります。
PTPを使用すると、カメラのグループに同期フリーランで画像を撮影させることができますが、露光は正確な時間間隔で時間軸に沿って連続的に開始されます。このように、1台のカメラの光は、他のカメラの測定に干渉しません。
仕組み#
同期フリーランを設定する方法は2つあります。どちらのオプションが最適かを判断するには、画像取得に関してblazeカメラの動作原理の概要を理解する必要があります。
画像を取得する際に、各フレームは8つのサブフレームで構成されます(Fast Modeが有効な場合は4つのサブフレーム)。各サブフレームの露光後に照明がオフになり、センサーがリセットされるため、各サブフレームは個別の露光と見なすことができます。
フレーム露光フェーズ#
露光中は、次のフェーズが実行されます。
- Startup:これは、最初と5番目のサブフレームの前に発生します。
- Reset:センサーがリセットされます。これは、各サブフレームが取得される前に発生します。
- Exposure:シャッターが開き、センサーが露出します。これは各サブフレームで発生します。
- Readout:サブフレーム中に収集されたデータがセンサーから読み出されます。
カメラは露出段階でのみ発光します。
次の図は、フレーム露光のさまざまなフェーズを示しています(サブフレーム1、2、8のみを表示)。
Synchronous Free Run#
フリーランモードでカメラを操作するということは、カメラが内部の定期的なトリガータイマーを使用してそれ自体をトリガーすることを意味します。
同期フリーランモードでは、カメラクロックはPTPを使用して同期されます。同期されたクロックにより、内部トリガータイマーも同期されます。
Synchronous Free Run 用にカメラを設定する場合、カメラごとの個別の Acquisition Start 時刻を指定することで、カメラの撮像を同期させることができます。カメラの Acquisition Start 時刻( SyncFreeRunTimerStartTimeHigh および SyncFreeRunTimerStartTimeLow パラメータで指定)に到達すると、内部トリガーの Timer が開始され、カメラは固定フレームレートでデータを取得します。
情報
過去の開始時刻を設定することができます。この場合、内部タイマーが過去に開始されたかのように扱われます。
情報
カメラは、 AcquisitionStart コマンドが実行されるまで撮像を開始しません。
blaze および ace/ace 2 カメラの同期
- アプリケーションのセットアップに ace camera が含まれている場合、開始時刻は近い将来の時刻である必要があります。
- アプリケーションのセットアップに ace 2 camera が含まれている場合、blaze カメラの開始時刻は 0 である必要があります。
同期フリーランを使用する方法には、次の2つがあります。
インターリーブモード#
2台のblazeカメラを同時に操作する場合は、[interleaved]モードを選択します。このモードでは、他のカメラがセンサーの読み出しを実行している間、カメラは発光します。
情報
カメラのセンサタイミングは同一である必要があります。つまり、次の項目に同じ値を設定する必要があります。 ExposureTime, FastModeおよび HDRMode パラメータ。
センサーのタイミングは、センサーの読み出し時間によっても決定されます。これは、センサーのプロパティであるため、変更できません。ただし、センサーの読み出し時間は、カメラのハードウェアリビジョンによって異なる場合があります。この場合は、代わりに[consecutive]モードを使用します。
連続モード#
ほとんどの場合、[interleaved]モードで3台以上のカメラを操作することは実用的ではありません。ネットワークパケットが密接に連続するため、ネットワークパケットがドロップされ、データの取得が不完全になる可能性があります。より良い結果を得るには、カメラが次々にフレームを連続して取得する[consecutive]モードを使用してください。
このモードは、センサーのタイミングが異なる複数のカメラを同時に操作する場合にも使用する必要があります。
達成可能なフレームレートを最大化するために、カメラの取得開始時刻を、前のカメラの読み出しフェーズの時刻に設定できます。
カメラの設定#
情報
blaze用のpylon補足パッケージには、MultiCamHelper C++ライブラリーが含まれます。このライブラリーはC++サンプルコレクションの一部であり、MultiCam/MultiCamHelperフォルダーにあります。
ライブラリには、複数の blaze カメラを Synchronous Free Run 用に設定し、データの取得や、時間的に対応するフレームのマッチングを行うために Basler が推奨する BlazeSynchronousFreeRunHelper クラスが用意されています。このクラスの使用方法については、 SynchronousFreeRun C++ サンプルを参照してください。
MultiCamHelperライブラリーには、GenericSynchronousFreeRunHelperクラスも用意されています。このクラスは、blazeカメラと2D GigEカメラを同期する場合に便利です。このクラスの使用方法は、Multicam/ColorAndDepthフォルダーのサンプルで示されています。
C++以外のプログラミング言語を使用する場合、またはMultiCamHelperライブラリーで提供されるクラスを使用しない場合のために、このセクションで、カメラを同期フリーラン用に設定する手順について説明します。この手順は、[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)で値を返します。
カメラを設定し、同期フリーランを開始するには:
-
各カメラで、[PTP]を有効化し、マスタークロック選択が実行され、クロックが十分に同期されるまで待ちす。
詳細については、「Precision Time Protocol(blaze)」を参照してください。 -
各カメラで、次の項目に必要な設定を行います。
ExposureTime,FastModeおよびHDRMode.情報
インターリーブ Synchronous Free Run モード用にカメラを設定する場合、次の項目に同じ値を設定する必要があります。
ExposureTime,FastModeおよびHDRMode. -
記載されている手順に従って、最大許容フレームレート
fps_maxを計算します。 以下. -
各カメラで、
AcquisitionFrameRateEnableパラメータをtrueを設定し、AcquisitionFrameRateパラメータに以下以下の値を設定して、希望のフレームレートを指定します。fps_max.情報
すべてのカメラで同じフレームレートを指定する必要があります。
-
カメラごとに、必要なトリガーオフセットを計算し、結果の取得開始時刻を以下に説明するとおりに設定します。
-
アプリケーションのグラブループを準備します。
-
各カメラで、次のコマンドを実行します。
StartAcquisitionコマンド。 -
各カメラから画像をグラブします。
最大フレームレートの決定#
連続同期フリーランを使用する場合、カメラあたりの最大フレームレートは、カメラの数と各カメラのフレーム持続時間によって制限されます。
[interleaved synchronous free run]を使用する場合、カメラは可能な限り最大のフレームレートで操作できます。
以下では、 fps_max[i] は、i番目のカメラの最大許容値を示します AcquisitionFrameRate パラメータ。読み出すには fps_max[i] のために カメラ i pylon SDKのAPIを使用して、次のコードスニペットを使用できます。
C++
C#
インターリーブモード#
インターリーブモードではすべてのカメラでセンサーのタイミングが同一である必要があるため、設定してください fps_max どちらかのカメラの最大フレームレート値になります。
連続モード#
最大フレームレートを計算できます fps_max 次の疑似コードスニペットに示すように、連続モードで:
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)
トリガーオフセットの計算と取得開始時刻の設定#
個々の取得開始時刻をずらす必要がある時間は、センサーのタイミング、および[interleaved]モードと[consecutive synchronous free run]モードのどちらを使用するかによって異なります。
Acquisition Startの時刻 t_acq_start[i] アプリケーションがすべてのカメラの設定とグラブループのセットアップを完了する前に、どのカメラもAcquisition Startを開始しないようにするために、将来のどこかの時点に設定する必要があります。1台のカメラの設定には約400msを見込む必要があります。
次の擬似コードスニペットは、カメラのトリガーオフセットを計算する方法と、取得開始時刻を設定する方法を示しています。
使用される変数の意味:
n: カメラの数。camera[]: カメラの配列。t_0: 現在の PTP Timestamp [ns]。カメラのみが接続されている場合、タイムスタンプはマスターデバイスの電源が入ってからのティック数をカウントします。つまり、タイムスケールは任意であり、相対的であり、このネットワーク内でのみ有効です。絶対的なタイムスケールが必要な場合は、協定世界時(TAIやUTCなど)に同期されたデバイスを接続してください。fps_max: 最大可能なフレームレート [Hz]。trigger_offset: 前のカメラと比較して、カメラのトリガーが遅延する時間。t_acq_start[]: Acquisition Startの時刻 [ns]。t_safety: ジッターを補正するために、取得をさらに遅延させる時間 [µ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