GigEVisionカメラとの連携
イントロダクション
以下のガイドでは、Aurora Vision Studio で GigE 準拠のカメラを活用する方法について説明します。
このガイドは GigE プロトコルに焦点を当てていますが、ほとんどの内容はわずかな変更を加えることで異なるカメラプロトコル、特に GenICam にも適用できます。
基本的な画像取得
カメラが Aurora Vision Studio で利用される最も単純なシナリオは、連続同期取得です。
連続とは、カメラが自分自身で新しい画像を取得することを意味します - トリガーをかける必要はありません。
同期とは、プログラムが新しい画像が取得されるまで待機することを意味します - 新しい画像が取得されない限り、反復は終了しません。
このような取得を行う手順は以下の通りです:
- カメラをコンピューターまたはネットワークスイッチに接続します。カメラを Power-Over-Ethernet(PoE)経由で給電する場合は、その方法で電力供給が可能なデバイスに接続されていることを確認してください。
- Aurora Vision Studio の新しいプログラムにフィルター GigEVision_GrabImage を追加します。
- inAddress 入力のエディターを開き、カメラのアドレスを設定します。
- カメラが警告記号で表示されている場合、それはコンピューターのサブネットにないことを意味します。これは一時的な IP アドレスをカメラに割り当てることで解決できます。
- カメラが同じサブネットにある場合、その設定を変更できます(たとえば、静的 IP を変更することができます)。
- カメラが接続されているが検出されない場合、ウィンドウを開くことができます(a のポイントから)、カメラの MAC アドレスを手動で入力し、別の IP アドレスを割り当てます。このメニューは [ツール] メニューから開くことができます。
- これでプログラムを実行できます。outImage をプレビューすると、カメラからの表示が表示されます。
カメラパラメータの変更
SetParameters フィルターを使用してカメラパラメーターをプログラムで変更することができます。これを実証するために、前のプログラムを拡張します。
- GigEVision_SetRealParameter フィルターを追加し、その inAddress を GigEVision_GrabImage と同じアドレスに設定します。
- パラメーター名を指定します。名前がわからない場合は、GigEVision デバイスツリーを通じて選択できます。これを行うには、inParameterName の近くの "..." ボタンをクリックします。
- ここでは、短い説明付きで利用可能なすべてのカメラパラメーターが表示されます。Exposure Time (Abs) などの名前のパラメーターを選択します。これは、カメラの露出時間(マイクロ秒単位)を制御し、そのタイプは IFloat です。
- パラメーターが見つからない場合は、検索機能(拡大鏡アイコン)を使用してみてください。
- フィルターのタイプは、パラメーターのタイプと一致する必要があります。ただし、IFloat は Aurora Vision Studio では Real として表されます。
- 一部の高度なパラメーターは、Visibility が正しいレベルに設定されていないと表示されない場合があります。
- パラメーター ExposureAuto が Off に設定されていることを確認してください。そうでない場合、露出値を手動で変更することはできません。
- ウィンドウを閉じる前に、露出時間の最小値と最大値に注意してください。パラメーターを選択した後、inValue を最も低い許容値に設定します。
- プログラムを実行します。実行中に、inValue 入力を着実に増やしてください。カメラ画像がどんどん明るくなるのがわかります。
- 可容範囲を超えないようにしてください。入力 inVerify が True に設定されている場合、エラーが発生します。
- GigEVision_GetParameter フィルターを使用してパラメーターの値をチェックすることもできます。同じ名前を前のフィルターと指定して、Float のバリアントを追加してみてください。
- いつも読み取られる値が SetParameter の inValue と等しくないことに気付くかもしれません。これは、カメラがそれを変更するためです。
GigEVision_GetParameter フィルターを使用すると、編集可能なパラメーターだけでなく、読み取り専用のパラメーターも確認できます。たとえば、カメラが露出を自動調整するように設定されている場合、現在の露出時間を知ることが役立つ場合があります。別の例としては、最大画像サイズなどのデバイス固有の情報を保持するパラメーターを読み取ることが挙げられます。
一部の簡単なテストのためには、GigEVision ツリーでパラメーターを直接設定することもできます。
ほとんどのパラメーターは揮発性メモリに格納されており、したがって、カメラの電源を切断した後にリセットされます。デバイスユーザー ID など、非揮発性メモリに格納される一部のパラメーターもありますが、通常、これらは取得に直接影響しません。
このため、デフォルトと異なる値を持つすべてのパラメーターがプログラムで設定されるようにプログラムを設計することが推奨されます。
取得の開始と停止
重要なことは、取得が実行されている間にすべてのパラメーターを変更できるわけではないということです。一部のパラメーターは、取得を停止してから再開する必要があります。
- プログラムを実行してデバイスツリーを開きます(ツール -> GigE Vision デバイスの管理...)。Width パラメーターを見つけます。実行中の取得のため、保存ボタンがグレーアウトしていることに注意してください。
- 別の GigEVision_SetIntegerParameter フィルターを追加し、Width パラメーターを選択します。グレーアウトされていることに気付くかもしれません。
- パラメーターを選択する際に情報タブを確認してください。例えば、インクリメントなど、可能な値に関する追加情報が表示される場合があります。一部のパラメーターは、2または4などの特定の数値の倍数でのみ値を取ることができます。
- inValue に 240 と入力してプログラムを実行します。パラメーターが書き込み不可であることを示すエラーが発生します。
- 前の Set フィルターの前に GigEVision_StopAcquisition を追加してプログラムを再実行します。
- パラメーターがエラーなしで設定され、出力画像が小さくなります。
Width パラメーターは、取得が実行されている間は書き込み不可でした。取得を停止してからパラメーターを変更することで、書き込み可能になりました。
取得を明示的に停止するフィルターがある一方で、明示的に開始するフィルターはありません。 GigEVision_GrabImage は実行中の取得を使用しようとしますが、実行中の取得がない場合は新しい取得を開始します。
これはシンプルなプログラムでは許容されますが、取得の状態がプログラムによって制御される場合は避けるべきです。
これで、この章で追加されたフィルターから適切なプログラムを作成します。
- まず、この章で追加されたフィルターを削除します。
- 残りのフィルターを選択し、それらからタスクマクロフィルター(MainLoopと呼ばれる)を抽出します。これがメインの取得ループになります。
- INITIALIZE セクションの MainLoop の前に、InitializeCamera という新しいステップマクロフィルターを作成します。
- InitializeCamera に、次の 3 つのフィルターを追加します GigEVision_StopAcquisition、GigEVision_SetIntegerParameter(Width パラメーターを選択)、GigEVision_StartAcquisition。
- 幅を可能な限り大きな値に設定します。
- 任意のフィルターの inAddress を上部バーにドラッグして、新しい入力を作成します。その後、同じタイプの出力を追加し、それを入力に接続します。
- 1 レベル上に移動し、outAddress 出力を MainLoop フィルターにドラッグして新しい入力を作成します。
- このフィルター内部で、新しく作成した入力をすべての GigE フィルターに接続します。
- これで、プログラム全体のすべての GigE フィルターが同じカメラアドレスを共有します。
- 最終的なプログラムは次のようになります:
これで、プログラムは 2 つの部分に分かれます。最初の部分は一度だけ実行され、その後、プログラムは MainLoop に入り、プログラムが停止するまで連続して実行されます。
取得中に変更できるパラメーターは、取得が停止されていることが保証されている InitializeCamera フィルターで設定されます。
他のすべてのパラメーターは MainLoop で設定されます。
実際のアプリケーションでは、すべてのパラメーターを実行時に変更する必要はありません。それでも、パラメーターは頻繁に変更されることはありません。たとえば、カメラをトリガーモードで連続して実行するかどうかを指定する場合、それは一度だけ行われるでしょう(取得中に設定できますが)。
露出時間は複数回変更される可能性があります。
一度だけ設定されるパラメーターがあっても、それが取得を停止する必要があるかどうかに関係なく、それらすべてのパラメーターを一つのマクロフィルター(InitializeCamera のようなもの)に配置するのが良い方法です。
時折変更されるパラメーターは、変数マクロフィルターに設定されるべきです。
これは時間の節約に役立ちます。パラメーターを同じ値に設定することはあまり時間を取りません(Aurora Vision Studio は前の値をキャッシュし、同じ値を再送信するのを避けます)。しかし、多くのパラメーターがある場合、それが積み重なります。また、一度だけのパラメーターが専用のフィルターにある方が直感的です。
カメラが Aurora Vision Studio でどのように動作するかに注意することも重要です。取得が開始されると、Aurora Vision Studio はメモリに入力フレームをバッファリングするバックグラウンドスレッドを作成します。このスレッドは、取得が停止されるか、アプリケーションが取得を開始したタスクを終了するまで継続します。
たとえば、InitializeCamera がタスクであり、ステップマクロフィルターではない場合、そのタスクを終了すると取得が停止し、MainLoop で再開する必要があります。
また、カメラのアドレスをパラメーターとして渡す代わりに、グローバルパラメーターに入れることもできます。
トリガーモードの変更 - 基本
ほとんどのカメラのデフォルトモードは連続取得ですが、非常にしばしば特定の信号、つまりトリガー後に新しい画像のみを取得する方が望ましい場合があります。
取得フレームの時間をより細かく制御できるだけでなく、より頻繁な取得はより小さな帯域幅を必要とします。
トリガー取得をデモンストレーションするために、現在のプログラムを使用します。
プログラムを実行し、プレビューにカメラ画像が表示されていることを確認してください。
- GigeVision デバイスツリーを開き、Trigger Mode パラメーターを見つけます。それを On に設定します。また、Trigger Selector が Frame Start に設定されていることを確認してください。
- カメラによって新しい画像が取得されないことに気付くでしょう。
- Trigger Source パラメーターを見つけ、それを Software に設定します。
- ソフトウェアトリガーを生成するコマンド(コマンドには雷ボルトアイコンが付いています)を見つけて、それを実行します。
- カメラによって新しい画像が取得されます。
外部トリガー(たとえば、PLCからの出力)を持つ場合、適切なトリガーソースを選択する必要があります。たとえば、Line1 などです。
カメラが期待する信号と一致することを確認する必要があるかもしれません。 Trigger Activation パラメーターは、カメラがどの値を探すかを指定します。
トリガーモードの変更 - 高度な設定
非常に頻繁に、トリガーのプロパティをプログラムから直接制御したいと思うことがあります。たとえば、プログラムの一部でカメラをトリガーしたい場合と、別の部分で画像を連続して取得したい場合があります。または、プログラムの状態に応じて異なるソースからカメラをトリガーする必要があるかもしれません。
取得中にトリガーのパラメータを変更することができます。したがって、それらをオンザフライで変更することが可能です。
今度は、より高度なプログラムを準備します。このプログラムはカメラを初期化し、プログラムが実行されている間にHMIからカメラのトリガーモードや露光時間を変更できるようにします。
- カメラがトリガーソースとしてソフトウェアを使用するように設定されることを確認するために、InitializeCamera(GigEVision_StopAcquisitionの前)にGigEVision_SetEnumParameterフィルターを追加します。デバイスマネージャーを介してTriggerSourceパラメーターを選択し、inValueをSoftwareに設定します。
- 今度は、パラメーターをExposureAutoに変更し、その値をOffに設定して、前のステップを繰り返します。
- 異なるカメラごとに異なる許容最大幅がある場合、デバイス情報のWidthMaxパラメーターを読み取るGigEVision_GetIntegerParameterフィルターを追加することができます。その出力をWidthを変更するフィルターに接続します。
- 次に、MainLoopワーカータスクの内容を変更します。トリガーモードを変更し、ソフトウェアトリガーを実行できるようにします。
- GigEVision_SetEnumParameterのインスタンスを追加します。これをカメラアドレスに接続し、パラメーターとしてTrigger Modeを選択します。
- GigEVision_ExecuteCommandフィルターを追加し、これをカメラアドレスに接続します。デバイスマネージャーを介してTriggerSoftwareパラメーターを選択します。
- これらのフィルターをすべてPROCESSセクションに移動し、ACQUIREセクションにGigEVision_GrabImageを追加します。
- HMIを設計しましょう。この場合、次の機能があります。
- カメラ画像を表示するView2DBox
- トリガーモードを選択するComboBox
- 露光時間を制御するNumericUpDown
- ソフトウェアトリガーを生成するImpulseButton
- その他のコントロールにラベルを付けるLabels
今度は、コントロールを構成します:
- View2DBox - InitialSizeModeをFitToWindowに変更し、GrabImageのoutImageに接続します;
- ComboBox (トリガーモード用)
- outTextをTriggerModeのSet ParameterのinValueに接続します;
- PropertiesのDataカテゴリーでリストを展開し、次の項目を追加します: On、Off;
- Selectionを0に設定します。
- ImpulseButton - outValueをExecuteCommandのinValueに接続します;
- NumericUpDown:
- outValueをExposureTimeのSetParameterのinValueに接続します;
- MinimumとMaximumをデバイスツリーで指定されたパラメーターの値に設定します(このノートを書く際に使用されたカメラの値は35と999985でした)。
プログラムはHMIにカメラ画像を表示するはずです。露光時間を変更することができるはずです。ただし、ComboBoxの値をOnに変更すると、プログラムがフリーズします。トリガーボタンをクリックしても何も起こりません。
- これはGrabImageが同期バリアントであるために発生します。GrabImageを通過してトリガーを実行できないため、無期限に画像を待機します。
- これを解決するために、GigEVision_GrabImage_WithTimeoutにGigEVision_GrabImageのバリアントを変更できます。これにより、プログラムは指定された時間だけ取得を試行します。inTimeoutを100msに設定し、プログラムを再実行します。
今、プログラムはトリガードモードをオンに設定してもフリーズしません。100ms内に画像が取得されない場合、GrabImageはNilを返し、プログラムは次のイテレーションに進みます。そこでカメラをトリガーすることができます。
- 一般的に、カメラが時間の経過とともに画像を取得する場合は、GrabImageのWithTimeoutバリアントを使用するのが良いアイデアです。これにより、いくつかのカメラの問題が発生した場合のプログラムのハングアップが防止され、カメラが正常に動作していない可能性をユーザーに通知できます。ただし、プログラムの残りの部分はNil画像を適切に処理するように設計する必要があります。
今度は、ユーザーが取得をオフにする必要がある他のパラメーターを含む他のパラメーターを変更できるようにプログラムを拡張できます。
- MainLoop内に空のvariantマクロフィルターを作成し、フォークタイプとしてBoolを選択します。カメラアドレスをフィルターにドラッグして入力を作成します。
- フィルターに入り、variant Trueを選択します。StopAcquisitionフィルターを追加し、その後にvariant IntegerとしてWidthパラメーターを選択したSetParameterフィルターを追加します。それらの後にStartAcquisitionフィルターを追加します。すべてのフィルターをカメラアドレスに接続します。
- HMIに2つの新しいコントロールを追加します:
- NumericUpDown - 幅の値を制御するために使用します。そのMinimumとMaximumをカメラのWidthパラメーターのそれぞれの制限に設定します(このノートを書く際に使用されたカメラでは、値は35と999985でした);Incrementもそれぞれの値に設定します。
- 新しい値を確認するためのImpulseButton。
- NumericUpDownのoutValueを新しいSetParameterのinValueに接続します。
- MainLoopに戻り、新しいImpulseButtonのoutValueをvariantマクロフィルターの条件ポートに接続します。
これで、ユーザーが確認ボタンをクリックすると、プログラムはvariantマクロに入り、取得を停止し、幅を変更し、取得を再開します。ユーザーがNumericUpDownボタンを使用して値を変更する場合、値は適切に整列されます。
ただし、ユーザーが入力して値を入力する場合、カメラと動作することが保証されないかもしれません。カメラが受け入れる値を確実にするためのマクロフィルターを設計することは可能ですが、それはこのアプリケーションノートのトピックではありません。
追加の注記
カメラフィルターは配列モードで実行できません(たとえば、カメラアドレスの配列が接続されている場合)。
カメラは外部ハードウェアであるため、Aurora Visionアプリケーションとは無関係のエラー(接続エラーなど)を引き起こす可能性があります。これらのエラーを適切に処理するには、アプリケーションにエラーハンドリング機能を備える必要があります。