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を使用して同期されます。同期されたクロックにより、内部トリガータイマーも同期されます。
同期フリーラン用にカメラを設定する場合、カメラの個別の取得開始時刻を指定することにより、カメラの取得を調整できます。カメラの取得開始時刻に達すると、内部トリガータイマーが開始され、カメラは固定フレームレートでデータを取得します。
情報
過去の開始時刻を設定することができます。この場合、内部タイマーが過去に開始されたかのように扱われます。
情報
[AcquisitionStart
]コマンドが発行されるまで、カメラは取得を開始しません。
同期フリーランを使用する方法には、次の2つがあります。
インターリーブモード#
2台のblazeカメラを同時に操作する場合は、[interleaved]モードを選択します。このモードでは、他のカメラがセンサーの読み出しを実行している間、カメラは発光します。
情報
カメラのセンサータイミングは同一である必要があります。つまり、[ExposureTime
]、[FastMode
]、および[HDRMode
]のパラメーターに同じ値を設定する必要があります。
センサーのタイミングは、センサーの読み出し時間によっても決定されます。これは、センサーのプロパティであるため、変更できません。ただし、センサーの読み出し時間は、カメラのハードウェアリビジョンによって異なる場合があります。この場合は、代わりに[consecutive]モードを使用します。
連続モード#
ほとんどの場合、[interleaved]モードで3台以上のカメラを操作することは実用的ではありません。ネットワークパッケージが密接に連続するため、ネットワークパッケージがドロップされ、データの取得が不完全になる可能性があります。より良い結果を得るには、カメラが次々にフレームを連続して取得する[consecutive]モードを使用してください。
このモードは、センサーのタイミングが異なる複数のカメラを同時に操作する場合にも使用する必要があります。
達成可能なフレームレートを最大化するために、カメラの取得開始時刻を、前のカメラの読み出しフェーズの時刻に設定できます。
カメラの設定#
情報
blaze用のpylon補足パッケージには、MultiCamHelper C++ライブラリーが含まれます。このライブラリーはC++サンプルコレクションの一部であり、MultiCam/MultiCamHelperフォルダーにあります。
ライブラリーはBlazeSynchronousFreeRunHelper
クラスを提供します。同期フリーラン用、データのキャプチャー用、および時系列的に同時に所属するフレームのマッチング用には、いくつかのblazeカメラを設定することをBaslerはお勧めします。このクラスの使用方法は、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番目のカメラの露出時間の長さ。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
]の設定を行います。情報
[Interleaved synchronous free run]モード用にカメラをセットアップする場合は、[
ExposureTime
]、[FastMode
]、および[HDRMode
]に同じ値を設定する必要があります。 -
下記の説明に従って、可能な最大のフレームレート[
fps_max
]を計算します。 -
各カメラで、[
AcquisitionFrameRateEnable
]パラメーターを[true
]に設定し、[AcquisitionFrameRate
]パラメーターを[fs_max
]以下の値に設定することにより、目的のフレームレートを指定します。情報
すべてのカメラで同じフレームレートを指定する必要があります。
-
カメラごとに、必要なトリガーオフセットを計算し、結果の取得開始時刻を以下に説明するとおりに設定します。
-
アプリケーションのグラブループを準備します。
-
各カメラで、
StartAcquisition
コマンドを発行します。 -
各カメラから画像をグラブします。
最大フレームレートの決定#
連続同期フリーランを使用する場合、カメラあたりの最大フレームレートは、カメラの数と各カメラのフレーム持続時間によって制限されます。
[interleaved synchronous free run]を使用する場合、カメラは可能な限り最大のフレームレートで操作できます。
次の図で、fps_max[i]
は、i番目のカメラの[AcquisitionFrameRate
]パラメーターの最大許容値を示しています。pylon SDKのAPIを使用して、カメラi
のfps_max[i]
を読み取るために、次のコードスニペットを使用できます。
C++
auto max = camera[i].AcquisitionFrameRate.GetMax();
C#
var max = camera[i].Parameters[PLBlaze.AcquisitionFrameRate].GetMaximum();
インターリーブモード#
[interleaved]モードでは、センサーのタイミングはすべてのカメラで同じである必要があるため、[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]モードのどちらを使用するかによって異なります。
アプリケーションがすべてのカメラを構成してグラブループを設定する前に、カメラが取得を開始しないように、取得開始時刻t_acq_start[i]
を将来のある時点に設定する必要があります。1台のカメラを構成するには、約400ミリ秒を考慮する必要があります。
次の擬似コードスニペットは、カメラのトリガーオフセットを計算する方法と、取得開始時刻を設定する方法を示しています。
使用される変数の意味:
n
:カメラの数。camera[]
:カメラの配列。t_0
:現在のPTPタイムスタンプ[ns]。fps_max
:可能な最大フレームレート(Hz)。trigger_offset
:カメラのトリガーが前のカメラと比較して遅延する時間。t_acq_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