C/C++プログラマーのためのクイックスタートガイド

Aurora Vision Studioは、以前にC++でマシンビジョンアプリケーションを作成していた開発者によって作成されました。この製品を作成した目的は、この作業を効率的に行うことであり、もう一つの目標は、可能な限りの機能と柔軟性を保持することでした。ただし、単純に低レベルのC++ライブラリのためのグラフィカルインターフェースを作成したわけではありません。私たちは、完全に異なるプログラミングパラダイムであるデータフローモデルを適用しました。これは、機能と開発効率の最適なバランスを見つけるためです。Aurora Vision Studioでのプログラミングは、電気回路を設計するようなものです。ステートメントや変数はなく、PCBボード上に存在しないのと同じです。 したがって、C++からAurora Vision Studioへの直接的な移行はありません。効果的に作業するためには、C++ではなくデータフローで考える必要があります。データフロー側からの自動C++コード生成は引き続き可能ですが、これは一方通行の変換と見なす必要があります。データフロープログラムのレベルでは、ステートメントもifforもありません。

では、ループ、条件、変数などのプログラム構造に慣れ親しんでいる場合、プログラムを構築する方法はどうすればよいでしょうか?まず第一に、与えられたタスクをより高いレベルから見る必要があります。マシンビジョンアプリケーションでは通常、画像取得から検査結果でデジタル出力を設定するまでの単一の単純なループしかありません。入れ子になったループは避け、代わりに配列接続を使用することが強く推奨されます。これは、低レベルのプログラミング言語のfor-eachループのデータフロー版です。条件については、if-then-else構造はもはや存在しません。代わりに、条件接続(データが流れるかどうか)、またはより複雑なタスクの場合はVariant Macrofiltersを使用します。 前者は、データが利用できないときにプログラムの一部をスキップするために使用でき、後者は、複数の代替実行パスを持つサブプログラムを作成できます。最後に、変数はありませんが、データは(通常、名前のない)接続を介して送信されます。また、グローバルパラメーターは、プログラムのさまざまな場所で使用される必要がある名前付き値を作成するために使用でき、マクロフィルターレジスタは、プログラムループの連続したイテレーション間で情報を保存し、複雑な動作をプログラム化するために適用できます。

注意してください。経験豊富なC++プログラマーであっても、Aurora Vision Studioに切り替えると、マシンビジョンプロジェクトでの作業が大幅に向上します。なぜなら、C++は複雑な制御フローロジックを持つ複雑なプログラムを作成するための最高の汎用言語として設計されているからです。 一方、Aurora Vision Studioは特定のフィールド向けに設計され、主にマシンビジョンエンジニアにとって重要なことに焦点を当てています。それは、さまざまなツールやパラメーターの組み合わせを素早く試す能力と、結果を即座に視覚化する能力です。

以下は要約です:

C++ Aurora Vision Studio ノート
条件文
if文)
条件付き実行, バリアントステップ Aurora Vision Studioは制御フローのパラダイムに基づいていません。その代わり、データフロー構造を使用して非常に類似した動作を得ることができます。
条件接続は、データが利用できないときにプログラムの一部をスキップするために使用できます。バリアントマクロフィルターは、複数の代替実行パスを持つサブプログラムです。
以下も参照してください。 オブジェクトのソート、分類、選択
ループ
for文やwhile文)
配列接続, タスク Aurora Vision Studioは制御フローのパラダイムに基づいていません。その代わり、データフロー構造を使用して非常に類似した動作を得ることができます。
配列接続はfor-eachスタイルのループに対応し、タスクマクロフィルターは任意の入れ子ループを持つ複雑なプログラムを作成するために使用できます。
変数 接続,
グローバルパラメータ,
レジスタ
データフロープログラミングでは副作用はありません。計算されたデータはフィルターの出力に保存され、接続を介してフィルター間で転送されます。グローバルパラメーターは、プログラムのさまざまな場所で使用される名前付き値を定義するために使用でき、マクロフィルターレジスタは連続するイテレーション間で情報を保存することができます。
コレクション
(配列、std::vectorなど)
Aurora Vision Studioにおける配列 配列型はC++のstd::vector<T>型に非常に類似しています。これがAurora Vision Studioで唯一のコレクション型です。
テンプレート ジェネリックフィルタ 多種多様なタイプの配列(例:RegionArray、IntegerArrayArrayなど)が存在するため、異なるタイプの配列を変換するフィルターも必要です。C++では、テンプレートメタプログラミングとそれに基づいたSTLライブラリがあります。Aurora Vision Studioでは、タイプパラメーターをフィルターに追加する際に定義する必要がある非常にシンプルなテンプレートに非常に似た汎用フィルターがあります。
関数、メソッド マクロフィルタ マクロフィルターは、C++の関数に非常に似たサブプログラムです。注目すべき違いの1つは、マクロフィルターは再帰的になれません。これにより、プログラムが理解しやすく、分析しやすくなります。
GUIライブラリ(MFC、Qt、WxWidgetsなど) HMIデザイナー より複雑なGUIが必要な場合、Aurora Vision Studioで作成したアルゴリズムを、C++で書かれたGUIにC++コードジェネレーターを介して統合できます。 以下も参照してください。 HMIイベントの処理
静的、動的ライブラリ モジュール 大規模なプロジェクトでは、より良い組織が必要です。C++でライブラリを作成し、多くの異なるプログラムで使用できるようにすることができるのと同様に、Aurora Vision Studioではモジュール(マクロフィルターのライブラリ)を作成できます。
ブレークポイント 「現在のマクロフィルターを反復」コマンド(Ctrl+F10) マクロフィルター内に副作用がないため、任意の場所にブレークポイントを設定する必要はありません。ただし、プログラムを選択したマクロフィルターの末尾まで実行することができます。単にプログラムエディターでこのマクロフィルターを開き、「現在のマクロフィルターを反復」コマンドを使用します。プログラムは選択したマクロフィルターインスタンスの末尾に到達すると一時停止します。
スレッド Aurora Vision Studioにはスレッドがありません。代わりに、フィルターは内部で可能な限り多くのプロセッサを利用し、HMI(エンドユーザーインターフェース)は自動的に並行して実行され、プログラムループと同期されます。
例外 ドメインエラーの取り扱い, 条件付き接続 ドメインエラーは、プログラムの実行中に遭遇した予期しない条件を示します。プログラムを停止させるため、それらが発生しないようにすることが非常に重要です。ただし、開発中には、修正する必要のある情報を提供します。 予期しない条件が注意深いプログラム構築でも容易に予測できない場合は、条件付き出力が使用され、実行の失敗を示すためにNil値が返されます。

C++との相互運用性

データフロー型プログラミングモデルでさえ、最も難しい機械ビジョンタスクを解決できると言っても、実際のところ、ほとんどの場合、機械ビジョンソリューションをより大きなシステムに統合する必要があります。この統合には、C++または.NETプログラミングが最も頻繁に必要とされます。Aurora Vision Studioには、それを可能にするいくつかの機能が付属しています:

その他の注意事項:

FAQ

質問:

EnumerateIntegersLoopなどのフィルターで開始されたループをどのように終了マークするのですか?

回答:

これはC++とは異なる設計です。ループは、プログラムの論理的な部分であるTaskマクロフィルター全体を通過します。本当にネストされたループが必要な場合(これは典型的な機械ビジョンプロジェクトではまれです)、ループの全体の本体用にTaskマクロフィルターを作成します。ただし、まず配列接続を検討してください。これにより、明示的なループを作成せずに、単一の画像で検出された多くのオブジェクトを調査することができます。

質問:

ブール値を取り、条件が満たされた場合にのみ次のフィルターを実行するシンプルな「if」フィルターを追加できますか?

回答:

これは制御フロー型プログラミング言語での典型的な構造です。異なるパラダイムを混在させないようにする必要があるため、私たちのソフトウェアを複雑にしすぎることは避けたいと考えています。次のフィルターを条件付きで実行するには、MakeConditionalフィルターを使用して、データを渡します。その方法で使用できる適切なデータがない場合は、バリアントマクロフィルターが別の解決策になるかもしれません。

質問:

変数を作成する方法は?

回答:

データフローには変数はありません。これは、PCB基板上や工場の生産ラインを見たときに変数が見えない理由と同じです。代わりにフローがあり、接続がデータ(またはオブジェクト)を1つの処理要素から別の処理要素に伝達します。ただし、連続する反復の間に情報を保存する必要がある場合は、AddIntegers_OfLoopなどの状態を持つフィルター、マクロフィルターレジスタ、またはブロック内の適切な関数も使用できます。